MySQL Shell 9.0  /  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,請遵循此程序的相關部分,以使用針對 InnoDB ClusterSet 的 --force 選項再次啟動它,然後停止並重新啟動 MySQL Router。MySQL Router 執行個體的靜態設定檔中的設定需要針對 InnoDB ClusterSet 進行更新。

若要將 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。在此範例中,由於 MySQL Router 先前已針對主要 InnoDB 叢集啟動,因此會使用 force 選項

    $> 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 是使用主要叢集上的 cluster.setupAdminAccount() 命令設定,然後複製到複本叢集的 InnoDB 叢集管理員帳戶的使用者名稱。啟動作業會提示您輸入帳戶的密碼。InnoDB ClusterSet 部署中所有伺服器執行個體上的 InnoDB 叢集管理員帳戶密碼都相同。

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

    • myRouter1 是使用主要叢集上的 cluster.setupRouterAccount() 命令設定的 MySQL Router 管理員帳戶的使用者名稱。該帳戶在 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 部署正確啟動。方法是在連線到 InnoDB ClusterSet 中任何成員伺服器的情況下,於 MySQL Shell 中執行 clusterSet.listRouters()。此命令會傳回所有已註冊的 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