2025. 1. 7. 04:33ㆍCS
이미지 출처: https://www.researchgate.net/figure/MySQL-master-slave-database-replication-process_fig2_4317609
목적
고가용성(High Availability), 데이터 안정성(Data Reliability)
읽기 부하 분산: 읽기 요청을 복제 서버로 분산(CQRS)하여 원본 서버의 부하 감소.
백업 및 장애 복구: 데이터를 안전하게 저장하고, 원본 서버 장애 시 복제 서버를 통해 복구.
구성 요소
원본 서버(Source / Master)
데이터 변경 작업(INSERT, UPDATE, DELETE)을 처리하며, Binary Log를 생성, 읽기(Read)가 포함될 수 있음.
복제 서버(Replica / Slave)
원본 서버의 Binary Log를 복제하여 읽기 요청을 처리하거나 데이터 백업 역할.
Replication 방식
MySQL은 Binary Log를 활용해 원본 서버와 복제 서버 간의 데이터 동기화를 수행.
데이터 변경 사항을 기록하는 방식으로 세 가지 제공.
Row-Based Replication (RBR)
변경된 데이터의 각 행(row)의 전후 내용을 기록.
테이블 이름(table name), 기본 키(PK), 변경 전 데이터(before data), 변경 후 데이터(after data)
- 장점: 데이터 일관성을 보장.
- 단점: 저장 공간 사용량 증가.
Statement-Based Replication (SBR)
실행된 SQL 문장 자체를 기록.
- 장점: 저장 공간 사용량 감소.
- 단점: 비확정적(non-deterministic) SQL(예: RAND(), NOW(), LIMIT)을 포함할 경우 복제 오류 발생 가능.
Mixed-Based Replication (MBR)
MySQL에서 Mixed 방식이 기본적으로 제공.
기본적으로 Statement 방식 사용, 비확정적인 SQL이 감지되면 Row 방식으로 전환.
- 장점: Statement 방식의 효율성과 Row 방식의 안정성을 결합.
- 단점: 일부 경우에서 비효율 발생 가능.
복제 과정
- 원본 서버에서 데이터 변경이 발생하면 해당 변경 사항이 Binary Log에 기록.
- 복제 서버의 IO Thread가 원본 서버의 Binary Log를 읽어와 Relay Log(복제 서버의 임시 저장소)에 저장.
- 복제 서버의 SQL Thread가 Relay Log를 기반으로 변경 사항을 데이터베이스에 적용. - 100ms 내외
반동기, 동기 복제 방식
대규모 트랜잭션이나 네트워크 지연으로 인해 복제 서버가 원본 서버와 동기화되지 않는 상황 발생 가능.
비동기 복제 대신 반동기(Semi-Synchronous) 또는 동기(Synchronous) 복제를 설정할 수 있음.
비동기
위에서 설명한 방식.
ACK를 활용하지 않음.
반동기(Semi-Synchronous)
복제 서버가 데이터를 수신했음을 확인할 때까지 원본 서버가 쓰기 작업을 완료로 간주하지 않는 방식.
복제 서버는 데이터를 수신했음을 ACK로 응답하지만, 데이터를 실제로 적용하는 작업(SQL Thread)은 비동기적으로 진행.
동기(Synchronous)
원본 서버와 복제 서버가 데이터를 완전히 동기화할 때까지 쓰기 작업을 완료로 간주하지 않는 방식.
복제 서버는 데이터를 수신한 뒤, 데이터를 실제 적용(SQL Thread)까지 완료해야 ACK를 반환.
1:N / N:1
하나의 원본 서버에서 여러 복제 서버로 복제 가능
(Master-to-Multiple-Slaves / Fan-Out)
읽기 부하 분산, 지리적 분산
데이터 백업 강화
원본 서버 장애 시, 복제 서버 중 하나를 새로운 원본 서버로 승격
하나의 복제 서버가 여러 원본 서버의 데이터를 복제 가능
(Multi-Source Replication)
데이터 통합 관리
데이터 스키마 충돌 등의 관리 복잡성 증가
마무리
예전에 AWS에서 Binary Log 기반의 MySQL Replication을 사용해본 적이 있다. 당시에는 단순히 추천 시스템 서버에서 읽기 부하를 분산하기 위한 목적으로 복제를 설정했었다. 설정은 성공적으로 마쳤지만, 솔직히 그때는 대략적인 동작 원리만 이해한 채 넘어갔던 것 같다.
ValanSe 아키텍쳐
오늘, 졸업 논문을 위한 창의설계프로젝트를 마무리했다. 이번 프로젝트에서는 밸런스 게임이라는 도메인에 집중하기보다 여러 기술들을 사용(체험)해보고, 서버를 배포부터 구성하는 것에 초
mak-ing.tistory.com
이번에 DB 복제를 다시 살펴보면서, 비확정적인 SQL을 방지하기 위해 Row 기반 복제를 혼용하는 최적화된 기법이 있다는 점을 알게 되었다. 뿐만 아니라, 하나의 복제 서버가 여러 원본 서버에서 데이터를 받아오는 멀티 소스 복제나, 비동기 복제에서 발생할 수 있는 문제를 동기나 반동기 복제를 통해 해결할 수 있는 방법도 알게 되었다.
현재 진행 중인 프로젝트에서는 서버가 CQRS 구조를 염두에 두고 설계된 상태이며, 이미 Command와 Query가 구분되어 있다. 이번에 알게 된 내용을 활용하면 복제 전략을 최적화하거나, 데이터 일관성과 성능을 동시에 고려하는 데 도움이 될 것 같다.