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 Cluster 。您可以使用 MySQLShell 在线切换这些模式。
-
跟随主集群
- 在这种模式下,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 集群作为 InnoDB ClusterSet 部署中的主集群,并且已经针对该集群引导 MySQL Router, 请遵循此过程的相关部分,针对 InnoDB ClusterSet 使用--force
选项再次引导它,然后停止并重新启动 MySQL Router。 需要为 InnoDB ClusterSet 更新 MySQL Router 实例的静态配置文件中的设置。
要将 MySQL Router 与 InnoDB ClusterSet 部署集成,请遵循以下过程:
- 如果您还没有这样做,请根据您的拓扑安装 MySQL 路由器实例。建议将 MySQL Router 部署在与客户端应用程序相同的主机上。当使用沙盒部署时,所有内容都在一台主机上运行,因此您将 MySQL Router 部署到同一台主机。在使用生产部署时,我们建议在用于托管一个客户端应用程序的每台计算机上部署一个 MySQL 路由器实例。也可以将 MySQL 路由器部署到应用程序实例连接的公共计算机。有关说明,请参阅 安装 MySQL Router 。
- 使用 InnoDB Cluster 管理员帐户连接到 InnoDB ClusterSet 部署中的任何活动成员服务器实例。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。使用
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。
-
当连接到集群中的任何成员服务器时,通过在 MySQL Shell 中发出
clusterSet.status()
,验证InnoDB ClusterSet 部署是否正常。例如: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
在此例中:
icadmin@127.0.0.1:3310
是 InnoDB ClusterSet 部署中在线的任何成员服务器实例的类似 URI 的连接字符串。实例可以位于主集群或副本集群中。如果实例不是主集群中的主服务器,InnoDB ClusterSet 会将事务路由到该服务器,前提是 InnoDB ClusterSet 部署正常。
类似 URI 的连接字符串由以下元素组成:icadmin
是使用cluster.setupAdminAccount()
命令在主集群上设置的 InnoDB Cluster 管理员帐户的用户名,然后复制到副本集群。引导操作将提示您输入帐户的密码。InnoDB Cluster 管理员帐户的密码在 InnoDB ClusterSet 部署中的所有服务器实例上都是相同的。127.0.0.1:3310
是成员服务器实例的主机和端口,如clusterSet.status()
命令所示。
- myRouter1 是在主集群上使用
clusterSet.status()
命令设置的 MySQL Router 管理员帐户的用户名。InnoDB ClusterSet 部署中所有服务器实例的帐户都相同。引导操作将提示您输入帐户的密码。 --name
可用于为 MySQL Router 实例分配一个非默认名称,以使其在 InnoDB ClusterSet 状态命令的输出中易于识别。- 如果您再次为先前引导的现有 InnoDB Cluster 引导 MySQL Router ,则需要
--force
。
-
在引导每个 MySQL Router 实例后,在连接到 InnoDB ClusterSet 中的任何成员服务器时,通过在 MySQL Shell 中执行
clusterSet.listRouters()
, 验证它现在是否已正确引导到 InnoDB Cluster Set 部署。该命令返回所有已注册的 MySQL 路由器实例或您指定的路由器实例的详细信息。例如: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 状态 。
-
要查看为每个 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
的集群发送读和写流量。有关clusterSet.routingOptions()
命令输出的更多信息和解释,请参阅 InnoDB ClusterSet 的 MySQL Router 状态 。 -
如果要更改全局路由策略或单个 MySQL 路由器实例的路由策略,请在连接到 InnoDB clusterSet 部署中的任何成员服务器时,在 MySQL Shell 中执行
clusterSet.setRoutingOption()
。 一次只能设置一个路由选项。MySQL 路由器实例需要几秒钟的时间来获取对路由策略的更改。例如,为 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 对象的变量,Rome1 是 MySQL 路由器实例的名称,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 Router 状态 。
-
当您准备好开始接受连接时,将应用程序配置为使用 MySQL Router 监听 InnoDB ClusterSet 部署流量的端口。然后在安装 MySQL Router 的服务器上使用合适的 shell 或脚本启动 MySQL Router 实例。请参阅 启动 MySQL Router 。