6.10.7 使用叢集的路由器

您可以針對 InnoDB 叢集或 InnoDB ReplicaSet 引導多個 MySQL Router 執行個體。若要顯示所有已註冊的 MySQL Router 執行個體清單,請發出

Cluster.listRouters()

結果會提供關於每個已註冊的 MySQL Router 執行個體的資訊,例如其在中繼資料中的名稱、主機名稱、連接埠等等。例如,發出下列 JavaScript 命令

mysql-js> Cluster.listRouters()
{
    "clusterName": "example",
    "routers": {
        "ic-1:3306": {
            "hostname": "ic-1:3306",
            "lastCheckIn": "2020-01-16 11:43:45",
            "roPort": 6447,
            "roXPort": 64470,
            "rwPort": 6446,
            "rwXPort": 64460,
            "version": "8.0.19"
        }
    }
}

或發出下列 Python 命令

mysql-py> Cluster.list_routers()
{
    "clusterName": "example",
    "routers": {
        "ic-1:3306": {
            "hostname": "ic-1:3306",
            "lastCheckIn": "2020-01-16 11:43:45",
            "roPort": 6447,
            "roXPort": 64470,
            "rwPort": 6446,
            "rwXPort": 64460,
            "rwSplitPort": 6450,
            "version": "8.0.19"
        }
    }
}

傳回的資訊顯示

  • MySQL Router 執行個體的名稱。

  • 上次簽入時間戳記,此時間戳記是由儲存在中繼資料中的 MySQL Router 定期 ping 所產生。

  • MySQL Router 執行個體正在執行所在的主機名稱。

  • 唯讀 (roPort) 和讀寫 (rwPort) 連接埠,MySQL Router 會發佈這些連接埠以用於傳統 MySQL 通訊協定連線。

  • 唯讀 (roXPort) 和讀寫 (rwXPort) 連接埠,MySQL Router 會發佈這些連接埠以用於 X 通訊協定連線。

  • 讀寫分割 (rwSplitPort) 連接埠,MySQL Router 會發佈這些連接埠以用於分割的傳統 MySQL 通訊協定連線。

    請參閱 讀取/寫入分割

  • 此 MySQL Router 執行個體的版本。如果此操作是針對早於 8.0.19 的 MySQL Router 版本執行,則版本欄位為 null

此外,Cluster.listRouters() 操作可以顯示不支援 MySQL Shell 支援的中繼資料版本的執行個體清單。使用 onlyUpgradeRequired 選項。例如,發出 Cluster.listRouters({'onlyUpgradeRequired':'true'})

傳回的清單只會顯示使用 Cluster 註冊且需要升級其中繼資料的 MySQL Router 執行個體。如需更多資訊,請參閱 第 6.11 節〈升級中繼資料綱要〉

MySQL Router 執行個體不會自動從中繼資料中移除,因此,例如,當您引導更多執行個體時,InnoDB 叢集中繼資料會包含越來越多對執行個體的參考。若要從叢集中繼資料中移除已註冊的 MySQL Router 執行個體,請使用 Cluster.removeRouterMetadata(router) 操作。

使用 Cluster.listRouters() 操作取得您要移除的 MySQL Router 執行個體名稱,並將其作為 router 傳入。例如,假設向叢集註冊的 MySQL Router 執行個體為

mysql-js> Cluster.listRouters(){

    "clusterName": "testCluster",
    "routers": {
        "myRouter1": {
            "hostname": "example1.com",
            "lastCheckIn": null,
            "roPort": "6447",
            "rwPort": "6446"
            "version": null
        },
        "myRouter2": {
            "hostname": "example2.com",
            "lastCheckIn": "2019-11-27 16:25:00",
            "roPort": "6447",
            "rwPort": "6446"
            "version": "8.0.19"
        }
    }
}

根據名為 myRouter1 的執行個體,其 lastCheckInversionnull。發出下列 JavaScript 命令,從中繼資料中移除此舊執行個體

mysql-js> cluster.removeRouterMetadata('myRouter1')

或者,發出下列 Python 命令

mysql-py> cluster.remove_router_metadata('myRouter1')

指定的 MySQL Router 執行個體會從 InnoDB 叢集中繼資料中移除,以取消向叢集註冊。

使用 MySQL Shell 檢視路由器組態

從 MySQL Router 8.4.0 開始,針對叢集引導的路由器會在所連線叢集的 InnoDB 叢集中繼資料綱要中公開其組態。可以使用 .routerOptions() 操作來擷取此組態,此操作可在 ClusterClusterSetReplicaSet 物件上使用。

注意

如果您現有的路由器帳戶沒有所需的權限,則無法將組態資訊寫入中繼資料綱要。MySQL Shell 會偵測到這一點並產生警告。您必須確保您的路由器帳戶具有正確的權限,使用 setupRouterAccount() 且必要時再次引導。

預設情況下,.routerOptions() 可讓您擷取目標拓撲的整體組態。它會列出可由 MySQL Shell 設定的整體動態組態。請參閱 第 6.10.4 節〈路由選項〉。也會列出組態值與對應整體值不同的路由器。

.routerOptions() 的語法如下

          cluster.routerOptions({options})

可使用下列選項

  • router: routerName

  • extended: 0 | 1 | 2:

    • 0:預設值。傳回動態 MySQL Router 組態參數。

    • 1:傳回所連線路由器的所有整體參數,以及其值與整體值不同的參數的每個路由器清單。

    • 2:傳回連線至叢集的所有路由器的所有組態參數。

以下是針對名為 Cluster1 的叢集使用的預設選項範例,其中單一路由器、版本 8.4.0,名為 router_test

$> cluster.routerOptions()
     {
          "clusterName": "Cluster1",
          "configuration": {
            "routing_rules": {
              "invalidated_cluster_policy": "drop_all",
              "read_only_targets": "secondaries",
              "stats_updates_frequency": -1,
              "tags": {},
              "unreachable_quorum_allowed_traffic": "none",
              "use_replica_primary_as_rw": false
            }
        },
        "routers": {
            "host1::router_test": {
                "configuration": {
                }
            }
        }
    }

此操作會傳回 JSON 物件,其中包含目標拓撲的名稱、擷取的整體組態,以及屬於該拓撲的路由器清單和每個路由器的組態。