📌 MySQL은 플러그인으로 구현되는 Semi-Sync Replication에 대한 인터페이스를 지원
- Slave DB로부터 Relay log에 기록이 완료되었다는 응답을 받고 트랜잭션을 진행하는 방식
- 충돌이 발생하였을 경우 커밋 된 모든 트랜잭션이 하나 이상의 복제본으로 전송되었음을 보장
- 응답 시간이 초과되었을 경우 Async 방식으로 Replication 진행
- AFTER_SYNC(기본값)
Commit -> Binlog Flush/Commit -> Send Event with ACK Request -> Write Relay Log -> Ack -> Engine Commit -> Returns result to the Client
- AFTER_COMMIT:
Commit -> Binlog Flush/Commit -> Engine Commit -> Send Event with ACK Request -> Write Relay Log-> Ack -> Returns result to the Client
(1) 플러그인 설치
- Master DB - mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> SHOW PLUGINS; +---------------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +---------------------------------+----------+--------------------+--------------------+---------+ | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | +---------------------------------+----------+--------------------+--------------------+---------+ - Slave DB - mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SHOW PLUGINS; +---------------------------------+----------+--------------------+-------------------+---------+ | Name | Status | Type | Library | License | +---------------------------------+----------+--------------------+-------------------+---------+ | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +---------------------------------+----------+--------------------+-------------------+---------+
(2) 플러그인 활성화
- Master DB - mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; - Slave DB - mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
(3) Replication 재실행
mysql> STOP SLAVE; mysql> START SLAVE; - MySQL 8.0.23 이후 - mysql> STOP REPLICA; mysql> START REPLICA;
(4) my.cnf 수정
- Master DB - [mysqld] rpl_semi_sync_master_enabled=1 - Slave DB - [mysqld] rpl_semi_sync_slave_enabled=1
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; - Rpl_semi_sync_master_status : 동작 상태 - Rpl_semi_sync_master_no_tx : Slave에서 확인하지 못한 커밋 수 - Rpl_semi_sync_master_yes_tx : Slave에서 확인한 커밋 수