本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

組複製簡介

更新時間:2025-03-10 19:08

組複製MySQL Group Replication(簡稱MGR)是MySQL官方在已有的Binlog複製架構之上,基於Paxos協議實現的一種分布式複製形態。RDS MySQL叢集系列執行個體支援組複製。本文介紹組複製的優勢、技術實現原理、AliSQL對組複製穩定性的最佳化。

組複製的優勢

組複製、半同步複製、非同步複製的資料可靠性、資料一致性、全域事務一致性情況如下表所示。

特性

組複製

半同步複製

非同步複製

特性

組複製

半同步複製

非同步複製

資料可靠性

★★★★★

★★★

資料一致性

保證主備資料一致性

不保證

不保證

全域事務一致性

支援

不支援

不支援

資料可靠性

組複製基於Paxos協議的多數派原則,確保資料可靠性。當多數派節點(指叢集中超過半數的節點)接收到事務的Binlog後,事務才會提交。這保證了在多數派可用的情況下,任何少數派節點(叢集中少於半數的節點)故障都不會導致資料丟失。

例如,5個節點的叢集,3個節點收到Binlog,2個節點未收到Binlog,此時有2個節點故障:

  • 即使2個故障節點是收到Binlog的節點,至少還有1個節點有資料。

  • 如果故障的2個節點是沒收到Binlog的節點,則至少有3個節點上有資料。

資料一致性

組複製通過先傳輸事務到叢集其他節點再寫入Binlog的方式,確保主備節點資料一致性。舊主節點故障重啟後,會自動加入叢集並拉取缺失的Binlog,從而獲得最新資料。

傳統主備複製的問題:主節點在寫入Binlog後、傳輸到備節點前發生故障,可能導致主備資料不一致。

全域事務強一致性

組複製支援全域事務強一致讀和寫能力,並可通過group_replication_consistency參數調整一致性等級:

  • 強一致讀: 在備節點設定group_replication_consistency=BEFORE,查詢時會等待主節點上所有先於該查詢的事務完成後再執行,確保主備資料一致。

  • 強同步寫: 在主節點設定group_replication_consistency=AFTER,寫事務會在所有節點應用成功後才返回提交結果。

組複製的部署模式

  • 多主模式(Multiple Leader):

    所有節點均可讀寫,主要用於擴充寫能力。依賴Paxos協議的多點寫入和行層級的衝突檢測,保證資料順序一致。

    缺點:但在多數派可用的情況下,任何節點故障都會導致短時間不可用。

  • 單主模式(Single Leader):

    叢集中僅一個節點可寫,其他節點唯讀。基於Paxos Single Leader實現,擴充讀能力的同時保持高可用性。

    • 當備節點故障時,只要多數派可用,就不會影響叢集的可用性。

    • 當主節點故障時,叢集能夠根據Paxos協議自主切換新主節點,保證資料強一致性。

    RDS MySQL提供了單主模式的組複製執行個體,並對唯讀節點做了最佳化,在保證高可靠性和強一致性的同時提供更平滑的效能。

組複製的架構

image

在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>,並使用這個位置向全叢集發送自己的資料。這種發送方式效率低、時延高,但由於叢集管理資訊發送的頻率很低,並不會對效能造成影響。

組複製層

image

組複製層負責向叢集發送、接收和回放事務,主節點和備節點的工作原理如下:

  • 主節點: 事務進入提交階段時,其Binlog被發送到XCom層並傳遞給其他節點。多數派確認接收後,進行衝突檢測:

    • 檢測成功:寫入Binlog並提交事務。

    • 檢測失敗:復原事務。

  • 備節點: 事務被多數派接收後,由XCom層傳遞至組複製層進行衝突檢測:

    • 檢測成功:寫入Relay Log並由Applier線程應用。

    • 檢測失敗:丟棄交易資料。

衝突檢測

  • 情境

    組複製在以下兩種情境中需要進行衝突檢測:

    • 多主模式:所有寫操作都需要衝突檢測。

    • 單主模式:切主時,若新主節點在應用完舊主的 Relay Log 前執行寫事務,也需要衝突檢測。

  • 原理

    衝突檢測基於資料行的主鍵雜湊值,採用行級檢測機制。每個節點維護一個事務認證資訊數組(雜湊數組),其結構如下:

    • Key:資料行的雜湊值。

    • Value:最近修改該行的事務GTID與源節點提交時的gtid_executed集合的並集。

    當事務準備提交時:

    • 源節點發送事務修改的資料及一個提交集合(標識當前事務提交前已完成的事務)。

    • 叢集內所有節點根據事務修改的相關行雜湊值,從認證資訊數組中讀取對應的值,合并產生依賴集合(標識當前事務提交前必須完成的事務)。

    在當前事務提交或寫入Relay Log前,需要將上述兩個集合進行比較:

    • 如果提交集合包含了依賴集合,衝突檢測成功,事務在源節點寫入Binlog並提交,在其他節點寫入Relay Log。

    • 如果 提交集合不包含依賴集合,衝突檢測失敗,事務在源節點復原,在其他節點丟棄Relay Log。

    清理機制:

    為節省記憶體空間,認證資訊數組會定期清理無用資料:

    • 當事務在所有節點上執行完畢後,其修改的行資料可從認證資訊數組中移除。

    • 組複製每60秒清理一次已執行事務的資料。

AliSQL對組複製穩定性的最佳化

儘管單主模式提升了組複製的穩定性,但在某些情境下仍存在問題。例如,當備節點延遲較大時,大量未及時應用的事務會導致認證資訊堆積,影響系統穩定性:

  • 佔用過多記憶體,可能引發執行個體記憶體溢出(OOM)。

  • 清理代價增加,進一步影響執行個體效能。

針對這些問題,AliSQL對認證資訊清理進行了以下最佳化:

  • 主節點最佳化: 主節點無需使用認證資訊數組,因此完全移除該數組,消除其對資源和穩定性的潛在影響。

  • 備節點最佳化: 僅在group_replication_consistency=EVENTUAL配置下保留認證資訊。此配置下,備節點切為主節點後會立即對外提供服務,而不等待Relay Log回放完成,可能導致資料衝突。由於這種行為在生產環境中較少使用,禁止後可顯著減少備節點的認證資訊保留量,降低記憶體開銷,提升叢集穩定性。

  • 本頁導讀 (1, M)
  • 組複製的優勢
  • 資料強可靠性
  • 資料強一致性
  • 全域事務強一致性
  • 組複製的部署模式
  • 組複製的架構
  • Paxos協議
  • 多主模式實現原理
  • 單主模式實現原理
  • 組複製層
  • AliSQL對組複製穩定性的最佳化
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare