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。您可以使用 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,请按照此过程的相关部分使用针对 InnoDB ClusterSet 的 --force
选项再次引导它,然后停止并重新启动 MySQL Router。需要为 InnoDB ClusterSet 更新 MySQL Router 实例的静态配置文件中的设置。
要将 MySQL Router 与 InnoDB ClusterSet 部署集成,请按照以下步骤操作
如果尚未这样做,请根据您的拓扑安装 MySQL Router 实例。MySQL Router 的建议部署是在与客户端应用程序相同的主机上。使用沙箱部署时,所有内容都在单个主机上运行,因此您将 MySQL Router 部署到同一主机。使用生产部署时,我们建议将一个 MySQL Router 实例部署到用于托管您的一个客户端应用程序的每台计算机上。也可以将 MySQL Router 部署到您的应用程序实例通过其连接的公共计算机。有关说明,请参阅安装 MySQL Router。
-
使用 InnoDB Cluster 管理员帐户连接到 InnoDB ClusterSet 部署中的任何活动成员服务器实例。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。使用
dba.getClusterSet()
或
命令获取cluster
.getClusterSet()ClusterSet
对象。当您使用适当的帐户连接到服务器实例时,获取ClusterSet
对象非常重要。无论您在连接上指定哪个帐户,对象中存储的默认用户帐户都将用于某些操作。例如mysql-js> \connect [email protected]: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 [email protected]: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 类连接字符串由以下元素组成
是使用主集群上的icadmin
命令设置的 InnoDB Cluster 管理员帐户的用户名,然后复制到副本集群。引导操作会提示您输入帐户的密码。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
如果您要为先前已引导 MySQL Router 的现有 InnoDB Cluster 再次引导它,则需要使用此选项。
MySQL Router 连接到服务器实例并检索 InnoDB ClusterSet 元数据。该过程与您针对单个 InnoDB Cluster 引导 MySQL Router 时相同。有关该过程的更多详细信息,请参阅第 6.10.3 节,“部署 MySQL Router”。
-
-
引导每个 MySQL Router 实例后,通过在连接到 InnoDB ClusterSet 中的任何成员服务器时在 MySQL Shell 中发出
,验证它现在是否已针对 InnoDB ClusterSet 部署正确引导。该命令返回所有已注册 MySQL Router 实例或您指定的路由器实例的详细信息。例如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 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
的集群进行读写流量。有关更多信息以及对
命令输出的说明,请参阅适用于 InnoDB ClusterSet 的 MySQL Router 状态。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'.
有关可用路由选项的更多信息,请参阅第 6.10.4 节“路由选项”。
要设置全局路由策略,请勿指定 MySQL Router 实例,只需指定策略名称和设置。有关更多信息以及对可用路由选项的说明,请参阅适用于 InnoDB ClusterSet 的 MySQL Router 状态。
准备好开始接受连接后,请将应用程序配置为使用 MySQL Router 侦听 InnoDB ClusterSet 部署流量的端口。然后,使用安装了 MySQL Router 的服务器中的合适 shell 或脚本启动 MySQL Router 实例。请参阅启动 MySQL Router。