MySQL Shell 9.0  /  ...  /  將叢集重新加入 InnoDB ClusterSet

8.9.5 將叢集重新加入 InnoDB ClusterSet

如果 InnoDB 叢集是 InnoDB ClusterSet 部署的一部分,MySQL Shell 會在重新啟動後自動將其還原至拓樸中的角色,前提是其功能可接受且未標示為無效。但是,如果叢集已標示為無效或其 ClusterSet 複寫通道已停止,您必須使用 clusterSet.rejoinCluster() 作業才能將其重新加入 InnoDB ClusterSet 部署。

clusterSet.rejoinCluster() 作業會驗證目標叢集是否符合下列需求:

  • 該叢集先前是 ClusterSet 的成員。

  • 該叢集具有仲裁 (有足夠的成員在線上形成多數)。

  • 可連線到該叢集的主要伺服器。

  • 該叢集未持有任何中繼資料鎖定或 InnoDB 交易鎖定。

  • 該叢集的 GTID 集 (gtid_executed) 與 ClusterSet 的作用中成員相比,沒有額外的交易,檢視變更事件除外。這些群組複寫內部交易是由 group_replication_view_change_uuid 系統變數所指定的 UUID 所識別,並且叢集重新加入程序可以協調它們。

如果叢集符合這些需求,則作業會重新啟動 ClusterSet 複寫通道並移除 INVALIDATED 狀態。如果沒有,您需要修正所識別的任何問題並重試命令。

請按照下列程序將 InnoDB 叢集重新加入 InnoDB ClusterSet:

  1. 使用 MySQL Shell,使用 InnoDB 叢集管理員帳戶 (使用 cluster.setupAdminAccount() 建立) 連線至主要叢集或其中一個複寫叢集中的任何成員伺服器。您也可以使用 InnoDB 叢集伺服器組態帳戶,該帳戶也具有所需的權限。建立連線後,使用 dba.getClusterSet()cluster.getClusterSet() 命令取得 ClusterSet 物件。務必使用 InnoDB 叢集管理員帳戶或伺服器組態帳戶,以便儲存在 ClusterSet 物件中的預設使用者帳戶具有正確的權限。例如:

    mysql-js> \connect admin2@127.0.0.1:3310
    Creating a session to 'admin2@127.0.0.1:3310'
    Please provide the password for 'admin2@127.0.0.1:3310': ********
    Save password for 'admin2@127.0.0.1:3310'? [Y]es/[N]o/Ne[v]er (default No):
    Fetching schema names for autocompletion... Press ^C to stop.
    Closing old connection...
    Your MySQL connection id is 28
    Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial
    No default schema selected; type \use <schema> to set one.
    <ClassicSession:admin2@127.0.0.1:3310>
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>
  2. 使用 MySQL Shell 中 AdminAPI 的 clusterSet.status() 函數檢查整個部署的狀態。例如:

    mysql-js> myclusterset.status({extended: 1})

    有關輸出的說明,請參閱 第 8.6 節,〈InnoDB ClusterSet 狀態和拓樸〉

  3. 發出 clusterSet.rejoinCluster() 命令,命名要重新加入 InnoDB ClusterSet 的叢集。例如:

    mysql-js> myclusterset.rejoinCluster('clustertwo')
    Rejoining cluster 'clustertwo' to the clusterset
    NOTE: Cluster 'clustertwo' is invalidated
    * Updating metadata
    
    * Rejoining cluster
    ** Changing replication source of 127.0.0.1:4420 to 127.0.0.1:3310
    ** Changing replication source of 127.0.0.1:4430 to 127.0.0.1:3310
    ** Changing replication source of 127.0.0.1:4410 to 127.0.0.1:3310
    
    Cluster 'clustertwo' was rejoined to the clusterset

    對於 clusterSet.rejoinCluster() 命令:

    • 需要 clusterName 參數,並指定在 InnoDB ClusterSet 中用於叢集的識別碼,如 clusterSet.status() 命令的輸出中所示。在範例中,clustertwo 是要重新加入的叢集名稱。

    • 如果您想要執行驗證並記錄變更,但不實際執行變更,請使用 dryRun 選項。

    當您發出 clusterSet.rejoinCluster() 命令時,MySQL Shell 會檢查目標叢集是否符合重新加入 ClusterSet 的需求,如果不符合,則會傳回錯誤。如果目標叢集符合需求,MySQL Shell 會執行下列工作:

    • 檢查 ClusterSet 複寫通道是否從目前的主要叢集複寫,如果還沒有,則會重新設定以執行此操作。

    • 重新啟動 ClusterSet 複寫通道。

    • 清除叢集的 INVALIDATED 狀態。

    目標叢集會以複寫叢集的形式重新加入 InnoDB ClusterSet,即使它之前是主要叢集也是如此。如果您想要將目標叢集設為主要叢集,則需要進行受控制的切換。

    請注意,如果您發出 clusterSet.rejoinCluster() 命令時,目標叢集有成員未連線或無法連線,則該命令不會正確設定這些成員。如果您不再需要這些執行個體,您可以使用 cluster.removeInstance() 命令將其移除。如果您修復這些執行個體或使其再次上線,請在這些成員返回叢集後,再次發出 clusterSet.rejoinCluster() 命令。

  4. 再次使用 extended 選項發出 clusterSet.status() 命令,以驗證 InnoDB ClusterSet 部署的狀態。

  5. 如果您確實想要將重新加入的叢集設為主要叢集,請發出 clusterSet.setPrimaryCluster() 命令,並命名重新加入的叢集。 第 8.7 節,〈InnoDB ClusterSet 受控制的切換〉 說明了該程序的說明,包括如何指示 MySQL Router 執行個體將流量傳送至新的主要叢集。