【恩墨學院】美團點評資料庫高可用架構的演進與設想
[恩墨學院]美團點評資料庫高可用架構的演進與設想
金龍
本文介紹最近幾年美團點評MySQL資料庫高可用架構的演進過程,以及在開源技術基礎上做的一些創新。同時,也和業界其它方案進行綜合對比,瞭解業界在高可用方面的進展,和未來美團的一些規劃和展望。
本文由美團點評技術團隊微信公眾號授權轉發。
MMM
在2015年之前,美團點評(點評側)長期使用MMM(Master-Master replication manager for MySQL)做資料庫高可用,積累了比較多的經驗,也踩了不少坑,可以說MMM在公司資料庫高速發展過程中起到了很大的作用。
MMM的架構如下:
如上所示,整個MySQL叢集提供1個寫VIP (Virtual IP)和N(N>=1)個讀VIP提供對外服務。每個MySQL節點均部署有一個Agent(mmm-agent),mmm-agent和mmm-manager保持通訊狀態,定期向mmm-manager上報當前MySQL節點的存活情況(這裡稱之為心跳)。當mmm-manager連續多次無法收到mmm-agent的心跳訊息時,會進行切換操作。
mmm-manager分兩種情況處理出現的異常:
1. 出現異常的是從節點
o mmm-manager會嘗試摘掉該從節點的讀VIP,並將該讀VIP漂移到其它存活的節點上,透過這種方式實現從庫的高可用。
2. 出現異常的是主節點
o 如果當時節點還沒完全掛,只是響應超時。則嘗試將Dead Master加上全域性鎖(flush tables with read lock)。
o 在從節點中選擇一個候選主節點作為新的主節點,進行資料補齊。
o 資料補齊之後,摘掉Dead Master的寫VIP,並嘗試加到新的主節點上。
o 將其它存活的節點進行資料補齊,並重新掛載在新的主節點上。
主庫發生故障後,整個叢集狀態變化如下:
mmm-manager檢測到master1發生了故障,對資料進行補齊之後,將寫VIP漂移到了master2上,應用寫操作在新的節點上繼續進行。
然而,MMM架構存在如下問題:
· VIP的數量過多,管理困難(曾經有一個叢集是1主6從,共計7個VIP)。某些情況下會導致叢集大部分VIP同時丟失,很難分清節點上之前使用的是哪個VIP。
· mmm-agent過度敏感,容易導致VIP丟失。同時mmm-agent自身由於沒有高可用,一旦掛掉,會造成mmm-manager誤判,誤認為MySQL節點異常。
· mmm-manager存在單點,一旦由於某些原因掛掉,整個叢集就失去了高可用。
· VIP需要使用ARP協議,跨網段、跨機房的高可用基本無法實現,保障能力有限。
同時,MMM是Google技術團隊開發的一款比較老的高可用產品,在業內使用的並不多,社群也不活躍,Google很早就不再維護MMM的程式碼分支。我們在使用過程中發現大量Bug,部分Bug我們做了修改,並提交到開源社群,有興趣的同學可以參考這裡。
MHA
針對於此,從2015年開始,美團點評對MySQL高可用架構進行了改進,全部更新為MHA,很大程度上解決了之前MMM遇到的各種問題。
MHA(MySQL Master High Availability)是由Facebook工程師Yoshinori Matsunobu開發的一款MySQL高可用軟體。從名字就可以看出,MHA只負責MySQL主庫的高可用。主庫發生故障時,MHA會選擇一個資料最接近原主庫的候選主節點(這裡只有一個從節點,所以該從節點即為候選主節點)作為新的主節點,並補齊和之前Dead Master 差異的Binlog。資料補齊之後,即將寫VIP漂移到新主庫上。
整個MHA的架構如下(為簡單起見,只描述一主一從):
這裡我們對MHA做了一些最佳化,避免一些腦裂問題。
比如DB伺服器的上聯交換機出現了抖動,導致主庫無法訪問,被管理節點判定為故障,觸發MHA切換,VIP被漂到了新主庫上。隨後交換機恢復,主庫可被訪問,但由於VIP並沒有從主庫上摘除,因此2臺機器同時擁有VIP,會產生腦裂。我們對MHA Manager加入了相同機架上其他物理機的探測,透過對比更多的資訊來判斷是網路故障還是單機故障。
MHA+Zebra(DAL)
Zebra(斑馬)是美團點評基礎架構團隊開發的一個Java資料庫訪問中介軟體,是在c3p0基礎上包裝的美團點評內部使用的動態資料來源,包括讀寫分離、分庫分表、SQL流控等非常強的功能。它和MHA配合,成為了MySQL資料庫高可用的重要一環。如下是MHA+Zebra配合的整體架構:
還是以主庫發生故障為例,處理邏輯有如下兩種方式:
· 當MHA切換完成之後,主動傳送訊息給Zebra monitor,Zebra monitor更新ZooKeeper的配置,將主庫上配置的讀流量標記為下線狀態。
· Zebra monitor每隔一段時間(10s ~ 40s)檢測叢集中節點的健康狀況,一旦發現某個節點出現了問題,及時重新整理ZooKeeper中的配置,將該節點標記為下線。
一旦節點變更完成,客戶端監聽到節點發生了變更,會立即使用新的配置重建連線,而老的連線會逐步關閉。整個叢集故障切換的過程如下(僅描述Zebra monitor主動探測的情況,第一種MHA通知請自行腦補^_^)。
由於該切換過程還是藉助於VIP漂移,導致只能在同網段或者說同個二層交換機下進行,無法做到跨網段或者跨機房的高可用。為解決這個問題,我們對MHA進行了二次開發,將MHA新增VIP的操作去掉,切換完之後通知Zebra monitor去重新調整節點的讀寫資訊(將Write調整為new master的實IP,將Dead Master的讀流量摘除),整個切換就完全去VIP化,做到跨網段、甚至跨機房切換,徹底解決之前高可用僅侷限於同網段的問題。上述切換過程就變成了如下圖:
然而,這種方式中的MHA管理節點是單點,在網路故障或者機器當機情況下依然存在風險。同時,由於Master-Slave之間是基於Binlog的非同步複製,也就導致了主庫機器當機或者主庫無法訪問時,MHA切換過程中可能導致資料丟失。
另外,當Master-Slave延遲太大時,也會給資料補齊這一操作帶來額外的時間開銷。
Proxy
除了Zebra中介軟體,美團點評還有一套基於Proxy的中介軟體,和MHA一起配合使用。當MHA切換後,主動通知Proxy來進行讀寫流量調整,Proxy相比Zebra更加靈活,同時也能覆蓋非Java應用場景。缺點就是訪問鏈路多了一層,對應的Response Time和故障率也有一定增加。有興趣的同學們可以自行前往GitHub查詢詳細文件。
未來架構設想
上文提到的MHA架構依然存在如下兩個問題:
· 管理節點單點。
· MySQL非同步複製中的資料丟失。
針對於此,我們在部分核心業務上使用Semi-Sync,可以保證95%以上場景下資料不丟失(依然存在一些極端情況下無法保障資料的強一致性)。另外,高可用使用分散式的Agent,在某個節點發生故障後,透過一定的選舉協議來選擇新的Master,從而解決了MHA Manager的單點問題。
針對上述問題,我們研究了業界的一些領先的做法,簡單描述如下。
主從同步資料丟失
針對主從同步的資料丟失,一種做法是建立一個Binlog Server,該Server模擬Slave接受Binlog日誌,主庫每次的資料寫入都需要接收到Binlog Server的ACK應答,才認為寫入成功。Binlog Server可以部署在就近的物理節點上,從而保證每次資料寫入都能快速落地到Binlog Server。在發生故障時,只需要從Binlog Server拉取資料即可保證資料不丟失。
分散式Agent高可用
針對MHA管理節點單點問題,一種做法是讓MySQL資料庫叢集中每個節點部署Agent,發生故障時每個Agent均參與選舉投票,選舉出合適的Slave作為新的主庫,防止只透過Manager來切換,去除MHA單點。整個架構如下圖所示。
MGB結合中介軟體高可用
上述方式某種程度上解決了之前的問題,但是Agent和Binlog Server卻是新引入的風險,同時Binlog Server的存在,也帶來了響應時間上的額外開銷。有沒有一種方式,能夠去除Binlog Server和Agent,又能保證資料不丟失呢 ?答案當然是有的。
最近幾年,MySQL社群關於分散式協議Raft和Paxos非常火,社群也推出了基於Paxos的MGR版本的MySQL,透過Paxos將一致性和切換過程下推到資料庫內部,向上層遮蔽了切換細節。架構如下(以MGR的single-primary為例)。
當資料庫發生故障時,MySQL內部自己進行切換。切換完成後將topo結構推送給Zebra monitor,Zebra monitor進行相應的讀寫流量變更。不過,該架構存在與Binlog Server同樣的需要回復確認問題,就是每次主庫資料寫入,都需要大多數節點回復ACK,該次寫入才算成功,存在一定的響應時間開銷。同時,每個MGR叢集必須需要奇數個數(大於1)的節點,導致原先只需要一主一從兩臺機器,現在需要至少三臺,帶來一定的資源浪費。但不管怎麼說,MGR的出現是無疑是MySQL資料庫又一次偉大的創新。
總結
本文介紹了美團點評MySQL資料庫高可用架構從MMM到MHA+Zebra以及MHA+Proxy的演進歷程,同時也介紹了業界一些高可用的做法。資料庫最近幾年發展突飛猛進,資料庫的高可用設計上沒有完美的方案,只有不斷的突破和創新,我們也一直在這條路上探索更加優秀的設計與更加完美的方案。
恩墨學院隸屬於雲和恩墨(北京)資訊科技有限公司,致力於提供專業高水準的與大資料培訓服務,挖掘培養大資料與資料庫人才。恩墨學院提供包括個人實戰技能培訓、個人認證培訓、企業內訓在內的全方位大資料和資料庫技術培訓。ACE級別超強師資,配備專業實驗室,沉浸式學習與訓練,專業實驗室、配備專業助教指導訓練。能迅速融入專家圈子,業內資源豐富,迅速積累職場人脈。課程包括:班、Oracle 、Oracle OCP考試等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28530558/viewspace-2152667/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【恩墨學院】架構設計 | 什麼是網際網路架構“高可用”?架構
- MySQL資料庫架構——高可用演進MySql資料庫架構
- 【恩墨學院】摩拜物聯網架構演進之路|資料與架構齊驅,看摩拜創造奇蹟架構
- 【恩墨學院】深度學習在美團點評推薦平臺排序中的運用深度學習排序
- 【恩墨學院】資料架構:中國電信的Oracle Sharding架構應用案例分析架構Oracle
- 【恩墨學院】恩墨學院獲得Oracle WDP全國授權Oracle
- 郭憶:網易資料庫高可用架構最新進展!資料庫架構
- 【恩墨學院】原來銀行都在用這些資料庫資料庫
- 【恩墨學院】基於裸資料的異地資料庫效能診斷與最佳化資料庫
- 【恩墨學院】資料架構:從AT&T到青海移動的多租戶資料整合實踐架構
- 美團實時數倉架構演進與建設實踐架構
- 【恩墨學院】阿里雲資料庫CloudDBA的自動運維與智慧最佳化探索阿里資料庫Cloud運維
- 今日頭條架構演進之路 — 高壓下的架構演進架構
- 【恩墨學院】IT基礎架構變革在路上:青海移動的去“IE”之旅架構
- 美團配送系統架構演進實踐架構
- 資料治理:資料整合架構的演進架構
- 今日頭條架構演進之路——高壓下的架構演進專題架構
- 技術架構分享:美團配送系統架構演進實踐架構
- 高可用:美團點評智慧支付核心交易系統的可用性實踐
- 【恩墨學院】Bad Rabbit病毒引發的企業資料安全的思考與應對方案
- MySQL資料庫實現高可用架構之MHA的實戰MySql資料庫架構
- 【恩墨學院】從資料庫建立深入學習Oracle技術:那些年 mkplug 偷偷執行的Plugin操作資料庫OraclePlugin
- 【恩墨學院】深入剖析 Group Replication核心的引擎特性
- 資深架構師談Redis高可用架構的應用及改進架構Redis
- 【恩墨學院】空與非空 EMPTY_LOB和NULL的區別Null
- 愛奇藝平臺的架構設計與演進之路架構
- 【恩墨學院】5 分鐘帶你看懂 DockerDocker
- 高可用架構架構
- 架構的演進架構
- 高效能、高可用平臺架構演變史架構
- 分散式資料庫的架構演變之路分散式資料庫架構
- MySQL資料庫各場景主從高可用架構實戰MySql資料庫架構
- MySQL高可用架構設計分析MySql架構
- 學習"大眾點評網的架構設計與實踐"架構
- Serverless 架構演進與實踐Server架構
- 服務拆分與架構演進架構
- 【恩墨學院】如何理解並正確使用MySql索引MySql索引
- 【恩墨學院】京東618大促閘道器承載十億呼叫量背後的架構實踐架構