MySQL 複製和高可用性
我知道在這個網站上問這可能不是一個很好的問題,但我真的需要一些幫助/提示才能引導到正確的路徑。
我想為 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_Master
是NULL
SHOW SLAVE STATUS\G
循環執行,直到 `Exec_Master_Log_Pos 停止更改將 DBVIP 分配給
DBServer2
viaip addr add
這本質上是安全故障轉移到主/主複製集群中的被動主的算法。
選擇
如果你所有的數據都是 InnoDB,我推荐一些不那麼嚴格的東西。也許您應該考慮使用DRBD和HeartBeat。原因如下:
你基本上會這樣做:
- 將DRBD
DBServer1's
塊設備作為主要設備- 將DRBD
DBServer2's
塊設備作為輔助設備DBServer1's
在 /var/lib/mysql 上掛載DRBD 設備- 啟動 MySQL
DBServer1
- 讓 HeartBeat 監控伺服器之間的 Ping 活動
在 DRBD 場景中啟動腳本會是什麼樣子?
- 循環直到無法通過 ping 訪問 DBVIP
- 殺死心跳
- 斷開 DRBD
- 將 DRBD 提升為主節點
- 在 /var/lib/mysql 上掛載 DRBD
- 啟動 MySQL(InnoDB 崩潰恢復填充缺失數據)
- 通過分配 DBVIP
ip addr add
這要簡單得多,因為只有一側是活動的。被動端(DRBD 輔助端)是活動端(DRBD 主端)的同步磁碟副本。
警告
如果所有或大部分工作集數據都是 MyISAM,請不要觸摸 DRBD。崩潰場景很快會導致 MyISAM 表被標記為崩潰並需要自動修復(等待可能會非常緩慢)。
更新 2012-12-29 08:00 EDT
這是我過去在 MySQL 中使用 DRBD 的文章
Mar 29, 2011
: MySQL 高可用性、故障轉移和延遲複製Aug 29, 2011
:MySQL複製:1個從/多個主Dec 19, 2011
:設置主到多主複製的最佳方法Jul 25, 2012
:不同vlan/子網/另一個站點上的Mysql數據庫複製(我在別人的部落格上攪拌了一個相當大的鍋)