故障分析 | 如何提高 MHA 的網絡容忍能力?(上)

作者:劉開洋

愛可生交付服務部團隊北京 DBA,主要負責處理 MySQL 的 troubleshooting 和我司自研數據庫自動化管理平臺 DMP 的日常運維問題,對數據庫及周邊技術有濃厚的學習興趣,喜歡看書,追求技術。

本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。

一、問題說明

MHA 雖然停止更新了,但是其高可用的強大仍然爲很多公司所青睞。我司客戶由於一次網絡故障,導致公司整體的網絡通信出現問題,網絡丟包嚴重,進而 MHA 管理下的 MySQL 主從集羣發生切換。

衆所周知,MHA 對數據庫高可用集羣的維護是一次性的,出現切換就要手工去重新加入集羣,如果所有服務器網絡再次出現問題,MHA 的頻繁切換就會影響生產。

客戶諮詢:如果再出現這種網絡問題,如何提高 MHA 的容忍能力?

接下來我們就對該場景進行相關測試。


二、環境信息

在測試過程中,盡最大可能地和客戶現場的配置信息儘量相同,達到接近生產環境的測試效果。

測試參數

  • ping_interval

    該參數表示 MHA manager 節點 ping(執行 select ping sql 語句)master 節點的間隔,如果連續三個丟失 ping 連接,MHA manager 就判定 master 宕掉了。

    參數通過 4 次 ping 間隔(9s)的最大時間的機制來發現故障,從而進行 failover,默認參數值爲 3,表示每次 ping 的間隔是 3 秒。

  • secondary_check_script

    默認情況下,MHA Manager 只會通過執行 select ping sql 語句來檢查 Master 是否存活。通過 review 相關參數發現,可以通過使用外部 secondary_check_script 配置的腳本來做到從多個網絡連接進行檢查。

    配置:

     secondary_check_script = masterha_secondary_check -s remote_host1 -s remote_host2

    原理:MHA 內置 masterha_secondary_check 容忍大多數網絡場景現象,而不發生 failover。

上圖所示 manager 通過 remote_host1 和 remote_host2 來檢查 master 節點是否存活。

只有在 manager 通過 remote_host1 和 remote_host2 檢查 master 節點均失敗的情況下,纔會判定 master 節點不可用。其他情況,一律認爲 master 還是活的。

所以可以通過配置多條路由策略的方式,來提高 MHA 對網絡問題的容忍能力。


三、測試結果及分析

測試網絡丟包、壞包、重傳、延遲等場景,發現網絡丟包和壞包兩種場景測試會滿足 MHA 發生切換,因此針對這兩種場景進行 MHA 參數對比測試。

在本次測試環境中使用 sysbench 壓測工具模擬業務場景,在 Mnanger 節點和 MySQL 端,模擬配置丟包率、壞包率模擬網絡通信問題,使得 MHA 因網絡故障問題發生切換,以儘量復現生產的故障環境。

說明:在生產環境 MHA 參數配置相同的情況下,經多次測試,在以下場景中,5 分鐘之內均會發生 MHA 的切換。因此默認觀測時間爲 5 分鐘。

3.1 壞包場景

僅壞包場景下,達到 70% 纔開始切換。

測試說明:在模擬壞包 70% 的情況中,關閉 secondary_check_script 參數,將 ping_interval 調大可影響 MHA 的切換,提高網絡容忍性。調高壞包率時與之前相同 ping_interval 值的場景做對比,可見壞包率增加,會促使 MHA 切換。

從實驗結果上看,在壞包率相同時,設置 ping_interval 的值不變,開啓 secondary_check_script 參數調用相關腳本進行網絡路由的多策略檢查會增加 MHA 對網絡的容忍性,在調高壞包率的情況下,可觀測到 manager 節點沒有掛掉。

3.2 丟包場景

僅丟包場景下,達到 50% 纔開始切換。

測試說明:當前測試結果中,場景爲模擬丟包 50%,故障主機爲 manager 節點、主節點、從節點。ping_interval 參數值爲 3(默認值)時在測試時間內 MHA 發生切換。以上場景中,隨着 ping_interval 參數值的調大和配置 secondary_check_script 參數後在測試時間內 MHA 均沒有切換。

日誌輸出情況分析

ping_interval 日誌輸出信息

10.186.63.40(10.186.63.40:7788) (current master)
+--10.186.63.153(10.186.63.153:7788)
+--10.186.63.52(10.186.63.52:7788)
Thu Jan 28 16:18:17 2021 - [warning] master_ip_failover_script is not defined.
Thu Jan 28 16:18:17 2021 - [warning] shutdown_script is not defined.
Thu Jan 28 16:18:17 2021 - [info] Set master ping interval 3 seconds.
Thu Jan 28 16:18:17 2021 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
Thu Jan 28 16:18:17 2021 - [info] Starting ping health check on 10.186.63.40(10.186.63.40:7788)..
Thu Jan 28 16:18:17 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
Thu Jan 28 16:19:32 2021 - [warning] Got timeout on MySQL Ping(SELECT) child process and killed it! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 431.
Thu Jan 28 16:19:32 2021 - [info] Executing SSH check script: exit 0
Thu Jan 28 16:19:35 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Thu Jan 28 16:19:35 2021 - [warning] Connection failed 2 time(s)..
Thu Jan 28 16:19:37 2021 - [warning] HealthCheck: Got timeout on checking SSH connection to 10.186.63.40! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 342.
Thu Jan 28 16:19:38 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Thu Jan 28 16:19:38 2021 - [warning] Connection failed 3 time(s)..
Thu Jan 28 16:19:41 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Thu Jan 28 16:19:41 2021 - [warning] Connection failed 4 time(s)..
Thu Jan 28 16:19:41 2021 - [warning] Master is not reachable from health checker!
Thu Jan 28 16:19:41 2021 - [warning] Master 10.186.63.40(10.186.63.40:7788) is not reachable!
Thu Jan 28 16:19:41 2021 - [warning] SSH is NOT reachable.
Thu Jan 28 16:19:41 2021 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /data/masterha/app1.cnf again, and trying to connect to all servers to check server status..

說明:在配置參數 ping_interval 後,manager 日誌中可觀測到每 3 秒進行一次 ping 操作連接 MySQL 的主實例,3 次無法連接後,判定 master 故障,進行 manager 配置文件檢測,準備進行切換操作。

secondary_check_script 輸出日誌信息

10.186.63.40(10.186.63.40:7788) (current master)
+--10.186.63.153(10.186.63.153:7788)
+--10.186.63.52(10.186.63.52:7788)
Mon Jan 25 15:51:36 2021 - [warning] master_ip_failover_script is not defined.
Mon Jan 25 15:51:36 2021 - [warning] shutdown_script is not defined.
Mon Jan 25 15:51:36 2021 - [info] Set master ping interval 3 seconds.
Mon Jan 25 15:51:36 2021 - [info] Set secondary check script: masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
Mon Jan 25 15:51:36 2021 - [info] Starting ping health check on 10.186.63.40(10.186.63.40:7788)..
Mon Jan 25 15:51:39 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:51:39 2021 - [warning] Connection failed 1 time(s)..
Mon Jan 25 15:51:39 2021 - [info] Executing secondary network check script:masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
--user=root
--master_host=10.186.63.40
--master_ip=10.186.63.40
--master_port=7788
--master_user=mha --master_password=123456 --ping_type=SELECT
Mon Jan 25 15:51:39 2021 - [info] Executing SSH check script: exit 0 Master is reachable from 10.186.63.153!
Mon Jan 25 15:51:41 2021 - [warning] Master is reachable from at least one of other monitoring servers. Failover should not happen.
Mon Jan 25 15:51:44 2021 - [warning] HealthCheck: SSH to 10.186.63.40 is NOT reachable.
Mon Jan 25 15:51:46 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn'
t respond..
Mon Jan 25 15:51:46 2021 - [warning] Got error on MySQL select ping: 2006 (MySQL server has gone away)
Mon Jan 25 15:51:49 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:51:49 2021 - [warning] Connection failed 3 time(s)..
Mon Jan 25 15:51:52 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn'
t respond..
Mon Jan 25 15:56:12 2021 - [warning] Got timeout on MySQL Ping(SELECT) child process and killed it! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 431.
Mon Jan 25 15:56:12 2021 - [info] Executing secondary network check script:masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
--user=root
--master_host=10.186.63.40
--master_ip=10.186.63.40
--master_port=7788
--master_user=mha --master_password=123456 --ping_type=SELECT
...skipping...
Mon Jan 25 15:58:18 2021 - [info] Executing secondary network check script:
masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
--user=root
--master_host=10.186.63.40
--master_ip=10.186.63.40
--master_port=7788
--master_user=mha --master_password=123456 --ping_type=SELECT
Mon Jan 25 15:58:18 2021 - [info] Executing SSH check script: exit 0
Master is reachable from 10.186.63.153!
Mon Jan 25 15:58:20 2021 - [warning] Master is reachable from at least one of other
monitoring servers. Failover should not happen.
Mon Jan 25 15:58:21 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:21 2021 - [warning] Connection failed 2 time(s)..
Mon Jan 25 15:58:23 2021 - [warning] HealthCheck: Got timeout on checking SSH connection to 10.186.63.40! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 342.
Mon Jan 25 15:58:24 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:24 2021 - [warning] Connection failed 3 time(s)..
Mon Jan 25 15:58:27 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:27 2021 - [warning] Connection failed 4 time(s)..
Mon Jan 25 15:58:27 2021 - [warning] Secondary network check script returned errors.
Failover should not start so checking server status again. Check network settings for details.
Mon Jan 25 15:58:30 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:30 2021 - [warning] Connection failed 1 time(s)..
Mon Jan 25 15:58:30 2021 - [info] Executing secondary network check script:masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
--user=root
--master_host=10.186.63.40
--master_ip=10.186.63.40
--master_port=7788
--master_user=mha --master_password=123456 --ping_type=SELECT
Mon Jan 25 15:58:30 2021 - [info] Executing SSH check script: exit 0
Mon Jan 25 15:58:35 2021 - [warning] HealthCheck: Got timeout on checking SSH connection to 10.186.63.40! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 342.
Master is reachable from 10.186.63.153!
Mon Jan 25 15:58:37 2021 - [warning] Master is reachable from at least one of other monitoring servers. Failover should not happen.
Mon Jan 25 15:58:41 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
Mon Jan 25 15:58:44 2021 - [warning] Got timeout on MySQL Ping(SELECT) child process and killed it! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 431.
Mon Jan 25 15:58:47 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:47 2021 - [warning] Connection failed 3 time(s)..
Mon Jan 25 15:58:50 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:50 2021 - [warning] Connection failed 4 time(s)..
Mon Jan 25 15:58:50 2021 - [warning] Secondary network check script returned errors.
Failover should not start so checking server status again. Check network settings for details.
Mon Jan 25 15:58:53 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:53 2021 - [warning] Connection failed 1 time(s)..
Mon Jan 25 15:58:53 2021 - [info] Executing SSH check script: exit 0
Mon Jan 25 15:58:53 2021 - [info] Executing secondary network check script:masterha_secondary_check -s 10.186.63.153 -s 10.186.63.52
--user=root
--master_host=10.186.63.40
--master_ip=10.186.63.40
--master_port=7788
--master_user=mha --master_password=123456 --ping_type=SELECT
Mon Jan 25 15:58:56 2021 - [warning] Got error on MySQL connect: 2003 (Can't connect to MySQL server on '10.186.63.40' (4))
Mon Jan 25 15:58:56 2021 - [warning] Connection failed 2 time(s)..
Mon Jan 25 15:58:58 2021 - [warning] HealthCheck: Got timeout on checking SSH
connection to 10.186.63.40! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 342.
Mon Jan 25 15:58:59 2021 - [warning] Got error on MySQL connect: 2003 (Can'
t connect to MySQL server on '10.186.63.40' (4))

說明:在配置參數 secondary_check_script 後的 manager 日誌中可觀測到 MHA多次進行二次網絡連接檢測。


測試結論

根據以上單變量實驗測試,在壞包丟包的場景下,從 manager 日誌中可判斷:參數 ping_interval 和 secondary_check_script 在網絡情況較差時,可延長 MHA 的判斷時間和抑制切換頻率。 MHA 集羣在網絡環境較差時,網絡容忍性有所提高。但無法保證 MHA 不發生切換。

  • 當前測試環境與生產存在差異,測試結果也有一定的隨機概率,以上測試結果供參考。

  • secondary_check_script 參數可以使 manager 有更多的網絡連接策略去判斷主從之間的網絡連通性,可以在很大程度上提高 MHA 的網絡容忍性。

  • ping_interval 參數值提高會增加 MHA 對於故障的判斷時間,可根據業務程度的不同,對故障容忍時間的不同進行調整。

    參數弊端:將 ping_interval 的值增大,MHA 對於 MySQL master 節點的檢測故障時間將會延長。


下期預告

關於 secondary_check_script 參數的具體說明,以及相關網絡故障的模擬測試。


相關推薦:

故障分析 | 全局讀鎖一直沒有釋放,發生了什麼?




社區近期動態




本文關鍵字: #MHA# #網絡#
  點一下“閱讀原文”瞭解更多資訊

本文分享自微信公衆號 - 愛可生開源社區(ActiontechOSS)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章