5.5 버전부터 제공하고 있던 semi-sync와 어떤 차이점이 있는 지 알아보도록 하자.
기존의 semi-sync는 Commit을 한 후에 해당 DML이 Slave에 적용될 때 까지 기다리는 구조였다. 그래서 Slave에 적용되기 전에 Master가 Crash하면 아래와 같은 상황이 발생할 수 있다.
이 같은 상황을 방지하기 위해서 5.7버전에서 rpl_semi_sync_master_wait_point 라는 설정이 추가되었다.
설정은 AFTER_SYNC와 AFTER_COMMIT 두가지 중 하나를 할 수 있는 데, 기존의 방식이 AFTER_COMMIT이고 새로 추가된 게 AFTER_SYNC이다.
위 그림과 같이 AFTER_SYNC는 Slave에게 적용이 됐다는 신호를 받은 후에 Master가 Commit을 하고 Client에게 결과를 반환한다. 즉, 적어도 하나의 Slave에는 동기화가 되어 있다는 것을 보장한다.
AFTER_SYNC에서 주의할 점은 Crash된 Master를 재사용 할 수 없다.
왜냐하면 binary log에 uncommitted transactions가 포함되어 있을 수 있기 때문에 Slave가 Recovery할 때 conflict가 일어날 수가 있다.
https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html
https://dev.mysql.com/doc/refman/5.7/en/replication-options-master.html#sysvar_rpl_semi_sync_master_wait_point
http://my-replication-life.blogspot.com/2013/09/loss-less-semi-synchronous-replication.html
댓글 없음:
댓글 쓰기