6.4.1引导MySQL路由器

你在InnoDB replicasset或InnoDB Cluster上启动MySQL Router来自动配置路由。引导过程是运行MySQL路由器的一种特殊方式,它不启动通常的路由,而是配置mysqlrouter.conf基于元数据的文件。要在命令行中提升MySQL路由器,请传入——引导选项时mysqlrouter命令,它从元数据中检索拓扑信息,并配置到服务器实例的路由连接。或者,在Windows上使用MySQL安装程序来启动MySQL路由器,参见MySQL路由器配置MySQL安装程序。一旦MySQL路由器启动,客户端应用程序就会连接到它发布的端口。MySQL路由器根据传入端口自动将客户端连接重定向到实例,例如6646被默认用于使用经典MySQL协议的读写连接。在拓扑变化的事件中,例如由于一个实例的意外失败,MySQL路由器检测到变化,并自动调整路由到其余的实例。这消除了客户端应用程序处理故障转移或了解底层拓扑的需要。有关更多信息,请参见MySQL InnoDB集群路由

请注意

不要尝试手动配置MySQL路由器重定向到服务器实例。总是使用——引导选项,因为这确保MySQL路由器从元数据获取其配置。看到集群元数据和状态

配置MySQL路由器用户

当MySQL路由器连接到InnoDB集群或InnoDB复制集时,它需要一个具有正确权限的用户帐户。从MySQL路由器8.0.19版本,这个内部用户可以使用——帐户选择。在以前的版本中,MySQL路由器在集群的每次引导时都创建了内部帐户,这可能会随着时间的推移导致大量帐户的积累。从MySQL Shell版本8.0.20,您可以使用AdminAPI设置MySQL路由器所需的用户帐户。使用setupRouterAccount(用户、[选项])操作创建MySQL用户帐户或升级现有帐户,以便MySQL路由器使用它来操作InnoDB集群或InnoDB复制集。这是配置MySQL路由器与InnoDB集群和InnoDB复制集的推荐方法。

要添加一个新的MySQL路由器帐户名为myRouter1到变量引用的InnoDB集群testCluster问题:

mysqlsh > testCluster.setupRouterAccount (myRouter1)

在本例中,没有指定域,因此使用通配符创建帐户(%)字符,确保创建的用户可以从任何域连接。将帐户限制为只能从example.com域,问题:

mysqlsh > testCluster.setupRouterAccount (myRouter1@example.com)

该操作提示输入密码,然后为MySQL路由器用户设置正确的权限。如果InnoDB Cluster或InnoDB replicasset有多个实例,则创建的MySQL Router用户会传播到所有实例。

当你已经配置了一个MySQL路由器用户,例如,如果你使用的是8.0.20之前的版本,你可以使用setupRouterAccount ()操作重新配置现有用户。在这种情况下,传入更新选项设置为true。例如,重新配置myOldRouter用户问题:

mysqlsh > testCluster.setupRouterAccount (myOldRouter, {'update':1})

部署MySQL路由器

建议将MySQL路由器部署在与应用程序相同的主机上。当使用沙箱部署时,所有的东西都运行在一台主机上,因此MySQL路由器部署在同一台主机上。当使用生产部署时,我们建议在每台机器上部署一个MySQL Router实例,用于托管一个客户端应用程序。也可以将MySQL路由器部署到一台普通的机器上,通过它来连接应用程序实例。有关更多信息,请参见安装MySQL路由器

要启动基于InnoDB集群或InnoDB ReplicaSet的MySQL路由器,你需要一个类似uri的连接字符串到一个在线实例。运行mysqlrouter命令,并提供——引导=实例选项,实例是到在线实例的类似uri的连接字符串。MySQL路由器连接到该实例,并使用包含的元数据缓存插件来检索元数据,包括服务器实例地址和它们的角色列表。例如:

mysqlrouter——bootstrap icadmin@ic-1:3306——user=mysqlrouter

提示您输入MySQL路由器使用的实例密码和加密密钥。此加密密钥用于加密MySQL路由器用于连接到集群的实例密码。还将显示您可以用于客户端连接的端口。有关其他引导相关选项,请参见引导选项

提示

在这一点上MySQL路由器还没有启动,所以它将路由连接。引导是一个独立的过程。

MySQL路由器启动进程创建一个mysqlrouter.conf文件,根据从传递给——引导选项,在上面的例子icadmin@ic-1:3306。基于检索到的元数据,MySQL路由器自动配置mysqlrouter.conf文件,包括metadata_cache部分。如果你使用的是MySQL路由器8.0.14和更高版本——引导选项自动配置MySQL路由器跟踪和存储活跃的MySQL元数据服务器地址在路径配置dynamic_state。这确保当MySQL路由器重启时,它知道哪些MySQL元数据服务器地址是当前的。有关更多信息,请参见dynamic_state10bet官方网站文档。

在MySQL路由器的早期版本中,元数据服务器信息是在MySQL路由器的初始引导操作期间定义的,并被静态存储为bootstrap_server_addresses在配置文件中,其中包含集群中所有服务器实例的地址。例如:

[metadata_cache:prodCluster] router_id=1 bootstrap_server_addresses=mysql://icadmin@ic-1:3306,mysql://icadmin@ic-2:3306,mysql://icadmin@ic-3:3306 user=mysql_router1_jy95yozko3k2 metadata_cluster=prodCluster ttl=300
提示

如果使用MySQL路由器8.0.13或更早的版本,当你通过添加另一个服务器实例来改变集群的拓扑结构时,你需要更新MySQL路由器bootstrap_server_addresses基于更新的元数据。或者重启MySQL路由器使用——引导选项,或手动编辑bootstrap_server_addresses部分的mysqlrouter.conf重新启动MySQL路由器。

生成的MySQL路由器配置将创建用于连接到集群的TCP端口。默认情况下,创建了使用经典MySQL协议和X协议与集群通信的端口。要使用X协议,服务器实例必须安装和配置X Plugin,这是MySQL 8.0及更高版本的默认设置。缺省可用的TCP端口为:

  • 6446-对于经典的MySQL协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。

  • 6447-对于经典的MySQL协议只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。

  • 64460-对于X协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。

  • 64470-对于X协议只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。

根据你的MySQL路由器配置,端口号可能与上面不同。例如,如果您使用——conf-base-port选项,或group_replication_single_primary_mode变量。当你启动MySQL路由器时,会列出确切的端口。

传入连接的重定向方式取决于所使用的底层拓扑。例如,当使用单主集群时,默认情况下MySQL路由器发布一个X协议和一个经典的MySQL协议端口,客户端连接到该端口进行读写会话,该端口被重定向到集群的单主。对于多主集群,读写会话以循环方式重定向到一个主实例。例如,这意味着到端口6446的第一个连接将重定向到ic-1实例,到端口6446的第二个连接将重定向到ic-2实例,以此类推。对于传入的只读连接,MySQL Router将连接重定向到一个辅助实例,也是以轮循的方式。若要修改此行为,请参见routing_strategy选择。

一旦引导和配置,启动MySQL路由器。如果您使用的是系统范围的安装——引导选择问题:

壳> mysqlrouter &

如果你安装MySQL路由器到一个目录使用——目录选项,使用start.sh在您要安装的目录中找到的脚本。或者设置一个服务,在系统启动时自动启动MySQL路由器,参见启动MySQL路由器。您现在可以连接一个MySQL客户端,如MySQL Shell到上面描述的一个传入MySQL路由器端口,并查看客户端如何透明地连接到一个服务器实例。

Shell > mysqlsh——uri root@localhost:6442

要验证实际连接的是哪个实例,只需对港口状态变量。

mysql-js> \sql切换到sql模式…命令以;mysql-sql >选择@@port;+--------+ | @@ 港口  | +--------+ | 3310年  | +--------+

使用复制集与MySQL路由器

你可以使用MySQL Router 8.0.19或更高版本来引导InnoDB replicasset,参见6.4节,“MySQL路由器”。生成的MySQL路由器配置文件的唯一区别是添加了cluster_type选择。当MySQL路由器针对replicasset启动时,生成的配置文件包括:

cluster_type = rs

当你使用MySQL路由器和InnoDB复制集时,请注意:

  • MySQL路由器的读写端口将客户端连接定向到replicasset的主实例

  • MySQL路由器的只读端口将客户端连接引导到replicasset的一个二级实例,尽管它也可以将它们引导到主实例

  • MySQL路由器从主实例中获取有关ReplicaSet拓扑的信息

  • 当主实例不可用时,另一个实例被提升时,MySQL路由器自动恢复

你可以使用与InnoDB集群完全相同的方式在replicasset上启动的MySQL路由器实例。看到使用集群的路由器的信息ReplicaSet.listRouters ()ReplicaSet.removeRouterMetadata ()