MySQL MHA原始碼解析

jeanron100發表於2017-10-12

MySQL的高可用方案很多,MHA算是其中最流行的一種方案之一。目前最新的版本是0.57,它分為兩部分,一部分水himanager,另外一部分是node.


瞭解學習一個開源專案,閱讀原始碼是一個很不錯的開始,所以MHA就成為了我學習的一個重點內容。我們先從manager開始,當然因為這個開源專案是基於perl開發,磨刀不誤砍柴工,我們可以在開發IDE裡面檢視,這樣效率更高一些,比如使用eclipse,下載個外掛即可。


整個工程的情況如下,bin目錄下是可執行的perl指令碼,引用的包體邏輯在lib下面的.pm檔案中。


MySQL MHA原始碼解析


對於node節點來說,也是類似的方式,只是node節點的邏輯內容少了很多,主要集中在對於binlog的處理上。


使用MHA,啟停manager是一個基本的入口,所以我們可以在masterha_manager裡檢視。會發現指令碼其實主要分為兩部分,masterMonitor和MasterFailover。我們就透過main方法來逐步瞭解。


MySQL MHA原始碼解析


我們切換到MasterMonitor中,檢視main方法的內容。


MySQL MHA原始碼解析


如果是在IDE裡面就很容易看到對應的.pm檔案MasterMonitor.pm的一個結構概覽,從main方法入手。


MySQL MHA原始碼解析


整個Monitor的核心邏輯就是下面的方法了。這個邏輯是一個迴圈中進行心跳的檢測機制。其中wait_until_master_is_dead就是一個重要方法了。可以順著這個方向繼續往裡面看。


MySQL MHA原始碼解析


另外一個重要的指令碼就是masterha_master_switch了,主要是完成切換的內容,如果檢視指令碼的基本結構會發現,透過檢測主節點的狀態,會分別呼叫MasterFailover和MasterRotate來處理。


MySQL MHA原始碼解析


failover的邏輯如下,我們可以檢視對應的pm檔案MasterFailover.pm來檢視邏輯。整體的邏輯如下圖所示,會分為幾個階段。每個階段會有一個整體的校驗步驟。


MySQL MHA原始碼解析


MySQL MHA原始碼解析


透過上面的部分可以看到,整個切換的過程中,後臺會進行一些列的邏輯檢查,比如查到當前最新的slave節點,如何補齊日誌資訊(本質上就是透過mysqlbinlog基於時間戳來處理)


在這個基礎上,透過原始碼我們可以看到很多不曾注意的細節,比如如果在8個小時內再次切換,是會直接拋錯的。


MySQL MHA原始碼解析

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2145884/,如需轉載,請註明出處,否則將追究法律責任。

相關文章