群組複製旨在確保資料庫服務持續可用,即使形成群組的某些伺服器由於計畫性維護或計畫外問題而目前無法參與。只要其餘成員佔群組多數,他們就可以選出新的主要節點,並繼續作為群組運作。但是,如果複製群組的每個成員都離開群組,並且透過 STOP GROUP_REPLICATION
陳述式或系統關機在每個成員上停止群組複製,則該群組現在僅以理論形式存在,作為成員上的組態。在這種情況下,若要重新建立群組,必須像第一次啟動一樣透過引導啟動來啟動。
第一次引導啟動群組與第二次或後續引導啟動群組之間的差異在於,在後一種情況下,已關閉的群組成員可能彼此具有不同的交易集,具體取決於停止或失敗的順序。如果成員具有其他群組成員上不存在的交易,則該成員無法加入群組。對於群組複製,這包括已認可和套用的交易 (位於 gtid_executed
GTID 集中),以及已驗證但尚未套用的交易 (位於 group_replication_applier
通道中)。交易認可的確切時間點取決於為群組設定的交易一致性層級 (請參閱第 20.5.3 節,「交易一致性保證」)。但是,群組複製群組成員永遠不會移除已驗證的交易,這是成員認可交易意圖的聲明。
因此,必須從最新成員開始重新啟動複製群組,也就是具有最多已執行和驗證交易的成員。然後,交易較少的成員可以加入,並透過分散式復原趕上遺漏的交易。假設群組的最後一個已知主要成員是群組的最新成員是不正確的,因為比主要節點更晚關閉的成員可能具有更多交易。因此,您必須重新啟動每個成員以檢查交易、比較所有交易集,並找出最新成員。然後,可以使用此成員來引導啟動群組。
在每個成員關閉後,請遵循此程序安全地重新啟動複製群組。
依序處理每個群組成員,順序不拘
將用戶端連線至群組成員。如果群組複製尚未停止,請發出
STOP GROUP_REPLICATION
陳述式,並等待群組複製停止。編輯 MySQL 伺服器組態檔案 (在 Linux 和 Unix 系統上通常命名為
my.cnf
,在 Windows 系統上通常命名為my.ini
),並設定系統變數group_replication_start_on_boot=OFF
。此設定會防止在啟動 MySQL 伺服器時啟動群組複製,這是預設行為。如果您無法在系統上變更該設定,您可以只允許伺服器嘗試啟動群組複製,這將會失敗,因為群組已完全關閉且尚未引導啟動。如果您採用這種方法,請勿在此階段在任何伺服器上設定
group_replication_bootstrap_group=ON
。啟動 MySQL 伺服器執行個體,並確認尚未啟動 (或無法啟動) 群組複製。請勿在此階段啟動群組複製。
從群組成員收集下列資訊
gtid_executed
GTID 集的內容。您可以使用下列陳述式取得此資訊mysql> SELECT @@GLOBAL.GTID_EXECUTED
group_replication_applier
通道上已驗證的交易集。您可以使用下列陳述式取得此資訊mysql> SELECT received_transaction_set FROM \ performance_schema.replication_connection_status WHERE \ channel_name="group_replication_applier";
當您從所有群組成員收集到交易集時,請比較它們,以找出哪個成員的整體交易集最大,包括已執行的交易 (
gtid_executed
) 和已驗證的交易 (在group_replication_applier
通道上)。您可以透過查看 GTID 手動執行此作業,也可以使用已儲存的函數來比較 GTID 集,如第 19.1.3.8 節,「操作 GTID 的已儲存函數範例」中所述。使用具有最大交易集的成員來引導啟動群組,方法是將用戶端連線至群組成員並發出下列陳述式
mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION; mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
請務必不要在組態檔案中儲存設定
group_replication_bootstrap_group=ON
,否則當再次重新啟動伺服器時,會設定具有相同名稱的第二個群組。若要驗證群組現在是否包含此建立者成員,請在引導啟動它的成員上發出此陳述式
mysql> SELECT * FROM performance_schema.replication_group_members;
依任意順序,透過在其他每個成員上執行
START GROUP_REPLICATION
陳述式,將每個其他成員加回群組。mysql> START GROUP_REPLICATION;
若要驗證每個成員都已加入群組,請在任何成員上執行此陳述式。
mysql> SELECT * FROM performance_schema.replication_group_members;
當成員重新加入群組後,如果您編輯了它們的組態檔以設定
group_replication_start_on_boot=OFF
,您可以再次編輯它們以設定ON
(或移除系統變數,因為ON
是預設值)。