MySQL 鏈複製中的故障轉移
在以下設置中,我們有 4 個伺服器設置、1 個主伺服器、3 個菊花鏈從屬伺服器:
A (master) -> B (slave) -> C (slave) -> D (slave)
(伺服器 B 和 C 和 D 正在使用 log-slave-updates 執行)
在正常操作中,一切都按預期工作:如果我們向 A 添加新數據,我們會看到它在 B、C 和 D 中快速顯示
現在我們要創建一個失敗場景——我們關閉 A 並想讓 B 成為新的主節點:
B (master) -> C (slave) -> D (slave)
看起來我們想要做的很簡單——將 B 從 Slave 切換到 Master
我們正在嘗試遵循文件“在故障轉移期間切換源” https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-switch.html
文件說“在副本 Replica 1 被提升為源時,發出 STOP REPLICA | SLAVE 和 RESET MASTER。”
因此,如果我們閱讀正確,要將 B 從 Slave 切換到 Master,我們所要做的就是執行:
STOP SLAVE RESET MASTER
執行“STOP SLAVE”不會導致任何問題,但執行“RESET MASTER”會中斷對下游五線譜 C 和 D 的複制。這是 C 上的錯誤:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'
或者有時:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'I/O error reading log event; the first event 'mysql-bin.000001' at 14282060, the last event read from './mysql-bin.000001' at 14282683, the last byte read from './mysql-bin.000001' at 14282683.'
那麼“RESET MASTER”的意義何在,為什麼會斷鍊呢?省略它有什麼害處/如何在 MySQL 鏈複製中正確地進行故障轉移?
您無需切換源,因此無需從 A 主機遷移到 B 主機。
為了清除 A 是 B 的主人的記錄,但是以下可能是可取的:
- (B)
STOP SLAVE
將停止 (B) 嘗試獲取更多的 binlog 事件- (B)
RESET SLAVE ALL
會讓 (B) 忘記 (A) 主人。- (B)
RESET MASTER
是錯誤的。(B) 是 (C) 的主人。甚至在 (A) 被刪除之前。