組複製MySQL Group Replication(簡稱MGR)是MySQL官方在已有的Binlog複製架構之上,基於Paxos協議實現的一種分布式複製形態。RDS MySQL叢集系列執行個體支援組複製。本文介紹組複製的優勢、技術實現原理、AliSQL對組複製穩定性的最佳化。
組複製的優勢
組複製、半同步複製、非同步複製的資料可靠性、資料一致性、全域事務一致性情況如下表所示。
特性 | 組複製 | 半同步複製 | 非同步複製 |
資料可靠性 | ★★★★★ | ★★★ | ★ |
資料一致性 | 保證主備資料一致性 | 不保證 | 不保證 |
全域事務一致性 | 支援 | 不支援 | 不支援 |
資料強可靠性
組複製基於Paxos協議的多數派原則,確保資料可靠性。當多數派節點(指叢集中超過半數的節點)接收到事務的Binlog後,事務才會提交。這保證了在多數派可用的情況下,任何少數派節點(叢集中少於半數的節點)故障都不會導致資料丟失。
例如,5個節點的叢集,3個節點收到Binlog,2個節點未收到Binlog,此時有2個節點故障:
資料強一致性
組複製通過先傳輸事務到叢集其他節點再寫入Binlog的方式,確保主備節點資料一致性。舊主節點故障重啟後,會自動加入叢集並拉取缺失的Binlog,從而獲得最新資料。
傳統主備複製的問題:主節點在寫入Binlog後、傳輸到備節點前發生故障,可能導致主備資料不一致。
全域事務強一致性
組複製支援全域事務強一致讀和寫能力,並可通過group_replication_consistency
參數調整一致性等級:
組複製的部署模式
多主模式(Multiple Leader):
所有節點均可讀寫,主要用於擴充寫能力。依賴Paxos協議的多點寫入和行層級的衝突檢測,保證資料順序一致。
缺點:但在多數派可用的情況下,任何節點故障都會導致短時間不可用。
單主模式(Single Leader):
叢集中僅一個節點可寫,其他節點唯讀。基於Paxos Single Leader實現,擴充讀能力的同時保持高可用性。
RDS MySQL提供了單主模式的組複製執行個體,並對唯讀節點做了最佳化,在保證高可靠性和強一致性的同時提供更平滑的效能。
組複製的架構

在MySQL的Server層和Replica層之下,組複製分為三層:
組複製層(Group Replication Logic Layer):負責與Server層互動,向組通訊層發送、接收並回放事務。
組通訊層(Group Communication System Layer):負責訊息傳遞、故障檢測和叢集成員管理。
XCom層(Paxos Layer):基於Paxos協議實現,確保資料順序一致性和多數派可用性。
Paxos協議
Paxos協議在組複製中的作用包括:
在Paxos協議中,使用鎖的方式來實現節點間順序一致性,這種方式存在一定的效率問題,並且還存在著負載不均衡的問題。在工程實現過程中,MySQL的XCom層基於Mencius協議(Paxos變種協議),通過輪詢方式實現負載平衡,提升節點間效率。
多主模式實現原理
資料順序:
每個組內資料發送是串列的,保證單組內順序一致。多個組間通過輪詢機制確保全域順序,例如按 (1,1)、(1,2)、(1,3) 的順序發送資料。
Noop機制:
如果某節點發現後續順序號已完成Paxos過程且自身無資料發送,則廣播Noop跳過該順序號。每個節點需等待前序節點發送資料或Noop後才能繼續。
缺陷:
當某節點故障或抖動時,既無法發送資料也無法發送Noop,導致後續節點無法發送資料,叢集可能完全不可用。這是多主模式的主要缺陷。
說明
圖中(m,n)表示第n個組發出的第m條資料。例如,(2,1)表示第1個組發出的第2條資料。
單主模式實現原理
上文中提到的多主模式的缺陷可以最佳化,但無法從根源上避免。為此MySQL推出了組複製的單主模式,來解決少數派故障對叢集可用性的影響。
上圖是單主模式的XCom架構,由於只有一個節點可寫,只需啟用一個Paxos組。接收方的XCom在輪詢資料時,會自動忽略其他Paxos組。這樣,只要多數派可用,Paxos就能正常發送資料,叢集的可用性不受影響。
在單主模式下,備節點不會發送交易資料,但有時需要發送一些叢集管理資訊。備節點在發送資料時,必須向主節點請求一個發送資訊的位置,如上圖中的<3, 1>,並使用這個位置向全叢集發送自己的資料。這種發送方式效率低、時延高,但由於叢集管理資訊發送的頻率很低,並不會對效能造成影響。
組複製層

組複製層負責向叢集發送、接收和回放事務,主節點和備節點的工作原理如下:
衝突檢測
情境
組複製在以下兩種情境中需要進行衝突檢測:
原理
衝突檢測基於資料行的主鍵雜湊值,採用行級檢測機制。每個節點維護一個事務認證資訊數組(雜湊數組),其結構如下:
當事務準備提交時:
在當前事務提交或寫入Relay Log前,需要將上述兩個集合進行比較:
清理機制:
為節省記憶體空間,認證資訊數組會定期清理無用資料:
AliSQL對組複製穩定性的最佳化
儘管單主模式提升了組複製的穩定性,但在某些情境下仍存在問題。例如,當備節點延遲較大時,大量未及時應用的事務會導致認證資訊堆積,影響系統穩定性:
針對這些問題,AliSQL對認證資訊清理進行了以下最佳化:
主節點最佳化:
主節點無需使用認證資訊數組,因此完全移除該數組,消除其對資源和穩定性的潛在影響。
備節點最佳化:
僅在group_replication_consistency=EVENTUAL
配置下保留認證資訊。此配置下,備節點切為主節點後會立即對外提供服務,而不等待Relay Log回放完成,可能導致資料衝突。由於這種行為在生產環境中較少使用,禁止後可顯著減少備節點的認證資訊保留量,降低記憶體開銷,提升叢集穩定性。