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 配置为允许或不允许读取标记为 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 部署集成,请遵循以下过程:
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 的连接字符串。admin2
是 InnoDB 集群管理员帐户的用户名。127.0.0.1:3310
是成员服务器实例的主机和端口,如 cluster.status()
命令所示。当连接到集群中的任何成员服务器时,通过在 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 部署正常。icadmin
是使用 cluster.setupAdminAccount()
命令在主集群上设置的 InnoDB Cluster 管理员帐户的用户名,然后复制到副本集群。引导操作将提示您输入帐户的密码。InnoDB Cluster 管理员帐户的密码在 InnoDB ClusterSet 部署中的所有服务器实例上都是相同的。127.0.0.1:3310
是成员服务器实例的主机和端口,如 clusterSet.status()
命令所示。clusterSet.status()
命令设置的 MySQL Router 管理员帐户的用户名。InnoDB ClusterSet 部署中所有服务器实例的帐户都相同。引导操作将提示您输入帐户的密码。--name
可用于为 MySQL Router 实例分配一个非默认名称,以使其在 InnoDB ClusterSet 状态命令的输出中易于识别。--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 。