읽기 부하 분산과 가용성을 위해 master slave 구조를 도입하고자 함
복제 방법으로 binlog, GTID, Semi-Synchronous Replication 3가지 방법 고려
binlog 복제는 장애 복구가 어렵고 Slave 추가 시 설정이 복잡함
GTID복제는 장애 시 자동 복구가 가능하고 Slave 서버 추가도 간편함
Semi-Synchronous 복제는 강한 일관성을 제공하지만 msa환경 확장시 slave 추가가 제한될 가능성 있음
Services
db: # Master
image: mysql:8
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: manager
MYSQL_DATABASE: settlementdb
ports:
- "3306:3306"
command: >
--server-id=1 # 이 서버(MySQL 인스턴스)의 고유 ID (Master/Slave 구분용, 중복 금지)
--log-bin=mysql-bin # 바이너리 로그 활성화 (복제나 장애 복구를 위해 트랜잭션 기록)
--binlog-do-db=settlementdb # 바이너리 로그에 기록할 특정 데이터베이스 지정 (settlementdb만 복제 대상)
--binlog-format=ROW # binlog 기록 방식 설정 (ROW: 데이터 변경 자체를 기록, 복제 정확도 높음)
--gtid-mode=ON # GTID(Global Transaction ID) 기능 활성화 (트랜잭션에 고유 ID 부여해서 복제 관리)
--enforce-gtid-consistency=ON # GTID 복제 일관성 강제 (트랜잭션이 GTID 복제에 적합한 방식으로만 실행되게 함)
volumes:
- master_data:/var/lib/mysql
volumes:
master_data: # Named Volume 선언
slave_data: # Named Volume 선언
(Slave가 Master binlog를 읽을 수 있게 허용)