歡迎關注我的頭條號:Wooola,10年JAVA軟件開發及架構設計經驗,專注于Java、Golang、微服務架構,致力于每天分享原創文章、快樂編碼和開源技術。
MGR簡介
MySQL Group Replication(下簡稱:MGR)是MySQL官方推出的一種基于Paxos協議的狀態機復制。在MGR出現之前,用戶常見的MySQL高可用方式,無論怎么變化架構,本質就是Master-Slave架構。MySQL 5.7版本開始支持無損半同步復制(lossless semi-sync replication),從而進一步提示數據復制的強一致性。
MGR與其他復制的對比介紹
MySQL異步復制
master事務的提交不需要經過slave的確認,slave是否接收到master的binlog,master并不care。slave接收到master binlog后先寫relay log,最后異步地去執行relay log中的sql應用到自身。由于master的提交不需要確保slave relay log是否被正確接受,當slave接受master binlog失敗或者relay log應用失敗,master無法感知。
假設master發生宕機并且binlog還沒來得及被slave接收,而切換程序將slave提升為新的master,就會出現數據不一致的情況!另外,在高并發的情況下,傳統的主從復制,從節點可能會與主產生較大的延遲(當然mysql后續版本陸續做了優化,推出了并行復制,以此降低異步復制的延遲)
MySQL半同步復制
基于傳統異步存在的缺陷,mysql在5.5版本推出半同步復制。可以說半同步復制是傳統異步復制的改進,在master事務的commit之前,必須確保一個slave收到relay log并且響應給master以后,才能進行事務的commit。但是slave對于relay log的應用仍然是異步進行的,原理如下圖所示:
MySQL組復制
基于傳統異步復制和半同步復制的缺陷——數據的一致性問題無法保證,MySQL官方在5.7.17版本正式推出組復制(MySQL Group Replication,簡稱MGR)。
由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點(N / 2 + 1)決議并通過,才能得以提交。如上圖所示,由3個節點組成一個復制組,Consensus層為一致性協議層,在事務提交過程中,發生組間通訊,由2個節點決議(certify)通過這個事務,事務才能夠最終得以提交并響應。
引入組復制,主要是為了解決傳統異步復制和半同步復制可能產生數據不一致的問題。組復制依靠分布式一致性協議(Paxos協議的變體),實現了分布式下數據的最終一致性,提供了真正的數據高可用方案(是否真正高可用還有待商榷)。其提供的多寫方案,給我們實現多活方案帶來了希望。
一個復制組由若干個節點(數據庫實例)組成,組內各個節點維護各自的數據副本(Share Nothing),通過一致性協議實現原子消息和全局有序消息,來實現組內實例數據的一致。
MGR的解決方案現在具備的特性
- 數據一致性保障:確保集群中大部分節點收到日志
- 多節點寫入支持:多寫模式下支持集群中的所有節點都可以寫入
- Fault Tolerance: 確保系統發生故障(包括腦裂)依然可用,雙寫對系統無影響
MGR的解決方案目前的影響
- 僅支持InnoDB表,并且每張表一定要有一個主鍵,用于做write set的沖突檢測;
- 必須打開GTID特性,二進制日志格式必須設置為ROW,用于選主與write set
- COMMIT可能會導致失敗,類似于快照事務隔離級別的失敗場景
- 目前一個MGR集群最多支持9個節點
- 不支持外鍵于save point特性,無法做全局間的約束檢測與部分部分回滾
- 二進制日志不支持binlog event checksum
來源:cnblogs | 羅阿紅