6.10.7 使用集群的路由器

您可以针对 InnoDB 集群或 InnoDB 副本集引导多个 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 的实例的 lastCheckInversion 均为 null 的事实。通过发出以下 JavaScript 命令从元数据中删除此旧实例

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

或者,通过发出以下 Python 命令

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

通过从 InnoDB 集群元数据中删除指定的 MySQL Router 实例,将其从集群中取消注册。

使用 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 的集群上使用默认选项的示例,该集群具有一个名为 router_test 的路由器,版本为 8.4.0

$> 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 对象,其中包含目标拓扑的名称、检索到的全局配置,以及属于该拓扑的路由器列表以及每个路由器的配置。