같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.
- 대부분의 서비스는 읽기가 쓰기보다 훨씬 많아서 부 서버를 여러 대 둔다
- 성능: 읽기 질의를 여러 부 서버에서 병렬로 처리한다
- 안정성: 여러 장소에 사본이 있어 서버 하나가 망가져도 데이터가 남는다
- 가용성: 부 서버가 죽으면 다른 부 서버나 주 서버가 읽기를 받고, 주 서버가 죽으면 부 서버 하나를 새 주 서버로 승격(Failover)한다
주의할 점
- 복제는 보통 비동기라 부 서버가 조금 늦게 따라온다(복제 지연, Replication Lag). 방금 쓴 값을 바로 부 서버에서 읽으면 옛 값이 보일 수 있다. 쓰기 직후 읽기는 주 서버로 보내는 식의 대응이 필요하다(최종 일관성)
- 승격 과정에서 아직 복제되지 않은 데이터가 유실될 수 있다
- 읽기 전용 복제본을 애플리케이션에서 어떻게 나눠 쓰는지는 읽기 전용 복제본에, 변경 로그를 다른 시스템으로 흘려보내는 방식은 CDC (변경 데이터 캡처)에 있다
쓰기 자체를 나눠야 할 만큼 커지면 샤딩으로 넘어간다. 전체 흐름은 사용자 수에 따른 규모 확장.
출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장