MySQL Shell 8.4  /  MySQL InnoDB ClusterSet  /  將 MySQL Router 與 InnoDB ClusterSet 整合

8.5 將 MySQL Router 與 InnoDB ClusterSet 整合

MySQL Router 將用戶端應用程式流量路由至 InnoDB ClusterSet 部署中適當的叢集。您可以設定用於 InnoDB ClusterSet 部署的 MySQL Router 執行個體的全域原則,並使用個別 MySQL Router 執行個體的設定來覆寫此原則。

當您針對 InnoDB ClusterSet 部署引導 MySQL Router 執行個體時,它會知道 ClusterSet 的完整拓撲,並且可以適當地管理寫入和讀取流量。如果發生受控切換或緊急容錯移轉,與 InnoDB ClusterSet 連接的 MySQL Router 執行個體會知道此事,並將流量路由至新的主要叢集,除了您已設定為將流量傳送至特定叢集的任何執行個體。如果叢集失效,MySQL Router 執行個體會停止對其進行讀取和寫入流量,除了您已設定在該情況下繼續傳送讀取流量的任何執行個體。

對於您用於 InnoDB ClusterSet 的每個 MySQL Router 執行個體,您可以選擇將其設定為遵循主要叢集,或僅連接至特定的目標 InnoDB 叢集。您可以使用 MySQL Shell 線上變更這些模式。

遵循主要叢集

在此模式下,MySQL Router 會將應用程式流量 (包括寫入和讀取) 導向至 InnoDB ClusterSet 部署中目前為主要叢集的叢集。此模式是預設模式。

具名目標叢集

在此模式下,MySQL Router 會將應用程式流量導向至您指定的 InnoDB 叢集。這可以是 InnoDB ClusterSet 部署中的主要叢集,也可以是複寫叢集。如果目標叢集目前是主要叢集,MySQL Router 會開啟寫入連接埠,應用程式可以寫入執行個體。如果目標叢集目前是唯讀複寫叢集,MySQL Router 只允許讀取流量,並拒絕寫入流量。如果此情況因目標叢集的切換或容錯移轉而變更,MySQL Router 會據此變更允許的請求類型。如果應用程式只發出讀取請求 (可以在複寫叢集上進行),而且您希望將該流量路由至本機叢集,則此模式很有用。

您也可以將 MySQL Router 設定為允許或不允許將讀取流量傳送至標記為 INVALIDATED 的叢集。處於此狀態的叢集目前根本無法作為 InnoDB ClusterSet 部署的一部分運作,並且無法接收寫入。雖然叢集不一定有任何技術問題,但其資料正變得過時。預設情況是,MySQL Router 不允許對失效的叢集進行讀取和寫入 ( drop_all 設定),但您可以選擇允許讀取 ( accept_ro 設定)。

若要針對 InnoDB ClusterSet 引導 MySQL Router,您需要使用 InnoDB 叢集管理員帳戶或 InnoDB 叢集伺服器組態帳戶,該帳戶也具有必要的權限。然後,MySQL Router 會使用 MySQL Router 管理員帳戶連接至 InnoDB ClusterSet 部署中的執行個體。您需要在引導作業期間指定這兩個帳戶的使用者名稱和密碼。如需詳細資訊,請參閱第 8.3 節「InnoDB ClusterSet 的使用者帳戶」

重要事項

如果您使用現有的 InnoDB 叢集作為 InnoDB ClusterSet 部署中的主要叢集,並且您已針對該叢集引導 MySQL Router,請遵循此程序中的相關部分,使用 --force 選項再次針對 InnoDB ClusterSet 引導它,然後停止並重新啟動 MySQL Router。InnoDB ClusterSet 需要更新 MySQL Router 執行個體的靜態組態檔案中的設定。

若要將 MySQL Router 與 InnoDB ClusterSet 部署整合,請遵循此程序

  1. 如果尚未執行此操作,請根據您的拓撲安裝適當的 MySQL Router 執行個體。建議的 MySQL Router 部署是與用戶端應用程式在同一主機上。當使用沙箱部署時,所有項目都在單一主機上執行,因此您將 MySQL Router 部署到同一主機。當使用生產部署時,我們建議將一個 MySQL Router 執行個體部署到每個用於託管您的其中一個用戶端應用程式的機器。也可以將 MySQL Router 部署到您的應用程式執行個體透過其連線的通用機器。如需指示,請參閱安裝 MySQL Router

  2. 使用 InnoDB 叢集管理員帳戶,連接至 InnoDB ClusterSet 部署中的任何作用中成員伺服器執行個體。您也可以使用 InnoDB 叢集伺服器組態帳戶,該帳戶也具有必要的權限。使用 dba.getClusterSet()cluster.getClusterSet() 命令取得 ClusterSet 物件。當您使用適當的帳戶連線至伺服器執行個體時,取得 ClusterSet 物件很重要。無論您在連線上指定哪個帳戶,物件中儲存的預設使用者帳戶都用於某些作業。例如

    mysql-js> \connect admin2@127.0.0.1:3310
    ...
    mysql-js> myclusterset = dba.getClusterSet()
    <ClusterSet:testclusterset>

    在此範例中

    • admin2@127.0.0.1:3310 是叢集中任何在線上成員伺服器執行個體的類 URI 連接字串。

      類 URI 連接字串包含下列元素

    • admin2 是 InnoDB 叢集管理員帳戶的使用者名稱。

    • 127.0.0.1:3310 是成員伺服器執行個體的主機和連接埠,如 cluster.status() 命令所顯示。

    • 傳回的 ClusterSet 物件會指派給變數 myclusterset

  3. 在連線至叢集中的任何成員伺服器時,在 MySQL Shell 中發出 clusterSet.status(),以驗證 InnoDB ClusterSet 部署是否狀況良好。例如

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

    選取擴充輸出以查看 InnoDB ClusterSet 拓撲中叢集的詳細狀態。這會為您提供每個成員伺服器的主機和連接埠,以便您可以選擇一個來針對其引導 MySQL Router。如需詳細資訊,請參閱第 8.6 節「InnoDB ClusterSet 狀態與拓撲」

  4. 對於每個 MySQL Router 執行個體,在安裝 MySQL Router 的執行個體上適當的 Shell 中執行 mysqlrouter 命令,以針對 InnoDB ClusterSet 引導 MySQL Router。在此範例中,使用了 force 選項,因為 MySQL Router 先前已針對主要 InnoDB 叢集引導。

    $> mysqlrouter --bootstrap icadmin@127.0.0.1:3310 --account=myRouter1 --name='Rome1' --force
    Please enter MySQL password for icadmin:
    # Bootstrapping system MySQL Router instance...
    
    Please enter MySQL password for myRouter1:
    - Creating account(s) (only those that are needed, if any)
    - Verifying account (using it to run SQL queries that would be run by Router)
    - Storing account in keyring
    - Creating configuration C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf
    
    # MySQL Router configured for the ClusterSet 'testclusterset'
    
    After this MySQL Router has been started with the generated configuration
    
        > net start mysqlrouter
    or
        > C:\Program Files\MySQL\MySQL Router 8.0\bin\mysqlrouter.exe -c C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf
    
    ClusterSet 'testclusterset' can be reached by connecting to:
    
    ## MySQL Classic protocol
    
    - Read/Write Connections: localhost:6446
    - Read/Only Connections:  localhost:6447
    
    ## MySQL X protocol
    
    - Read/Write Connections: localhost:6448
    - Read/Only Connections:  localhost:6449

    在此範例中

    • icadmin@127.0.0.1:3310 是 InnoDB ClusterSet 部署中任何在線上成員伺服器執行個體的類 URI 連接字串。執行個體可以在主要叢集或複寫叢集中。如果執行個體不是主要叢集中的主要伺服器,則 InnoDB ClusterSet 會將交易路由至該伺服器,前提是 InnoDB ClusterSet 部署狀況良好。

      類 URI 連接字串包含下列元素

    • icadmin 是 InnoDB 叢集管理員帳戶的使用者名稱,該帳戶是使用主要叢集上的 cluster.setupAdminAccount() 命令設定,然後複寫到複寫叢集。引導作業會提示您輸入帳戶的密碼。InnoDB ClusterSet 部署中所有伺服器執行個體的 InnoDB 叢集管理員帳戶的密碼都相同。

    • 127.0.0.1:3310 是成員伺服器執行個體的主機和連接埠,如 clusterSet.status() 命令所顯示。

    • myRouter1 是 MySQL Router 管理員帳戶的使用者名稱,該帳戶是使用主要叢集上的 cluster.setupRouterAccount() 命令設定。該帳戶在 InnoDB ClusterSet 部署中的所有伺服器執行個體上都相同。引導作業會提示您輸入帳戶的密碼。

    • --name 可用於將非預設名稱指派給 MySQL Router 執行個體,以便在 InnoDB ClusterSet 狀態命令的輸出中輕鬆識別它。

    • 如果您要針對先前已引導的現有 InnoDB 叢集再次引導 MySQL Router,則需要 --force

    MySQL Router 會連線至伺服器執行個體並擷取 InnoDB ClusterSet 中繼資料。此程序與您針對個別 InnoDB 叢集引導 MySQL Router 時相同。如需有關此程序的詳細資訊,請參閱第 6.10.3 節「部署 MySQL Router」

  5. 在您引導每個 MySQL Router 執行個體之後,請在連線至 InnoDB ClusterSet 中的任何成員伺服器時,在 MySQL Shell 中發出 clusterSet.listRouters(),以驗證它現在是否已正確針對 InnoDB ClusterSet 部署引導。此命令會傳回所有已註冊的 MySQL Router 執行個體的詳細資訊,或您指定的路由器執行個體的詳細資訊。例如

    mysql-js> myclusterset.listRouters()
    {
        "domainName": "testclusterset",
        "routers": {
           "mymachine::Rome1": {
                "hostname": "mymachine",
                "lastCheckIn": 2021-10-15 11:58:37,
                "roPort": 6447,
                "roXPort": 6449,
                "rwPort": 6446,
                "rwXPort": 6448,
                "targetCluster": "primary",
                "version": "8.0.27"
            },
            "mymachine2::Rome2": {
                "hostname": "mymachine2",
                "lastCheckIn": 2021-10-15 11:58:37,
                "roPort": 6447,
                "roXPort": 6449,
                "rwPort": 6446,
                "rwXPort": 6448,
                "targetCluster": "primary",
                "version": "8.0.27"
            }
        }
    }

    如需詳細資訊,請參閱InnoDB ClusterSet 的 MySQL Router 狀態

  6. 若要查看為每個 MySQL Router 執行個體設定的路由選項,以及 InnoDB ClusterSet 部署的全域原則,請在連線至 InnoDB ClusterSet 部署中的任何成員伺服器時,在 MySQL Shell 中發出 clusterSet.routingOptions()。例如

    mysql-js> myclusterset.routingOptions()
    {
        "domainName": "testclusterset",
        "global": {
            "invalidated_cluster_policy": "drop_all",
            "target_cluster": "primary"
        },
        "routers": {
            "mymachine::Rome1":  {
                "target_cluster": "primary"
                "invalidated_cluster_policy": "accept_ro"
            },
            "mymachine2::Rome2": {}
        }
    }

    預設情況下,MySQL Router 執行個體會將流量傳送到主要叢集,並且不允許對標記為 INVALIDATED 的叢集進行讀取和寫入流量。請參閱InnoDB ClusterSet 的 MySQL Router 狀態以取得更多資訊,以及 clusterSet.routingOptions() 命令輸出的說明。

  7. 如果您想要變更全域路由原則或個別 MySQL Router 執行個體的路由原則,請在連線到 InnoDB ClusterSet 部署中的任何成員伺服器時,在 MySQL Shell 中發出 clusterSet.setRoutingOption()。您一次只能設定一個路由選項。MySQL Router 執行個體需要幾秒鐘的時間才能擷取路由原則的變更。

    例如,針對 InnoDB ClusterSet myclusterset 發出的此命令會將 MySQL Router 執行個體的目標叢集變更為叢集 clustertwo

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'clustertwo')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    在此範例中,myclustersetClusterSet 物件的變數,Rome1 是 MySQL Router 執行個體的名稱,而 clustertwo 是要設為目標的特定叢集的名稱。

    若要將執行個體的路由原則設定回追蹤主要叢集,請發出此命令

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'primary')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    若要清除執行個體的路由原則,請使用 clusterSet.setRoutingOption() 命令將相關原則設定為 null。例如

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', null)
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    如需有關可用路由選項的詳細資訊,請參閱第 6.10.4 節,「路由選項」

    若要設定全域路由原則,請勿指定 MySQL Router 執行個體,只需指定原則名稱和設定即可。如需有關可用路由選項的詳細資訊和說明,請參閱InnoDB ClusterSet 的 MySQL Router 狀態

  8. 當您準備好開始接受連線時,請設定應用程式以使用 MySQL Router 正在接聽傳送到 InnoDB ClusterSet 部署流量的埠。然後,在使用 MySQL Router 安裝的伺服器中使用適當的 Shell 或指令碼啟動 MySQL Router 執行個體。請參閱啟動 MySQL Router