MySQL 路由器将客户端应用程序流量路由到 InnoDB ClusterSet 部署中的适当集群。您可以为用于 InnoDB ClusterSet 部署的 MySQL Router 实例设置全局策略,并使用单个 MySQL Router 实例的设置覆盖它。
当您针对 InnoDB ClusterSet 部署引导 MySQL Router 实例时,它知道 ClusterSet 的完整拓扑,并且可以适当地管理写入和读取流量。如果发生受控切换或紧急故障转移,与 InnoDB ClusterSet 连接的 MySQL Router 实例会意识到这一点并将流量路由到新的主集群,但您已配置为将流量发送到特定集群的任何实例除外。如果集群失效,则 MySQL Router 实例将停止读取和写入流量,但您已配置为在该情况下继续发送读取流量的任何实例除外。
对于与 InnoDB ClusterSet 一起使用的每个 MySQL Router 实例,您可以选择将其配置为跟随主集群,或仅连接到特定目标 InnoDB Cluster。您可以使用 MySQL Shell 在线在这些模式之间切换。
- 跟随初级
在这种模式下,MySQL Router 将应用程序流量(写入和读取)定向到 InnoDB ClusterSet 部署中的集群,该集群当前是主集群。此模式是默认模式。
- 命名目标集群
在此模式下,MySQL Router 将应用程序流量定向到您指定的 InnoDB Cluster。这可以是 InnoDB ClusterSet 部署中的主集群,也可以是副本集群。如果目标集群当前是主集群,则 MySQL Router 打开写入端口,应用程序可以写入实例。如果目标集群当前是只读副本集群,则 MySQL Router 只允许读取流量,拒绝写入流量。如果这种情况由于目标集群的切换或故障转移而发生变化,则 MySQL Router 会相应地更改允许的请求类型。如果应用程序只发出读取请求,则此模式很有用,
您还可以配置 MySQL Router 以允许或禁止读取流量到已标记为
INVALIDATED
. 处于此状态的集群当前根本无法作为 InnoDB ClusterSet 部署的一部分运行,并且无法接收写入。虽然集群不一定有任何技术问题,但它的数据正在变得陈旧。默认情况下,MySQL Router 不允许读取和写入无效的集群(drop_all
设置),但您可以选择允许读取(
accept_ro
设置)。
要针对 InnoDB ClusterSet 引导 MySQL Router,您需要使用 InnoDB Cluster 管理员帐户或 InnoDB Cluster 服务器配置帐户,它也具有所需的权限。MySQL Router 然后使用 MySQL Router 管理员帐户连接到 InnoDB ClusterSet 部署中的实例。在引导操作期间,您需要为这两个帐户指定用户名和密码。有关更多信息,请参阅 第 8.3 节,“InnoDB ClusterSet 的用户帐户”。
如果您使用现有的 InnoDB Cluster 作为 InnoDB ClusterSet 部署中的主集群,并且您已经针对该集群引导了 MySQL Router,请按照此过程的相关部分使用
--force
针对 InnoDB ClusterSet 的选项再次引导它,然后停止并重新启动 MySQL 路由器。需要为 InnoDB ClusterSet 更新 MySQL Router 实例的静态配置文件中的设置。
要将 MySQL Router 与 InnoDB ClusterSet 部署集成,请遵循以下过程:
如果您还没有这样做,请根据您的拓扑结构安装 MySQL Router 实例。建议将 MySQL Router 部署在与客户端应用程序相同的主机上。当使用沙箱部署时,一切都在单个主机上运行,因此您将 MySQL Router 部署到同一台主机。使用生产部署时,我们建议将一个 MySQL Router 实例部署到用于托管您的一个客户端应用程序的每台机器上。也可以将 MySQL Router 部署到您的应用程序实例连接的公用机器上。有关说明,请参阅 安装 MySQL 路由器。
-
使用 InnoDB Cluster 管理员帐户连接到 InnoDB ClusterSet 部署中的任何活动成员服务器实例。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。
ClusterSet
使用dba.getClusterSet()
or
命令获取对象。cluster
.getClusterSet()ClusterSet
当您使用适当的帐户连接到服务器实例时,获取该对象很重要 。存储在对象中的默认用户帐户用于某些操作,而不管您在连接上指定的帐户是什么。例如:mysql-js> \connect admin2@127.0.0.1:3310 ... mysql-js> myclusterset = dba.getClusterSet() <ClusterSet:testclusterset>
在这个例子中:
-
是集群中在线的任何成员服务器实例的类似 URI 的连接字符串。admin2
@127.0.0.1:3310
类似 URI 的连接字符串由以下元素组成:
是 InnoDB Cluster 管理员帐户的用户名。admin2
是成员服务器实例的主机和端口,如127.0.0.1:3310
命令所示。cluster
.status()返回的
ClusterSet
对象被分配给变量myclusterset
。
-
-
通过在连接到集群中的任何成员服务器时在 MySQL Shell 中 发出,验证 InnoDB ClusterSet 部署是否健康 。例如:clusterSet
.status()mysql-js> myclusterset.status({extended: 1})
选择扩展输出以查看 InnoDB ClusterSet 拓扑中集群的详细状态。这为您提供了每个成员服务器的主机和端口,因此您可以选择一个来引导 MySQL Router。有关更多信息,请参阅 第 8.6 节,“InnoDB ClusterSet 状态和拓扑”。
-
对于每个 MySQL Router 实例,在安装了 MySQL Router 的实例上的合适的 shell 中运行 mysqlrouter命令,以针对 InnoDB ClusterSet 引导 MySQL Router。在此示例中,
force
使用该选项是因为 MySQL Router 先前已针对主 InnoDB Cluster 进行了引导:$> 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
在这个例子中:
-
是 InnoDB ClusterSet 部署中在线的任何成员服务器实例的类似 URI 的连接字符串。该实例可以位于主集群或副本集群中。如果实例不是主集群中的主服务器,InnoDB ClusterSet 会将事务路由到该服务器,前提是 InnoDB ClusterSet 部署是健康的。icadmin
@127.0.0.1:3310
类似 URI 的连接字符串由以下元素组成:
是在主集群上使用命令设置的 InnoDB Cluster 管理员帐户的用户名icadmin
,然后复制到副本集群。引导操作会提示您输入该帐户的密码。InnoDB Cluster 管理员帐户的密码在 InnoDB ClusterSet 部署中的所有服务器实例上都是相同的。cluster
.setupAdminAccount()
是成员服务器实例的主机和端口,如127.0.0.1:3310
命令所示。clusterSet
.status()myRouter1
是在主集群上使用命令设置的 MySQL Router 管理员帐户的用户名 。该帐户在 InnoDB ClusterSet 部署中的所有服务器实例上都是相同的。引导操作会提示您输入该帐户的密码。cluster
.setupRouterAccount()--name
可用于为 MySQL Router 实例分配一个非默认名称,使其在 InnoDB ClusterSet 状态命令的输出中易于识别。--force
如果您要为先前已引导的现有 InnoDB 集群再次引导 MySQL Router,则需要。
MySQL Router 连接到服务器实例并检索 InnoDB ClusterSet 元数据。该过程与针对单个 InnoDB Cluster 引导 MySQL Router 时的过程相同。有关该过程的更多详细信息,请参阅 第 6.10.3 节,“部署 MySQL 路由器”。
-
-
引导每个 MySQL Router 实例后,通过在连接到 InnoDB ClusterSet 中的任何成员服务器时在 MySQL Shell 中 发出,验证它现在是否已针对 InnoDB ClusterSet 部署正确引导 。该命令返回所有已注册的 MySQL 路由器实例或您指定的路由器实例的详细信息。例如:clusterSet
.listRouters()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 路由器状态。
-
要查看为每个 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 路由器状态。clusterSet
.routingOptions() -
如果要更改全局路由策略或单个 MySQL Router 实例的路由策略,请
在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出。您一次只能设置一个路由选项。MySQL Router 实例需要几秒钟的时间来获取对路由策略的更改。clusterSet
.setRoutingOption()例如,为 InnoDB ClusterSet 发出的此命令
myclusterset
将 MySQL Router 实例的目标集群更改为集群clustertwo
:mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'clustertwo') Routing option 'target_cluster' successfully updated in router 'Rome1'.
在此示例中,
是myclusterset
ClusterSet
对象的变量,
是 MySQL Router 实例Rome1
的名称,是要定位的特定集群的名称。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'.
要设置全局路由策略,请不要指定 MySQL Router 实例,只需指定策略名称和设置即可。有关更多信息和可用路由选项的说明, 请参阅 InnoDB ClusterSet 的 MySQL 路由器状态。
当您准备好开始接受连接时,将应用程序配置为使用 MySQL 路由器侦听 InnoDB ClusterSet 部署流量的端口。然后在安装了 MySQL Router 的服务器中使用合适的 shell 或脚本启动 MySQL Router 实例。请参阅 启动 MySQL 路由器。