在 MySQL 群組複製中,一組伺服器形成一個複製群組。群組有名稱,採用 UUID 形式。群組是動態的,伺服器可以隨時離開(自願或非自願)和加入。每當伺服器加入或離開時,群組都會自行調整。
如果伺服器加入群組,它會自動從現有伺服器擷取遺失的狀態,使自己更新到最新狀態。如果伺服器離開群組,例如因為維護而關閉,剩餘的伺服器會注意到它已離開,並自動重新設定群組。
群組複製具有群組成員服務,可定義哪些伺服器在線上並參與群組。線上伺服器的清單稱為檢視。群組中的每個伺服器都有一致的檢視,了解在特定時間點哪些伺服器是積極參與群組的成員。
群組成員不僅必須就交易提交達成共識,也必須就目前的檢視達成共識。如果現有成員同意新的伺服器應成為群組的一部分,則會重新設定群組以將該伺服器整合到其中,這會觸發檢視變更。如果伺服器自願或非自願離開群組,則群組會動態重新安排其設定,並觸發檢視變更。
在成員自願離開群組的情況下,它會先啟動動態群組重新設定,在此期間,所有成員都必須同意不包含離開伺服器的新檢視。但是,如果成員非自願離開群組,例如因為它意外停止或網路連線中斷,則它無法啟動重新設定。在這種情況下,群組複製的故障偵測機制會在短時間後識別出成員已離開,並提出重新設定不包含失敗成員的群組。如同自願離開的成員一樣,重新設定需要群組中大多數伺服器的同意。但是,如果群組無法達成共識,例如因為它以導致沒有多數伺服器在線上之方式分割,則系統無法動態變更設定,並會封鎖以防止腦裂情況。這種情況需要管理員介入。
成員可能會短暫離線,然後在故障偵測機制偵測到其故障之前,且在群組重新設定以移除該成員之前,嘗試再次重新加入群組。在這種情況下,重新加入的成員會忘記其先前的狀態,但如果其他成員向它傳送用於其當機前狀態的訊息,可能會導致問題,包括可能發生的資料不一致。如果處於這種情況的成員參與 XCom 的共識協定,它可能會在故障前後做出不同的決定,進而導致 XCom 為相同的共識回合提供不同的值。
為了避免這種可能性,MySQL 群組複製會檢查相同伺服器的新化身嘗試加入群組的情況,而其舊化身(具有相同的位址和連接埠號碼)仍列為成員。在重新設定移除舊化身之前,會阻止新化身加入群組。請注意,如果已透過 group_replication_member_expel_timeout
系統變數新增等待時間,以允許成員在被驅逐之前有額外的時間重新連線到群組,則如果受懷疑的成員在懷疑逾時之前重新連線到群組,則它可以作為目前化身在群組中再次啟動。當成員超過驅逐逾時並被逐出群組,或當伺服器上的群組複製因 STOP GROUP_REPLICATION
陳述式或伺服器故障而停止時,它必須以新化身重新加入。