
前言
MySQL具有開源免費,運維簡單,性能好等優點,是在汽車之家使用最多的一種資料庫,資料庫作為應用的后端存盤,承擔著資料持久化存盤的功能,是應用可以正常對外提供服務的關鍵組件,資料庫的高可用非常重要,
相對于成熟的商業資料庫軟體,開源的 MySQL高可用需要使用者自己進行設計和研發,本文介紹汽車之家MySQL高可用架構發展歷程,建設實踐情況,
一、高可用定義及度量
在介紹MySQL高可用前,先介紹下高可用定義及關鍵度量指標RPO,RTO,
高可用定義:高可用(High Availability,縮寫HA)是一個IT術語,指系統無中斷執行其功能的能力,代表系統的可用性程度,
高可用度量指標:
-
RPO:RPO(Recovery Point Obejective,恢復點目標)是指業務系統所允許的在災難程序中的最大資料丟失量,用來衡量容災系統的資料冗余備份能力,

圖1 RPO計算
-
RTO :RTO(Recovery Time Objective,恢復時間目標)是指資訊系統從災難狀態恢復到可運行狀態所需的時間,用來衡量容災系統的業務恢復能力,

圖2 RTO計算
二、MySQL高可用問題
MySQL高可用問題:如果MySQL資料庫發生宕機故障,是否可以實作資料庫服務不中斷或者故障快速恢復,即實作資料不丟失(RPO)并且故障恢復時間短(RTO)?
故障是難免的,一個可靠的系統需要資料冗余來避免單點故障帶來的資料丟失,提升可靠性,
雖然MySQL有MySQL NDB Cluster, PXC(Percona XtraDB Cluster)等集群架構,但是MySQL主從架構因為結構簡單且成本較低,是最使用廣泛的MySQL架構,MySQL主從架構通過主從復制技術來實作主庫的資料冗余,當主庫故障可以把服務切換到從庫,來避免資料庫服務中斷,
MySQL主從架構的高可用:

圖3 MySQL主從架構
一個典型場景如圖3,MySQL使用主從架構對外提供服務,圖中主庫Master有三個從庫分別是slave1,slave2,slave3,若是主庫故障,為了恢復DB服務,可以選擇一個從庫(slave1)成為新主庫繼續對外提供服務,原slave2,slave3改同步新主庫的資料,
MySQL是一個有資料有狀態的服務,通常主庫寫入資料,通過異步復制二進制日志到從庫執行,來實作主從庫的資料一致性,當故障發生時,如何實作資料不丟失,各節點資料一致,業務影響小會有一定難度及挑戰,
1)挑戰1:如何實作主庫突然故障,主庫資料不丟失?
假想主庫故障突然發生,從庫還沒有接收到主庫的二進制日志,此時就有可能引起資料丟失,
2)挑戰2:如何實作故障后新主從庫架構的搭建及資料一致性保證?
多個從庫對主庫進行復制,有可能各從庫對主庫復制有不同的時延,各從庫之間如何實作資料一致,各節點如何搭建成新的主從架構?
3)挑戰3:如何實作故障自動Failover及業務影響最小?
若DB故障發生,如何讓業務影響最小,甚至無感知,需要"自動故障轉移"來支持,
一個真實線上可以使用的MySQL高可用架構需要考慮如下作業,

圖4 MySQL高可用相關作業
三、常見的MySQL高可用架構
本節介紹幾種常見的MySQL高可用架構,

圖5 主從復制+VIP
MHA(Master High Availability) 是一種相對成熟的MySQL高可用解決方案,MHA是獨立于MySQL的第三方軟體,當主庫故障發生后,MHA會盡最大努力來保證資料不丟失(若原主庫可以登錄,MHA會傳輸二進制日志到從庫節點并執行),并且完成新主從架構的搭建,

圖6 主從復制+MHA
MySQL Group Replication(簡稱MGR)是MySQL5.7版本出現的新特性,提供高可用、高擴展、高可靠,強一致性的MySQL集群服務,MGR架構由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點(N / 2 + 1)決議并通過,才能得以提交,解決了傳統復制可能的資料不一致的問題,
MGR+Proxy高可用架構:雖然MGR可以在主節點故障選舉出新主,但應用層常不能自動修改配置中DB地址為新主IP,可使用MGR+Proxy來實作主節點故障時應用無感應自動切換到新的主節點,

圖7 MGR復制+Proxy
四、汽車之家MySQL高可用實踐
汽車之家MySQL高可用發展可以分成三個階段:
1)主從復制+VIP 時代:2016年前使用傳統主從復制+VIP/DNS,主庫故障通過VIP自動漂移,DBA手動呼叫腳本進行主從架構切換及域名切換,
2)主從復制+MHA時代:2016年MHA在汽車之家核心業務開始使用,實作了核心業務的故障自動切換,但是此時并沒有自動化高可用平臺來管理資料庫,
3)MGR+自動化平臺時代:2020年MGR高可用架構在汽車之家推廣應用,MGR基于paxos協議的組復制技術保證各節點資料一致性,簡化了主庫故障切換作業,另外資料庫自動化高可用平臺上線,讓汽車之家的MySQL高可用水平得到很大提升,

圖8 汽車之家MySQL高可用發展歷程
1)高可用運維平臺架構
一個高可用系統需要解決兩個問題:如何發現故障?故障發生后如何處理故障?具體到MySQL資料庫的高可用,因為故障恢復細節和MySQL架構有較強關聯,設計者需要重點考慮三個方面:
-
故障發現:如何發生準確,快速的發現DB故障,不誤報錯報,
-
高可用架構:如何選擇合適的MySQL高可用架構來處理故障的資料一致性問題,
-
故障自動化Failover:如何實作"自動故障轉移"來保證DB服務的快速恢復?

圖9 MySQL高可用設計
汽車之家MySQL高可用實作架構圖:

圖10 MySQL高可用實作架構圖
汽車之家MySQL高可用由MGR復制架構+監控平臺+自動化運維平臺三者來實作,
-
MGR高可用架構:MGR使用基于paxos協議的組復制,主庫的事務在從庫中會至少存在一份記錄,從而保證故障時資料不會丟失,并且 MGR主庫故障會自動選擇新主庫,進一步級訓了主庫故障切換作業,
-
監控平臺:基于Prometheus的監控平臺對DB狀態實時監控,若是發現主庫故障將呼叫資料庫運維平臺相關API,
-
自動化運維平臺:運維平臺中的高可用模塊負責故障的自動Failover,高可用模塊會確認DB狀態,故障恢復時新DB集群搭建,修改原來主庫域名后端DB IP等作業,最終實作了主庫故障對應用影響的盡量透明,
圖10的高可用架構圖,描述了經典環境下MySQL高可用實作,監控平臺持續探測主庫狀態,若連續探測3次均發現主庫故障,則呼叫運維平臺的高可用模塊API,發起主庫切換,可以在2-3分鐘內完成FailOver,
2)容器布署MySQL高可用
汽車之家有大量MySQL跑在k8S容器上,容器布署MySQL的高可用實作和物理機布署類似,主要區別是容器MySQL的主庫故障監控由MySQL-Operator負責,而不是外部監控平臺,

圖11 容器布署MySQL高可用實作
容器MySQL-Operator每10秒探測一次MGR主庫狀態,若連續探測3次均為故障,將呼叫運維平臺的高可用模塊API,發起主庫切換,通常可以在1-2分鐘內完成FailOver,
汽車之家MySQL高可用建設,未來計劃做如下作業:
1)網路抖動或大事務有時會引起MySQL集群的主從庫自動切換,計劃進一步調優改進,
2)資料庫故障智能自愈是一個較熱的方向,計劃研究并應用實踐提升資料庫的穩定性,
五、結語
本文介紹了常見的MySQL高可用架構,并重點介紹了汽車之家MySQL高可用體系發展歷程,高可用建設實踐情況,
汽車之家MySQL高可用使用MGR復制架構+自動化運維平臺,實作了物理機及容器MySQL主庫故障的自動Failover,若MySQL主庫down,可以在2-3分鐘內完成主庫的故障切換,資料庫服務的穩定性得到了很好保障,
作者|?潭訓祥
本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/AutoHome-MySQL-High-Availability-Construction-Practice.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/542648.html
標籤:MySQL
