MySQL 主從復制採用 C/S 架構:Master 為寫入節點,Slave 通過 I/O 線程拉取二進制日志,經中繼日志由 SQL 線程重放,實現數據同步。本文覆蓋原理、常見拓撲、異步與半同步配置全流程。


架構簡單、成本低,適合負載較低、可用性要求一般的場景。Master 壓力大或單點故障風險高時不適用。

利用讀寫分離分攤讀壓力,Slave 可承擔備份、數據挖掘等任務。但 Slave 過多會加重 Master Dump 線程負擔,成為瓶頸。
其他如多級中繼、環狀復制原理類似,不再贅述。
前置條件:
server-id、建立復制用戶。server-id、指定 Master 連接信息。Master 建用戶:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'10.12.%' IDENTIFIED BY '123456';
Slave 配置連接:
CHANGE MASTER TO MASTER_HOST='10.12.128.19', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=451;
查看狀態:SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0。
啟動復制:START SLAVE;(可單獨啟動 IO_THREAD/SQL_THREAD)。若 IO 線程卡在 Connecting,檢查防火牆。
原理:事務在 Master 提交前,需至少一台 Slave 接收並寫入中繼日志,超時自動降級為異步。建立在異步基礎上。
Master:INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Slave:INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Master:
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 100; -- 毫秒
Slave:
SET GLOBAL rpl_semi_sync_slave_enabled = ON; STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
SHOW GLOBAL STATUS LIKE 'rpl%'; 觀察 Rpl_semi_sync_master_status: ON、Rpl_semi_sync_slave_status: ON 及相關計數器。
