- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯系小編並注明來源。
1. 為什么是MGR
MGR是MySQL Group Replication的縮寫,即MySQL組復制。
在以往,我們一般是利用MySQL的主從復制或半同步復制來提供高可用解決方案,但這存在以下幾個比較嚴重的問題:
- 主從復制間容易發生復制延遲,尤其是在5.6以前的版本,以及當數據庫實例中存在沒有顯式主鍵表時,很容易發生。
- 主從復制節點間的數據一致性無法自行實現最終一致性。
- 當主節點發生故障時,如果有多個從節點,無法自動從中選擇合適的節點作為新的主節點。
- 如果采用(增強)半同步復制,那么當有個從節點因為負載較高、網絡延遲或其他意外因素使得事務無法及時確認時,也會反過來影響主節點的事務提交。
因為上述幾個明顯的缺點,因此MySQL推出了全新的高可用解決方案 -- 組復制,這是本系列文章要着重介紹的新特性。
MGR是MySQL 5.7.17開始引入的,但隨着5.7版本逐漸退出歷史舞台(MySQL 5.7已於2020年10月起不再做大的功能更新,只有修修補補以及針對安全更新),更多MGR相關特性都只在MySQL 8.0上才有。
因此,如果線上還有基於MySQL 5.7版本的MGR環境的話,建議盡快升級、遷移到MySQL 8.0版本。進一步提醒,推薦MySQL 8.0.22及之后的版本,整體會更穩定可靠,也有些很不錯的新功能(不只是MGR方面的)。
2. MGR技術概要
MGR具備以下幾個特點:
- 基於shared-nothing模式,所有節點都有一份完整數據,發生故障時可以直接切換。
- MGR提供了數據一致性保障,默認是最終一致性,可根據業務特征需要自行調整一致性級別。
- 支持在線添加、刪除節點,節點管理更方便。
- 支持故障自動檢測及自動切換,發生故障時能自動切換到新的主節點,再配合MySQL Router中間件,應用層無需干預或調整。
- 支持單節點、多節點寫入兩種模式,可根據架構或業務需要選擇哪種方案,不過強烈建議選用單主模式。
MGR可以選擇單主(Single-Primary)模式

如上圖所示,一開始S1節點是Primary角色,提供讀寫服務。當它發生故障時,剩下的S2-S5節點會再投票選舉出S2作為新的Primary角色提供讀寫服務,而S1節點再達到一定超時閾值后,就會被踢出。
亦可選擇多主(Multi-Primary)模式(再次強烈建議選用單主模式)

如上圖所示,一開始S1-S5所有節點都是Primary角色,都可以提供讀寫服務,任何一個節點發生故障時,只需要把指向這個節點的流量切換下就行。
上述兩種架構模式下,應用端通過MySQL Router連接后端在MGR服務,當后端節點發生切換時,Router會自動感知,對應用端來說幾乎是透明的,影響很小,架構上也更靈活。
3. MGR技術架構
首先來個MGR的技術架構圖:

MGR是以Plugin方式嵌入MySQL,部署更靈活方便。
事務從Server層通過鈎子(hook)進入MGR API接口層,再分發到各組件層,在組件層完成事務Capture/Apply/Recover,通過復制協議層(Replication Protocol Logics)傳輸事務,最后經由GCS協調事務在各節點的最終一致性。
MGR節點間由組通信系統(GCS)提供支持,它提供了故障檢測機制、組成員角色管理,以及安全且有序的消息傳遞,這些機制可確保在各節點間一致地復制數據。這項技術的核心是Paxos算法的實現,在MySQL里稱之為XCom,由它充當MGR的通信引擎。
對於要提交的事務,組中的多數派節點必須就全局事務序列中給定的事務順序達成一致。各節點做出決定提交或中止事務的選擇,但所有節點都要做出相同的決定。如果發生網絡分區,導致節點間無法達成一致決定,則在網絡恢復前,MGR無法工作。
MGR支持單主和多主兩種模式,在單主模式下,各節點會自動選定主節點,只有該主節點能同時讀寫,而其他(從)節點只能只讀。在多主模式下,所有節點都可以進行讀寫。
相對於MariaDB Galera Cluster(以及基於此技術的Percona XtraDB Cluster,下面為了書寫方便,都統稱為PXC),個人認為MGR具備以下幾個優勢:
- PXC的消息廣播機制是在節點間循環的,需要所有節點都確認消息,因此只要有一個節點故障,則會導致整個PXC都發生故障。而MGR則是多數派投票模式,個別少數派節點故障時,一般不影響整體的可用性。這也是PXC存在的最大問題。
- PXC的節點間數據傳輸除了binlog,還有個gcache,這相當於是給MySQL又增加兩個黑盒子。而MGR則都是基於原生binlog的,沒有新增黑盒子,運行起來更可靠,需要排障時也更方便。
- 發生網絡分區時,整個PXC集群都不可用。而MGR則至少還能提供只讀服務。
- PXC的流控機制影響更大,一旦觸發流控,所有節點都受到影響。而MGR觸發流控后,只會影響本地節點,不影響遠程節點。當然了,MySQL的流控做的也比較粗糙,在GreatSQL中進一步完善和優化。
- 執行DDL期間,整個PXC集群都不可同時執行DML,也就是說不支持Online DDL。而MGR是支持的,這也是很大的優勢。
相對於傳統主從復制(Replication),我認為MGR的優勢有以下幾點:
- 主從復制非常容易產生復制延遲,尤其是當表中沒有顯式主鍵時。而在MGR里,要求表一定要有主鍵(或是可用作聚集索引的非空唯一索引),避免了這個問題。
- 半同步復制中,一旦slave因為鎖或其他原因響應慢的話,也會導致master事務被阻塞。MGR是采用多數派確認機制,個別節點響應慢對Primary節點的影響沒那么大(不要選用AFTER模式)。
- 主從復制沒有類似MGR那樣提供事務數據的一致性保證。MGR自帶了事務數據一致性保障機制。
以上是我根據MySQL、MariaDB、Percona的資料整理得到的觀點,不一定准確和全面,有不完善的地方還請留言指正。
4. 小結
本節主要介紹了什么是MGR,MGR的技術架構概要,以及MGR相對PXC的幾個技術優勢。
MGR是MySQL四部戰略走的關鍵一環,依靠MGR和MySQL Shell、MySQL Router已實現了讀節點擴展,以及寫節點擴展(MGR多主模式),下一步預計實現sharding,讓我們拭目以待。
相信MGR也是MySQL未來幾年的重頭戲,建議跟緊方向,不要錯過這班列車。
參考資料、文檔
免責聲明
因個人水平有限,專欄中難免存在錯漏之處,請勿直接復制文檔中的命令、方法直接應用於線上生產環境。請讀者們務必先充分理解並在測試環境驗證通過后方可正式實施,避免造成生產環境的破壞或損害。
Enjoy GreatSQL 😃
文章推薦:
GreatSQL季報(2021.12.26)
https://mp.weixin.qq.com/s/FZ_zSBHflwloHtZ38YJxbA
技術分享|sysbench 壓測工具用法淺析
https://mp.weixin.qq.com/s/m16LwXWy9bFt0i99HjbRsw
故障分析 | linux 磁盤io利用率高,分析的正確姿勢
https://mp.weixin.qq.com/s/7cu_36jfsjZp1EkVexkojw
技術分享|閃回在MySQL中的實現和改進
https://mp.weixin.qq.com/s/6jepwEE0DnYUpjMYO17VtQ
萬答#20,索引下推如何進行數據過濾
https://mp.weixin.qq.com/s/pt6mr3Ge1ya2aa6WlrpIvQ
關於 GreatSQL
GreatSQL是由萬里數據庫維護的MySQL分支,專注於提升MGR可靠性及性能,支持InnoDB並行查詢特性,是適用於金融級應用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
Bilibili:
https://space.bilibili.com/1363850082/video
微信&QQ群:
可搜索添加GreatSQL社區助手微信好友,發送驗證信息“加群”加入GreatSQL/MGR交流微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多發平台 OpenWrite 發布!
