傳統一主多從下,主庫故障需手動提升從庫。多級復制(A→B→C) 讓故障轉移變得極簡:
Master(A) → Slave(B) → Slave(C)SLAVE,B 升主,C 指向 B → Master(B) → Slave(C) → Slave(A恢復後)Master(C) → Slave(A) → Slave(B)核心依賴:所有節點版本一致、開啟 log_slave_updates(從庫將 Relay Log 寫入自身 Binlog,傳遞給下游)。
| 角色 | IP | 主機名 | 版本 |
|---|---|---|---|
| Master | 192.168.2.241 | db1 | 5.6.29 |
| Slave1 | 192.168.2.242 | db2 | 5.6.29 |
| Slave2 | 192.168.2.243 | db3 | 5.6.29 |
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.2.%' IDENTIFIED BY 'repl';
FLUSH PRIVILEGES;
my.cnf 關鍵參數(所有節點)[mysqld]
log-bin = mysql-bin
server-id = 241 # 242, 243 分別對應,建議用 IP 末段
log_slave_updates = 1 # 關鍵!從庫轉發 Binlog
expire_logs_days = 7
binlog_format = ROW # 推薦 ROW 格式
修改後 systemctl restart mysqld。
# 在 db1 (Master) 執行
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS; -- 記下 File & Position,如 mysql-bin.000002, 409
# 另開終端導出
mysqldump -uroot -p --all-databases --add-drop-table > all_db.sql
# 解鎖
UNLOCK TABLES;
# 將 all_db.sql 複製到 db2、db3 導入
mysql -uroot -p < all_db.sql
在 db2(第一級從庫)上:
CHANGE MASTER TO
MASTER_HOST='192.168.2.241',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=409;
START SLAVE;
SHOW MASTER STATUS; -- 記下 db2 的 Binlog 位置,供 db3 使用
在 db3(第二級從庫)上:
CHANGE MASTER TO
MASTER_HOST='192.168.2.242',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000002', -- db2 的 File
MASTER_LOG_POS=647569; -- db2 的 Position
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
STOP SLAVE; → db2 成為新主。db1 恢復後,CHANGE MASTER TO db3 掛在 db3 下。my.cnf 加 read_only = 1(超級用戶除外)。STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;(謹慎使用,先排查原因)。Seconds_Behind_Master、Slave_IO_Running、Slave_SQL_Running。pt-table-checksum 校驗主從數據一致性。多級復制以極低成本實現故障秒級切換,是中小規模核心業務的高可用首選方案。