Database/Mysql

[Real MySQL] 16-4. 복제: 동기화 방식

noahkim_ 2024. 9. 7. 20:16

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. Asynchronous Replication

  • 소스 서버가 레플리카 서버에서 변경 이벤트가 정상적으로 전달되어 적용되었는지 확인하지 않음

 

장점
  • 빠른 성능
  • 레플리카 서버의 문제가 전파되지 않음

 

단점
  • 동기화 여부 보장 X
    • 소스 서버에 장애가 발생하면 최근 트랜잭션이 레플리카 서버에 전송되지 않을 수 있음
    • 레플리카 서버가 승격될 경우, 누락된 트랜잭션이 있는지 수동으로 확인해야 함

 

2. Semi-Synchronous Replication

  • 비동기 방식에서 좀 더 향상된 데이터 무결성을 제공하는 방식
  • 소스 서버는 레플리카 서버로부터 응답을 받아야 트랜잭션을 완전히 커밋시킴
    • 레플리카는 릴레이 로그 커밋이 성공하면 ACK 응답을 보냄
  • 네트워크 통신이 추가적으로 필요하므로, 물리적으로 가까운 서버일 경우 적합함

 

시스템 변수

rpl_semi_sync_master_wait_point
  • 소스 서버가 레플리카 서버의 응답을 기다리는 지점을 제어할 수 있음
  • AFTER_SYNC
    • 소스 서버에서 트랜잭션을 바이너리 로그에 기록한 후 스토리지 엔진에 커밋하기 전, 레플리카 서버 응답을 기다림
  • AFTER_COMMIT
    • 소스 서버에서 트랜잭션을 바이너리 로그에 기록한 후 스토리지 엔진에 커밋한 후, 레플리카 서버 응답을 기다림 
    • 팬텀 리드가 발생함

 

rpl_semi_sync_master_enabled
  • 소스 서버에서 반동기 복제의 활성화 여부 제어

 

rpl_semi_sync_master_timeout
  • 소스 서버에서 레플리카 서버의 응답이 올 떄까지 대기하는 시간
  • 밀리초 단위

 

rpl_semi_sync_master_trace_level
  • 소스 서버에서 반동기 복제에 대해 디버깅 시 어느 정도 수준으로 디버그 로그가 출력되게 할 것인지 레벨을 지정
  • 1, 16, 32, 64 값으로 설정 가능

 

rpl_semi_sync_master_wait_for_slave_count
  • 소스 서버에서 반드시 응답을 받아야 하는 레플리카 수 

 

rpl_semi_sync_master_wait_no_slave
  • rpl_semi_sync_master_timeout에 지정된 시간 동안 반동기 복제로 연결된 레플리카 서버 수가 rpl_semi_sync_master_wait_for_slave_count 수보다 적을 경우 대처
  • 1: 레플리카 수가 적더라도 타임아웃 시간 동안 반동기 복제를 그대로 유지
  • 0: 레플리카 수가 적어지는 즉시 비동기 복제로 전환됨

 

rpl_semi_sync_master_wait_point
  • 소스 서버가 트랜잭션 처리 단계 중 레플리카 서버의 응답을 대기하는 지점을 설정하는 옵션
  • AFTER_SYNC, AFTER_COMMIT

 

rpl_semi_sync_slave_enabled
  • 레플리카 서버에서 반동기 복제의 활성화 여부 제어

 

rpl_semi_sync_slave_trace_level
  • 레플리카 서버에서 반동기 복제에 대해 디버깅 시 어느 수준으로 디버그 로그가 출력될 지 결정
  • 1, 16, 32, 64 값으로 설정 가능

 

설정 방법

install plugin rpl_semi_sync_master soname 'semisync_master.so' -- source server
install plugin rpl_semi_sync_slave soname 'semisync_slave.so' -- replica server
  • 플러그인 설치 (반동기 복제 기능은 플러그인 형태로 구현되어 있으므로 별도의 설치가 필요함)

 

set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=1;
  • 각 서버에 시스템 변수 활성화하기