270. 복제 (Replication) - 동기식 vs 비동기식
핵심 인사이트 (3줄 요약)
- 본질: 데이터 복제는 동일한 데이터를 여러 노드에 중복 저장하는 기법으로, 동기식 복제는 모든 복제본에 기록 완료 후 응답하고, 비동기식 복제는-primary에만 기록 후 즉시 응답한다.
- 가치: 동기식 복제는 강한 일관성을, 비동기식 복제는 높은 가용성과 빠른 응답 속도를 제공하며, 시스템 요구사항에 맞게 선택해야 한다.
- 융합: CAP 정리, 일관성 모델, 장애 복구, Quorum, 마스터-슬레이브, 멀티 마스터와 밀접하게 연관된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
개념 정의
데이터 복제는 동일한 데이터를 물리적으로 분리된 여러 노드에 중복 저장하는 기법이다. 복제를 통해 데이터 가용성, 읽기 성능, 장애 복구 능력을 향상시킬 수 있다. 동기식 복제(Synchronous Replication)와 비동기식 복제(Asynchronous Replication)는 복제 시점과 일관성 보증 방식에서 차이가 있다.
동기식 복제
동기식 복제는 Primary 노드(또는 쓰기 요청 노드)가 모든 복제본에 쓰기를 완료하고 확인을 받아야 성공으로 반환하는 방식이다. 모든 복제본이 동일 시점에 동일한 데이터를 가지므로 강한 일관성을 보장한다.
비동기식 복제
비동기식 복제는 Primary 노드에서만 로컬 쓰기를 수행하고 즉시 성공을 반환한 후, 백그라운드에서 다른 복제본에 비동기적으로 복제하는 방식이다. 복제가 완료되기 전에 응답하므로 응답 지연이 적지만, 복제 지연 동안 데이터 불일치가 발생할 수 있다.
필요성
복제는 데이터의 가용성과 내구성을 높이는 핵심 기법이다. 하나의 노드가故障しても他のノードでサービスを継続할 수 있다. 그러나 동기식과 비동기식 복제는 일관성과 성능 사이의 트레이드오프가 있으므로, 시스템 요구사항에 맞게 선택해야 한다.
비유
동기식 복제는等기우편과 같다. 받는 사람이 편지를 받으면確認서传来確認까지 보내야 과정이 완료된다. 비동기식 복제는일반우편과 같다. 편지를 보내면 받드시確認 없이 바로 다음 업무로 진행할 수 있어 빠르지만, 수신자가 받지 못할 수도 있다.
📢 섹션 요약: 동기식 복제는 강한 일관성을, 비동기식 복제는 빠른 응답을 제공하며, 일관성과 성능 사이의 트레이드오프가 있다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
동기식 vs 비동기식 복제 동작
┌─────────────────────────────────────────────────────────────────────────────┐
│ 동기식 vs 비동기식 복제 동작 비교 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [동기식 복제 동작] │
│ │
│ Client │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ WRITE │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Primary ───▶ Slave1 ───▶ Slave2 ───▶ Slave3 │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │◀──────────┴───────────┴───────────┘ │ │
│ │ │ 모든 노드에서 쓰기 완료 확인 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ Client에 성공 반환 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 소요 시간: T = T1(쓰기) + T2(네트워크) + T3(복제确认) │
│ ※ 모든 복제본 확인까지 대기 → 지연 증가 │
│ │
│ [비동기식 복제 동작] │
│ │
│ Client │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ WRITE │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Primary ───▶ Local Write (즉시 완료) │ │
│ │ │ │ │
│ │ │◀────────── 성공 반환 (백그라운드 복제 시작) │ │
│ │ │ │ │
│ │ │ ┌─────────────────────────┐ │ │
│ │ │ │ 백그라운드: Slave1, Slave2, Slave3에 비동기 복제│ │
│ │ │ └─────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 소요 시간: T = T1(쓰기) + T2(로컬磁盘记录)만 │
│ ※ 복제 완료 대기 없음 → 지연 최소화 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
일관성 모델 비교
┌─────────────────────────────────────────────────────────────────────────────┐
│ 동기식 vs 비동기식 복제 일관성 비교 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────┬────────────────────────┬────────────────────────┐ │
│ │ 항목 │ 동기식 복제 │ 비동기식 복제 │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 일관성 수준 │ 강철 일관성 │ 결과적 일관성 │ │
│ │ │ (항상 모든 노드 동일) │ (궁극적으로 동일) │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 쓰기 응답 시간 │ 길음 │ 짧음 │ │
│ │ │ (모든 복제본 대기) │ (로컬만) │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 복제 지연 │ 없음 │ 있음 │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 장애 시 데이터 │ 없음 (이미 복제됨) │ 가능성 있음 (복제 전) │ │
│ │ 손실 │ │ │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 네트워크 의존성│ 높음 (모든 노드 연결 필수)│ 낮음 (로컬만) │ │
│ ├────────────────┼────────────────────────┼────────────────────────┤ │
│ │ 적합 시나리오 │ 금융, 재고 (일관성 핵심)│ SNS, IoT (가용성 핵심)│ │
│ └────────────────┴────────────────────────┴────────────────────────┘ │
│ │
│ [쓰기 분산 가능성] │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 동기식: 일반적으로 단일 Primary 쓰기만 지원 (일관성 보장을 위해) │ │
│ │ 비동기식: 경우에 따라 멀티 마스터 쓰기 가능 (충돌 해결 필요) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
반동기식 복제 (Semi-Synchronous)
┌─────────────────────────────────────────────────────────────────────────────┐
│ 반동기식 복제 (Semi-Synchronous Replication) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [동작 원리] │
│ • 적어도 하나의 복제본에 동기 쓰기 │
│ • 나머지는 비동기 복제 │
│ • 동기식과 비동기식의 균형점 │
│ │
│ [예시: MySQL Group Replication] │
│ │
│ Client │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ WRITE │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Primary ───▶ Slave1 (동기 - 확인 대기) │ │
│ │ │ │ │ │
│ │ │ ▼ │ │
│ │ │ 성공 반환 (1개 이상 확인) │ │
│ │ │ │ │
│ │ │ 백그라운드: Slave2, Slave3에 비동기 복제 │ │
│ │ │ │ │
│ └────┼──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Client에 성공 반환 │
│ │
│ [장점] │
│ • 동기식보다 빠른 응답 (1개만 동기 대기) │
│ • 비동기식보다 높은 내구성 (1개 이상 복제 보장) │
│ • 장애 시 데이터 손실 위험 감소 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 동기식 복제는 모든 복제본에 기록 완료 후 응답하므로 가장 강한 일관성을 보장하지만, 응답 지연이 크다. 비동기식 복제는 즉시 응답하므로 지연이 적지만, 복제 지연이 발생하여 일관성이 낮다. 반동기식은 둘 사이의 균형점으로, 적어도 하나의 복제본에 동기 쓰기하여 일관성과 성능 사이의 균형을 맞춘다.
📢 섹션 요약: 동기식 복제는 강철 일관성, 비동기식 복제는 빠른 응답, 반동기식은 둘 사이의 균형을 제공하며, 시스템 요구사항에 따라 선택해야 한다.
Ⅲ. 구현 및 실무 응용 (Implementation & Practice)
MySQL 복제
-- MySQL: 비동기식 복제 (기본)
-- Master 설정
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = mydb
-- Slave 설정
[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
-- 복제 명령
CHANGE MASTER TO MASTER_HOST = 'master_host',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 120;
START SLAVE;
-- Semi-Synchronous 복제
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
PostgreSQL 복제
-- PostgreSQL: Streaming Replication (비동기식)
-- Master (primary) 설정
postgresql.conf:
listen_addresses = '*'
max_wal_senders = 10
wal_level = replica
hot_standby = on
pg_hba.conf:
host replication all 10.0.0.0/8 md5
-- Slave (standby) 설정
recovery.conf:
standby_mode = 'on'
primary_conninfo = 'host=master port=5432 user=repl'
-- Synchronous Replication 설정
postgresql.conf:
synchronous_commit = on -- 동기식
-- synchronous_commit = remote_write -- 반동기식
-- synchronous_commit = off -- 비동기식
synchronous_standby_names = 'standby1,standby2'
MongoDB 복제
// MongoDB: Replica Set (기본 비동기식 복제)
// 레플리카셋 초기화
rs.initiate({
_id: "myReplSet",
members: [
{ _id: 0, host: "node1:27017", priority: 2 },
{ _id: 1, host: "node2:27017", priority: 1 },
{ _id: 2, host: "node3:27017", priority: 1 }
]
});
// 쓰기 Concern 설정
db.collection.insertOne(
{ name: "test" },
{ writeConcern: { w: "majority", j: true, wtimeout: 5000 } }
);
// w: "majority" → 과반수 노드에 기록되어야 성공 (반동기식 효과)
// j: true → 디스크 기록까지 확인
📢 섹션 요약: MySQL, PostgreSQL, MongoDB 등 주요 DB에서 동기식, 반동기식, 비동기식 복제를 지원하며, 설정으로 전환이 가능하다.
Ⅳ. 결론
동기식과 비동기식 복제는 일관성과 성능 사이의 트레이드오프가 있다. 동기식 복제는 강철 일관성을 보장하지만 응답 지연이 크고, 비동기식 복제는 빠른 응답을 제공하지만 복제 지연이 발생할 수 있다. 반동기식 복제는 둘 사이의 균형을 제공한다. 시스템 요구사항에 맞는 복제 방식을 선택해야 한다.
📢 섹션 요약: 복제 방식 선택은 일관성 vs 성능 트레이드오프이며, 금융 시스템에는 동기식, 웹 애플리케이션에는 비동기식이 적합하다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
┌─────────────────────────────────────────────────────────────────────────────┐
│ Replication Concept Map │
│ │
│ ┌───────────────────────────┐ │
│ │ Replication │ │
│ │ (데이터 복제) │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Sync │ │ Semi-Sync│ │ Async │ │
│ │(동기식) │ │(반동기식) │ │(비동기식) │ │
│ │ 일관성↑ │ │ 균형점 │ │ 성능↑ │ │
│ │ 응답↓ │ │ │ │ 일관성↓ │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
참고
- 동기식 복제는 모든 복제본에 완료 후 응답, 비동기식은 즉시 응답 후 백그라운드 복제이다.
- 일관성과 성능 사이의 트레이드오프가 있다.
- 반동기식은 동기식과 비동기식의 균형점이다.
- 시스템 요구사항에 맞게 복제 방식을 선택해야 한다.