마스터-슬레이브 패턴(Master-Slave Pattern)은 분산 시스템 아키텍처에서 자주 사용되는 패턴으로, ‘마스터’와 ‘슬레이브’의 역할을 분리하여 병렬 처리를 통해 작업을 효율적으로 분담하는 구조이다.
주로 데이터 일관성을 유지하면서 작업을 분산할 때, 시스템 성능과 확장성을 높이기 위해 사용된다.
다수의 데이터 연산을 병렬로 처리하거나, 작업의 일관성과 신뢰성을 유지하면서 분산 처리가 필요할 때 마스터-슬레이브 패턴은 다음과 같은 이점을 제공한다:
이 패턴은 대규모 분산 시스템에서 효율적이고 안정적인 작업 수행을 가능하게 한다.
데이터베이스 복제 시스템에서 마스터는 데이터를 읽고 쓸 수 있는 권한을 가지며, 슬레이브는 읽기 전용으로 마스터의 데이터를 복제하여 보관한다.
┌────────┐ ┌──────────┐
│ Master │ ---> │ Slave 1 │
└────────┘ └──────────┘
│ │
│ ---> ┌──────────┐
│ │ Slave 2 │
│ └──────────┘
│ │
│ ---> ┌──────────┐
│ │ Slave n │
│ └──────────┘
▼
이번 예시에서는 마스터가 숫자 배열을 슬레이브들에게 분배하고, 슬레이브가 각각 부분 합을 계산하여 마스터에 결과를 반환하는 방식으로 구현한다.
// Master 클래스: 슬레이브들에게 작업을 분배하고 결과를 수집
import java.util.concurrent.*;
public class Master {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(3);
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Future<Integer> slave1Result = executor.submit(new Slave(numbers, 0, 4));
Future<Integer> slave2Result = executor.submit(new Slave(numbers, 5, 9));
int total = slave1Result.get() + slave2Result.get();
System.out.println("전체 합계: " + total);
executor.shutdown();
}
}
// Slave 클래스: 할당된 부분 합을 계산하여 마스터에게 반환
import java.util.concurrent.Callable;
public class Slave implements Callable<Integer> {
private int[] numbers;
private int start, end;
public Slave(int[] numbers, int start, int end) {
this.numbers = numbers;
this.start = start;
this.end = end;
}
@Override
public Integer call() {
int sum = 0;
for (int i = start; i <= end; i++) {
sum += numbers[i];
}
System.out.println("부분 합계 (" + start + " ~ " + end + "): " + sum);
return sum;
}
}
부분 합계 (0 ~ 4): 15
부분 합계 (5 ~ 9): 40
전체 합계: 55
마스터-슬레이브 패턴(Master-Slave Pattern)은 데이터 일관성을 유지하면서 분산 처리를 통해 효율적인 작업 처리를 지원하는 아키텍처이다.
특히 대규모 데이터 처리 및 복제 시스템에서 매우 유용하다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음