作者:毛思平
工作11年,從事數據庫工作7年,主要在金融行業。主要是做oracle,MySQL。現在在農行軟開中心主要做數據庫應用方面的研究。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
近期投產生產 MySQL組復制集群偶爾出現節點被逐出集群的情況,懷疑是網絡抖動導致。查詢官方文檔發現,MySQL 8.0.13 版本引入集群網絡延遲容錯參數group_replication_member_expel_timeout。
該參數的官方解釋:
翻譯:
group_replication_member_expel_timeout 指定組復制組成員在產生懷疑之后,從組中排除懷疑失敗的成員之前等待的時間(以秒為單位)。在產生懷疑之前的最初 5 秒檢測時間不計入該時間。直到并包括 MySQL 8.0.20 在內,group_replication_member_expel_timeout 默認值均為 0,這意味著沒有等待時間,并且在 5 秒鐘的檢測時間結束后,可疑成員應立即被驅逐。從 MySQL 8.0.21 開始,該值默認為 5,這意味著在 5 秒鐘的檢測時間后如果該節點還是不正常,那會在等 5 秒鐘,如果可疑成員還是不正常,超過這個時間將被驅逐。
為驗證該參數對集群影響,我們通過實驗模擬不同時長的網絡延遲,然后調整group_replication_member_expel_timeout 值觀察該參數值對集群驅逐故障節點的影響。
測試環境如下:
測試方法:
1、設置各節點 group_replication_member_expel_timeout 值Y。
2、在節點模擬網絡斷開并設置斷開時長X。
3、待網絡恢復后查看各節點數據庫日志,記錄數據庫狀態變化及變化時間。
4、登陸數據庫查看集群狀態。
5、記錄測試結果。
6、分別調整Y值或X值循環1-5步,循環測試。
測試命令:
-- 模擬網絡延時
# tc qdisc add dev eth0 root netem delay 10s
-- 查看集群狀態
mysql> select * from performance_schema.replication_group_member_stats;
-- 查看數據庫日志
# tail -f mysqld.log
測試過程:
1.首先設置各節點 group_replication_member_expel_timeout 值5;
2.設置網絡延遲前檢查集群狀態
3.在 mgr2 節點通過tc模擬網絡延遲為 10 秒,并記錄開始時間;
4.通過 mgr1 節點查看集群狀態,先開始集群狀態是 UNREACHABLE(故障檢測過程懷疑無法聯系該成員,因為組消息已超時。),后面節點超時后被踢出集群;
5.通過觀察 mgr2 節點的錯誤日志,在 14:08:50,也就是設置延遲 6 秒鐘后,mgr2 節點無法訪問 mgr1、mgr3 兩個節點;在 14:08:54,與 mgr3 節點雙向連接出現問題,說明在檢測期 + group_replication_member_expel_timeout 這個 10 秒的周期內,mgr2 與其他節點無法聯系,被踢出集群;
6.在 mgr2 節點取消 tc 模擬網絡延遲 tc qdisc del dev eth0 root
7.在網絡恢復后,mgr2 節點由于 auto-rejoin 機制,嘗試重新加入集群,并通過 binlog 恢復數據,數據和其他節點一致后,恢復正常;
注意:如果網絡延遲長時間未恢復,故障節點會出現 ERROR 狀態,這時需要通過重啟組復制,進行恢復;
測試結果:
參數設置建議:
從目前測試結果來看,參數 group_replication_member_expel_timeout 的設置能避免數據庫集群間出現網絡延遲時,延遲節點被立即逐出集群。考慮到數據庫繁忙期間無法及時響應其他節點探測的情況或者數據庫變更關閉節點情況,該值建議初始設置為5,正常網絡延遲都在1秒以內,如果出現故障要設置這個超時退出的時間,建議先ping一下ip,確定網絡延遲情況,在進行設置。
需要注意:
1.如果退出超時時間設置過長,要確保 XCom 的消息緩存足夠大,可以容納指定時間段以及初始5秒檢測時間段內的預期消息量,否則成員將無法重新連接;可以使用group_replication_message_cache_size 系統變量來調整緩存大小限制。
2.如果網絡恢復后,故障節點會嘗試自動加入集群,從 MySQL 8.0.21 開始,默認是3次,這意味著該成員自動進行3次嘗試重新加入集群,每次間隔5分鐘;可以通過group_replication_autorejoin_tries 這個參數調整嘗試自動加入集群的次數。
參考資料
- https://dev.mysql.com/doc/refman/8.0/en/group-replication-responses-failure-expel.html
- https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html
- https://mp.weixin.qq.com/s/DPFmCGmEfubRWpoikbY-XQ