Replication
레플리케이션은 하나의 MySQL 서버(Source)의 데이터를 다른 서버(Replica)로 실시간에 가깝게 복사하여 동기화하는 기술로, 가용성과 확장성을 높이는 데 중요한 역할을 한다.
- 원본 데이터를 가진 서버: 소스(Source) 서버
- 복제된 데이터를 가지는 서버: 레플리카(Replica) 서버
레플리케이션은 단순히 서버의 부하를 분산하는 스케일 아웃을 넘어, 현대적인 서비스 아키텍처에서 다양한 목적으로 활용된다.
- 스케일 아웃: 데이터 변경이 발생하는 쓰기 작업은 소스 서버에서 처리하고, 데이터 조회가 많은 읽기 작업은 여러 대의 레플리카 서버로 분산시켜 전체 시스템의 처리량을 향상
- 데이터 백업: 데이터 백업을 레플리카 서버에서 수행하여 데이터를 보호하고, 소스 서버의 성능에 미치는 영향을 최소화
- 데이터 분석: 무거운 분석 쿼리나 통계 작업을 레플리카 서버에서 실행하여 소스 서버의 부하 격리
- 데이터의 지리적 분산: 데이터를 사용자에게 가까운 지역에 위치한 레플리케이션 서버에 분산시켜, 읽기 지연 시간을 줄이고 더 나은 사용자 경험을 제공
- 고가용성: 소스 서버에 장애가 발생했을 때, 레플리카 서버 중 하나를 새로운 소스 서버로 승격시켜 서비스 중단을 최소화하는 장애 복구(Failover) 환경 구축
복제 아키텍처 및 동작 원리
Section titled “복제 아키텍처 및 동작 원리”MySQL 레플리케이션은 소스 서버에서 발생하는 모든 데이터 변경 이력을 기록하는 바이너리 로그(Binary Log)를 기반으로 동작한다.
- 로그에는 데이터의 변경 내역뿐만 아니라 데이터베이스나 테이블의 구조 변경과 계정이나 권한 변경 정보까지 모두 기록
- 레플리케이션은 바이너리 로그에 기록된 변경 정보들(=
이벤트) 기반으로 동작 - 소스 서버에서 발생한 바이너리 로그를 레플리카 서버로 전송하여 레플리카 서버에서도 동일한 변경 사항을 수행하여 데이터를 동기화
위 동작은 MySQL의 세 개의 스레드에 의해 수행하는데, 하나는 소스 서버에 존재하고 나머지 두 개는 레플리카 서버에 존재한다.
- 바이너리 로그 덤프 스레드(Binary Log Dump Thread): 소스 서버에서 바이너리 로그를 읽어 레플리카 서버로 전송하는 스레드
- 레플리케이션 I/O 스레드(Replication I/O Thread): 레플리카 서버에서 소스 서버로부터 전송받은 바이너리 로그 이벤트를 가져와 레플리카 서버의 릴레이 로그에 기록하는 스레드
- 레플리케이션 SQL 스레드(Replication SQL Thread): 레플리카 서버의 릴레이 로그에 기록된 이벤트를 레플리카 서버의 데이터베이스에 실행하는 스레드
각 스레드들을 통해 다음과 같은 과정으로 레플리케이션이 수행된다.
- 소스 서버에서 트랜잭션이 커밋되면 변경 내용이 바이너리 로그에 기록
- 소스 서버의 바이너리 로그 덤프 스레드(Binary Log Dump Thread)가 바이너리 로그를 읽어 레플리카 서버로 전송
- 레플리카 서버의 I/O 스레드가 네트워크를 통해 받은 바이너리 로그 이벤트를 릴레이 로그에 순차적으로 기록
- 레플리카 서버의 SQL 스레드(Applier Thread)가 릴레이 로그의 이벤트를 순서대로 읽어 레플리카의 데이터베이스에 적용
이 과정은 비동기적으로 일어나므로, 소스 서버의 변경이 레플리카 서버에 반영되기까지 약간의 시간 차이, 즉 복제 지연(Replication Lag)이 발생할 수 있다.