271. 마스터-슬레이브 (Master-Slave) 복제
핵심 인사이트 (3줄 요약)
- 본질: 마스터-슬레이브 복제는 하나의 마스터(Master/Primary) 노드가 모든 쓰기를 담당하고, 하나 이상의 슬레이브(Slave/Replica) 노드가 마스터의 데이터를 복제하여 읽기 분산이 가능하게 하는 복제 아키텍처이다.
- 가치: 읽기 성능을 분산시키고, 마스터 장애 시 슬레이브를 새 마스터로 승격하여 가용성을 높이며, 읽기 집중 워크로드에 효과적이다.
- 융합: 비동기식 복제, 동기식 복제, 장애 복구, 읽기 확장성, CAP 정리와 밀접하게 연관된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
개념 정의
마스터-슬레이브 복제(Master-Slave Replication)는 하나의 마스터(Master 또는 Primary) 노드가 모든 쓰기를 담당하고, 하나 이상의 슬레이브(Slave 또는 Replica) 노드가 마스터의 데이터를 복제하는 아키텍처이다. 슬레이브는 읽기 요청을 처리하여 마스터의 부하를 분산시키고, 마스터 장애 시 슬레이브 중 하나가 새 마스터로 승격될 수 있다.
필요성
단일 데이터베이스 서버는 处理능력의 한계가 있다. 읽기 요청이 쓰기 요청보다 훨씬 많은 경우, 마스터-슬레이브 복제를 통해 읽기 작업을 슬레이브로 분산시켜 성능을 향상시킬 수 있다. 또한 마스터 장애 시에도 슬레이브 중 하나가 서비스를 계속 제공한다.
배경
마스터-슬레이브 복제는 관계형 데이터베이스에서 가장 오래되고 널리 사용되는 복제 아키텍처이다. MySQL, PostgreSQL, Redis, MongoDB 등 대부분의 데이터베이스에서 지원된다.
비유
마스터-슬레이브 복제는음악厅과 같다. 지휘자(마스터)가 모든 연주를 제어하고, 연주자들(슬레이브)이 지휘자의 지시에 따라 같은 음악을 연주한다. 객원(읽기 요청)은 연주자들 중 아무에게나 들을 수 있다. 지휘자가 없을 때, 제1연주자(슬레이브 중 하나)가 지휘자 역할을引き受け公演을 계속한다.
📢 섹션 요약: 마스터-슬레이브 복제는 쓰기는 마스터, 읽기는 슬레이브로 분산하여 성능과 가용성을 높이는 아키텍처이다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
마스터-슬레이브 동작 구조
┌─────────────────────────────────────────────────────────────────────────────┐
│ 마스터-슬레이브 복제 동작 구조 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [쓰기 동작] │
│ │
│ Client │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Master │ │
│ │ (쓰기만) │ │
│ └──────┬──────┘ │
│ │ │
│ │ 쓰기 (INSERT, UPDATE, DELETE) │
│ ▼ │
│ ┌─────────────┐ │
│ │ 로컬 기록 │ (Binlog/Write-Ahead Log) │
│ └─────────────┘ │
│ │
│ [복제 동작] │
│ │
│ Master ──▶ Binlog ──▶ Slave1 │
│ │ │ │
│ │ └──▶ Slave2 │
│ │ │ │
│ │ └──▶ Slave3 │
│ │
│ [읽기 동작] │
│ │
│ Client │
│ │ │
│ ├──▶ Slave1 (읽기) ──▶ 응답 │
│ │ │
│ ├──▶ Slave2 (읽기) ──▶ 응답 │
│ │ │
│ └──▶ Slave3 (읽기) ──▶ 응답 │
│ │
│ [장애 및 복구] │
│ │
│ Master 장애 │
│ │ │
│ ▼ │
│ Slave 중 하나가 새 Master로 승격 │
│ (예: Slave1 → New Master) │
│ │ │
│ ▼ │
│ 나머지 Slave가 새 Master를Follow │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 마스터-슬레이브 복제에서 쓰기는 항상 마스터로만 전달된다. 마스터는 쓰기를 로컬 로그(Binlog/WAL)에 기록하고, 슬레이브가 이 로그를 가져와서 자신의 데이터에 적용한다. 읽기는 모든 슬레이브에서 가능하므로 부하가 분산된다. 마스터 장애 시에는 슬레이브 중 하나가 새 마스터로 승격되어 서비스를 계속 제공한다.
복제 유형
┌─────────────────────────────────────────────────────────────────────────────┐
│ 마스터-슬레이브 복제 유형 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 비동기식 복제 (Asynchronous) │
│ ───────────────────────────────────────── │
│ • 마스터가 쓰기를 로컬에만 기록하고 즉시 성공 반환 │
│ • 슬레이브가 백그라운드에서 로그를 가져와 적용 │
│ • 복제 지연이 발생할 수 있음 │
│ • 예: MySQL 기본 복제 │
│ │
│ 2. 반동기식 복제 (Semi-Synchronous) │
│ ─────────────────────────────────────────── │
│ • 마스터가 슬레이브 중 하나 이상에 복제가 완료될 때까지 대기 │
│ • 적어도 하나의 슬레이브에 복제 보장 → 내구성 향상 │
│ • 예: MySQL Group Replication │
│ │
│ 3. 동기식 복제 (Synchronous) │
│ ───────────────────────────────────── │
│ • 마스터가 모든 슬레이브에 복제가 완료될 때까지 대기 │
│ • 가장 높은 일관성, 가장 낮은 성능 │
│ • 모든 슬레이브 장애 시 복제 불가 │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 복제 지연 (Replication Lag) │ │
│ │ │ │
│ │ 원인: │ │
│ │ • 슬레이브의 처리 속도가 마스터보다 늦음 │ │
│ │ • 대량 쓰기/쿼리에 의한 Binlog 축적 │ │
│ │ • 네트워크 지연 │ │
│ │ │ │
│ │ 해결 방법: │ │
│ │ • 슬레이브 사양 강화 (CPU, DISK) │ │
│ │ • 읽기 분산 최적화 (적합한 슬레이브 선택) │ │
│ │ • 쓰기 분산 (샤딩 등) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
읽기 분산 아키텍처
┌─────────────────────────────────────────────────────────────────────────────┐
│ 마스터-슬레이브 읽기 분산 아키텍처 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [로드 밸런서 기반] │
│ │
│ Client │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Load Balancer│ │
│ └──────┬──────┘ │
│ │ │
│ ┌────┴────┬────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Slave1 │ │ Slave2 │ │ Slave3 │ │
│ │(읽기전용)│ │(읽기전용)│ │(읽기전용)│ │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ [읽기 분산 전략] │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Random: 랜덤하게 슬레이브 선택 │ │
│ │ Round-Robin: 순서대로 슬레이브 선택 │ │
│ │ Least Connections: 연결 수가 가장 적은 슬레이브 선택 │ │
│ │ Latency-based: 응답 시간이 가장 짧은 슬레이브 선택 │ │
│ │ Application-level: 애플리케이션에서 특정 슬레이브 직접 선택 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ 주의: 복제 지연으로 인한 일관성 문제 │
│ ────────────────────────────────────────────── │
│ • 쓰기 직후 읽기: 마스터에서 읽어야 최신 데이터 보장 │
│ • 해결: 쓰기 후 특정 시간 동안 마스터에서 읽기 (Read-after-Write) │
│ • 해결: 슬레이브 복제 상태 확인 후 선택 ( SHOW SLAVE STATUS ) │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 마스터-슬레이브 읽기 분산에서 중요한 점은 복제 지연으로 인한 일관성 문제이다. 쓰기 직후 슬레이브에서 읽으면 최신 데이터가 아닐 수 있다. 이를 해결하기 위해 애플리케이션에서 쓰기 후 일정 시간은 마스터에서 읽도록 하거나, 슬레이브의 복제 상태를 확인하고 선택하는 방법이 있다.
📢 섹션 요약: 마스터-슬레이브 복제는 비동기식, 반동기식, 동기식이 있으며, 읽기 분산 시 복제 지연으로 인한 일관성 문제를 고려해야 한다.
Ⅲ. 구현 및 실무 응용 (Implementation & Practice)
MySQL 마스터-슬레이브 복제
-- MySQL: 마스터-슬레이브 복제 설정
-- [Master 설정]
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
sync_binlog = 1
max_binlog_size = 1G
-- 복제 계정 생성
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- [Slave 설정]
[mysqld]
server-id = 2
relay-log = relay-bin
read_only = 1
log_slave_updates = 1
-- 복제 연결 설정
CHANGE MASTER TO
MASTER_HOST = 'master_host',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 120;
START SLAVE;
-- 복제 상태 확인
SHOW SLAVE STATUS\G
-- Key fields: Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master
PostgreSQL 스트리밍 복제
-- PostgreSQL: 마스터-슬레이브 스트리밍 복제
-- [Master 설정]
ALTER USER postgres WITH REPLICATION;
-- pg_hba.conf에 추가:
host replication all 10.0.0.0/8 md5
-- [Slave 설정 (베이스 백업)]
pg_basebackup -h master_host -U postgres -D /var/lib/postgresql/data -P -Xs
-- recovery.conf 설정:
standby_mode = 'on'
primary_conninfo = 'host=master_host port=5432 user=repl password=password'
-- 마스터에서 복제 상태 확인:
SELECT * FROM pg_stat_replication;
-- 슬레이브에서 복제 지연 확인:
SELECT now() - pg_last_xact_replay_timestamp() AS replication_lag;
장애 복구 시나리오
┌─────────────────────────────────────────────────────────────────────────────┐
│ 마스터 장애 및 복구 시나리오 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [마스터 장애] │
│ │
│ 1. 마스터 연결 불가 감지 │
│ 2. 슬레이브 중 새 마스터 선출 (보통 priority最高的 슬레이브) │
│ 3. 나머지 슬레이브가 새 마스터를Follow │
│ 4. 클라이언트가 새 마스터로 리다이렉션 │
│ │
│ [Automatic Failover - 예: MySQL MGR, PostgreSQL Patroni] │
│ │
│ 1. 장애 감지 │
│ 2. 새 마스터 선출 │
│ 3. 리다이렉션 자동화 │
│ │
│ [데이터 복구] │
│ │
│ ※ 주의: 비동기식 복제에서는 복제 지연으로 인해 일부 데이터 손실 가능 │
│ → 손실량을 최소화하려면 반동기식 또는 동기식 복제 사용 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
📢 섹션 요약: 마스터-슬레이브 복제는 설정이 비교적 단순하고 널리 사용되며, 장애 시 자동 페일오버와 읽기 분산으로 성능과 가용성을 높일 수 있다.
Ⅳ. 결론
마스터-슬레이브 복제는 가장 널리 사용되는 복제 아키텍처로, 쓰기는 마스터, 읽기는 슬레이브로 분산하여 성능과 가용성을 높인다. 그러나 복제 지연으로 인한 일관성 문제와 단일 마스터 쓰기 한계가 있으므로, 시스템 요구사항에 맞게 반동기식 복제, 읽기-after-쓰기 전략 등을 함께 고려해야 한다.
📢 섹션 요약: 마스터-슬레이브 복제는 읽기 분산에 효과적이지만, 복제 지연과 단일 쓰기 마스터의 한계를 고려해야 한다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
┌─────────────────────────────────────────────────────────────────────────────┐
│ Master-Slave Replication Concept Map │
│ │
│ ┌───────────────────────────┐ │
│ │ Master-Slave Replication │ │
│ │ (마스터-슬레이브 복제) │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Write │ │ Read │ │ Failover│ │
│ │(마스터만)│ │(슬레이브)│ │(자동복구)│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Binlog/WAL → 복제 → 슬레이브에 적용 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
참고
- 마스터-슬레이브 복제는 쓰기는 마스터, 읽기는 슬레이브로 분산한다.
- 비동기식, 반동기식, 동기식 복제가 있다.
- 복제 지연으로 인한 일관성 문제를 고려해야 한다.
- 마스터 장애 시 슬레이브 중 하나가 새 마스터로 승격된다.