Mysql

MySQL 鏈複製中的故障轉移

  • February 5, 2021

在以下設置中,我們有 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) 被刪除之前。

引用自:https://dba.stackexchange.com/questions/284750