Mysql

MySQL 複製和高可用性

  • December 29, 2012

我知道在這個網站上問這可能不是一個很好的問題,但我真的需要一些幫助/提示才能引導到正確的路徑。

我想為 2 個處於 Master-Master 複製模式的 MySQL 伺服器製定故障轉移策略。我已經完成了複製,它工作得很好。然而,當談到故障轉移策略時,我有點無能為力……

過去幾天我一直在網上閱讀(我知道這是一個非常複雜的過程,我無法在一周左右的時間內掌握它),但我閱讀的越多,我就越困惑。基本上,據我了解,我需要一個軟體來監控網路並報告任何故障,另一個軟體可以在兩個系統之間切換。Heartbeat顯然是這樣做的最好的,但在我閱讀的所有教程中,他們也在使用許多其他軟體(例如用於監控的 MON,或用於轉儲或獲取備份的其他軟體)。有必要擁有它們嗎?是否只能使用 MySQL 和 Heartbeat 之類的 HA 工具來製定故障轉移策略?

每個網站都在引入不同的工具和方式,它們各有優缺點,當然這取決於希望我的“集群”如何工作,以及高可用性對我的系統有多重要。我只是在考慮向我的客戶指出它,它不會很快進入生產階段,因為我的客戶經營小型企業並且不太關心失去數據,但是,我想通過設置來深入了解這個概念建立一個簡單的主-主複製,在任何伺服器發生故障的情況下,客戶端會自動將更改送出到備用伺服器。

鑑於您提到您擁有的事實,Master-Master replication mode除非您正確考慮複製滯後,否則我不會推薦任何自動故障轉移。畢竟,MySQL Replication 是非同步的。

理論上可以有以下幾種:

  • DBServer1作為大師DBServer2
  • DBServer2作為大師DBServer1
  • DBVIP 指向 DBServer1
  • DBServer2落後 180 秒
  • DBServer1下跌降落
  • 自動故障轉移將 DBVIP 移至DBServer2

在這種情況下,DBServer2可能具有尚不存在的自動增量鍵。在故障轉移時,DBVIP 將允許 WebServers 連接DBServer2並請求尚不存在的數據。

因此,這將需要在每個 DBServer 上執行後台程序。

對於上述場景:

  • DBVIP 已開啟DBServer1

  • DBServer1執行心跳

  • DBServer2執行心跳

  • 後台程序開啟DBServer1監控

    • a) 數據裝載可用性
    • b) 數據掛載可寫性
    • c) MySQL 連接
    • 一旦 a、b 或 c 失敗,殺死 HeartBeat

後台程序打開DBServer2以確保 DBVIP 可 ping

殺死心跳應該做什麼?觸發為其定義的啟動腳本。

啟動腳本應該DBServer2尋找什麼?

  • 循環直到無法通過 ping 訪問 DBVIP

  • 連接到 MySQL 和

    • 循環執行SHOW SLAVE STATUS\G直到Seconds_Behind_MasterNULL
    • SHOW SLAVE STATUS\G循環執行,直到 `Exec_Master_Log_Pos 停止更改
  • 將 DBVIP 分配給DBServer2viaip addr add

這本質上是安全故障轉移到主/主複製集群中的被動主的算法。

選擇

如果你所有的數據都是 InnoDB,我推荐一些不那麼嚴格的東西。也許您應該考慮使用DRBDHeartBeat。原因如下:

DRBD 為兩台伺服器上的塊設備提供網路 RAID-1

你基本上會這樣做:

  • 將DRBDDBServer1's塊設備作為主要設備
  • 將DRBDDBServer2's塊設備作為輔助設備
  • DBServer1's在 /var/lib/mysql 上掛載DRBD 設備
  • 啟動 MySQLDBServer1
  • 讓 HeartBeat 監控伺服器之間的 Ping 活動

在 DRBD 場景中啟動腳本會是什麼樣子?

  • 循環直到無法通過 ping 訪問 DBVIP
  • 殺死心跳
  • 斷開 DRBD
  • 將 DRBD 提升為主節點
  • 在 /var/lib/mysql 上掛載 DRBD
  • 啟動 MySQL(InnoDB 崩潰恢復填充缺失數據)
  • 通過分配 DBVIPip addr add

這要簡單得多,因為只有一側是活動的。被動端(DRBD 輔助端)是活動端(DRBD 主端)的同步磁碟副本。

警告

如果所有或大部分工作集數據都是 MyISAM,請不要觸摸 DRBD。崩潰場景很快會導致 MyISAM 表被標記為崩潰並需要自動修復(等待可能會非常緩慢)。

更新 2012-12-29 08:00 EDT

這是我過去在 MySQL 中使用 DRBD 的文章

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