두 개 이상의 DBMS 이용하여 Master/Slave (수직적)구조를 활용하여 DB의 부하를 분산 시키는 기술 입니다.
쓰기 작업이 허용되는 Master DB를 기준으로 이를 복사하여 읽기 권한만 지닌 Slave DB를 수직적으로 확장하여 사용합니다.
복제 동작 과정
- Commit 발생
- Connection Thread에서 스토리지 엔진에게 해당 트랜잭션에 대한 Prepare(Commit 준비)를 수행
- Commit을 수행하기 전에 먼저 Binary Log에 변경사항을 기록
- 스토리지 엔진에게 트랜잭션 Commit을 수행하도록 한다.
- Master Thread는 시간에 구애받지 않고 (비동기적으로) Binary Log를 읽어서 Slave로 전송
- Slave의 I/O Thread는 Master로부터 수신산 변경 데이터를 Relay Log에 기록
- Slave의 SQL Thread는 Relay Log에 기록된 변경 데이터를 읽어서 Slave의 스토리지 엔진에 적용
동기/비동기 복제 방식
Replication은 동기 복제보다 비동기 복제 방식을 주로 사용한다.
동기 복제는 Primary가 데이터를 변경할 때 Replica까지 반영되었다는 응답을 받아야 트랜잭션을 완료한다.
그렇기에 쓰기 지연이 발생하며 Replica가 멀리 있거나 순간적으로 느려지면 Primary의 쓰기 성능까지 같이 느려지는 문제가 발생한다.
Primary가 자신의 저장소에 커밋하면 바로 클라이언트에게 응답하고, Replica에는 이후에 변경사항을 전달한다.
- 쓰기 성능이 좋음
- Replica의 처리 완료를 기다리지 않음
- 네트워크 지연이 쓰기 요청에 직접 영향을 주지 않음
- Replica 장애가 Primary에 미치는 영향이 작음
- Replica 한 대가 느려지거나 장애가 나더라도 Primary는 계속 쓰기 가능
- 동기 복제라면 Replica ACK를 기다리면서 서비스 전체 쓰기가 지연될 수 있음
- Replica를 여러 대 운영하기 쉬움
- Read Replica를 여러 개 두고 조회 부하 분산 가능
- 모든 Replica의 완료를 기다릴 필요가 없음
그러나 Replication Lag라는 문제가 발생한다.
