摘要
MySQL 路由器是 InnoDB 集群的一部分,是轻量级中间件,可在应用程序和后端 MySQL 服务器之间提供透明路由。它可用于各种用例,例如通过有效地将数据库流量路由到适当的后端 MySQL 服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员能够针对自定义用例扩展 MySQL 路由器。有关用 MySQL 路由器如何构建 InnoDB 群集的其他详细信息,请参阅 InnoDB群集。
强烈建议 MySQL Router 8.0 与 MySQL Server 8.0 或 5.7 版一起使用。
有关详细说明每个版本中的更改的说明,请参阅 MySQL Router发行说明。
如果您尚未安装 MySQL Router,请从 下载站点下载。
有关使用MySQL的帮助,请访问 MySQL论坛,在那里您可以与其他MySQL用户讨论您的问题。
MySQL Router 分商业版本和社区版本,许可信息不太一样。
目录
- 一般信息
- 安装 MySQL Router
- 部署 MySQL Router
- 配置
- MySQL Router 应用程序
- MySQL Router 常见问题解答
第1章一般信息
目录
1.1 MySQL InnoDB集群的路由
1.2集群元数据和状态
1.3连接路由
1.4应用注意事项
1.5 MySQL Router 8.0的新功能
MySQL路由器是高可用性(HA)解决方案的构建块。它通过智能地将连接路由到MySQL服务器来简化应用程序开发,从而提高性能和可靠性。
MySQL Router 8 完全支持 MySQL 5.7 和 MySQL 8,它取代了MySQL Router 2.x系列。如果您当前使用的是Router 2.0或2.1,那么我们建议您将安装升级到MySQL Router 8。
1.1 MySQL InnoDB集群的路由
MySQL路由器是InnoDB集群的一部分,是轻量级中间件,可在应用程序和后端MySQL服务器之间提供透明路由。它用于各种用例,例如通过将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员能够针对自定义用例扩展MySQL路由器。
有关Router如何成为InnoDB集群的其他详细信息,请参阅InnoDB集群。
介绍
对于客户端应用程序来处理故障转移,他们需要了解InnoDB集群拓扑并知道哪个MySQL实例是PRIMARY。虽然应用程序可以实现该逻辑,但MySQL路由器可以为您提供和处理此功能。
MySQL使用组复制在多个服务器之间复制数据库,同时在服务器发生故障时执行自动故障转移。当与MySQL InnoDB集群一起使用时,MySQL路由器充当代理,以隐藏网络上的多个MySQL实例,并将数据请求映射到其中一个集群实例。只要有足够的在线副本并且组件之间的通信完好无损,应用程序就能够联系其中一个。MySQL路由器也可以让应用程序连接到MySQL路由器而不是直接连接到MySQL。
使用MySQL InnoDB集群部署路由器
MySQL路由器的推荐部署模型是InnoDB集群,其中Router与应用程序位于同一主机上。
配置集群后,使用InnoDB集群部署MySQL路由器的步骤如下:
安装 MySQL路由器。
Bootstrap InnoDB集群,并进行测试。
Bootstrapping通过使用--bootstrap和其他命令行选项自动为现有InnoDB集群配置MySQL路由器 。在引导期间,路由器连接到群集,获取其元数据,并配置自己使用。Bootstrapping是可选的。
有关其他信息,请参阅 第3章,部署MySQL路由器。
设置MySQL路由器以实现自动启动。
将系统配置为在重新引导主机时自动启动MySQL路由器,该过程类似于MySQL服务器配置为自动启动的过程。有关其他详细信息,请参见 第5.1节“启动MySQL路由器”。
例如,在创建MySQL InnoDB集群后,您可以使用以下命令配置MySQL路由器:
shell> mysqlrouter --bootstrap localhost:3310 --directory /opt/myrouter --user snoopy
此示例将MySQL路由器引导至现有的InnoDB集群,其中:
localhost:3310 是InnoDB集群的成员,PRIMARY或引导程序将重定向到集群中的PRIMARY。
由于使用了可选的 --directory引导选项,因此本示例创建一个包含所有生成的目录和文件的自包含安装 /opt/myrouter/。这些文件包括 start.sh,stop.sh, log/,和一个全功能的MySQL路由器配置文件名为 mysqlrouter.conf。
只有主机的系统用户snoopy 才能访问/opt/myrouter/*。
有关--bootstrap修改引导程序配置过程的方法,请参阅相关选项。例如,传入 --conf-use-sockets启用Unix域套接字连接,因为默认情况下仅启用TCP / IP连接。
1.2集群元数据和状态
MySQL路由器通过坐在应用程序和MySQL服务器之间工作。应用程序通常连接到路由器,就好像它们连接到普通的MySQL服务器一样。每当应用程序连接到路由器时,路由器从其知道的候选池中选择合适的MySQL服务器,然后连接到它。从那一刻开始,Router转发应用程序和MySQL之间的所有网络流量,包括从它返回的响应。
MySQL路由器保留在线MySQL服务器的缓存列表,或配置的InnoDB集群的拓扑和状态。最初,当路由器启动时,列表从路由器的配置文件加载。当使用该--bootstrap选项引导路由器时,此列表是使用InnoDB群集服务器生成的 。
为了更新缓存,元数据缓存组件与包含元数据的InnoDB集群服务器之一保持开放连接。它通过从MySQL的性能模式查询元数据数据库和实时状态信息来实现。每当修改InnoDB集群时都会更改集群元数据,例如使用MySQL Shell添加或删除MySQL服务器,并且只要检测到集群状态更改,就会通过MySQL服务器的Group Replication插件实时更
新performance_schema表。例如,如果其中一个MySQL服务器出现意外关闭。
当路由器检测到连接的MySQL服务器关闭时,例如因为元数据缓存已丢失其连接而无法再次连接,它会尝试连接到不同的MySQL服务器以从新的MySQL服务器获取元数据和InnoDB集群状态。
关闭的MySQL服务器的应用程序连接会自动关闭。然后,他们必须重新连接到Router,后者将它们重定向到在线MySQL服务器。
1.3连接路由
连接路由意味着将MySQL连接重定向到可用的MySQL服务器。MySQL数据包完整路由,无需检查。有关使用基本连接路由的示例部署,请参见 第3.3节“基本连接路由”。
应用程序连接到MySQL路由器而不是直接连接到MySQL服务器,如果连接失败,则应用程序将重试连接,因为MySQL路由器在尝试失败后选择新的MySQL服务器。这也称为简单重定向连接路由,因为它需要应用程序重试连接。也就是说,如果从MySQL路由器到MySQL服务器的连接中断,则应用程序遇到连接失败。但是,新的连接尝试会触发路由器查找并连接到另一台MySQL服务器。
路由服务器和路由策略在配置文件中定义。例如,以下部分告诉MySQL路由器监听localhost的端口7002上的连接,然后将这些连接重定向到由该destinations选项定义的MySQL实例,包括在本地主机上运行的服务器侦听端口3306,3307和3308。我们还使用该 routing_strategy选项来使用循环形式的负载平衡。有关其他信息,请参见 第4.3节“配置选项”
[routing:simple_redirect] bind_port = 7002 routing_strategy = round-robin destinations = localhost:3306,localhost:3307,localhost:3308
此示例部分标题为 routing:simple_redirect。第一部分 routing是内部使用的部分名称,用于确定要加载的插件。第二部分 simple_redirect是可选的部分键,用于区分其他路由策略。
当服务器不再可访问时,MySQL路由器将移动到列表中的下一个服务器目标,如果列表按照循环策略耗尽,则循环回第一个服务器目标。
注意在MySQL Router 8.0之前,使用了现已弃用的 mode选项,而不是routing_strategy MySQL Router 8.0中添加的选项。
1.4应用注意事项
MySQL路由器使用不需要特定的库或接口。除了管理MySQL路由器实例之外,编写应用程序就像MySQL路由器是典型的MySQL实例一样。
使用MySQL路由器的唯一区别是如何建立与MySQL服务器的连接。必须更新在启动时使
用单个MySQL连接而不测试连接错误的应用程序。这是因为MySQL路由器在尝试连接时重定向连接,并且不读取数据包或执行分析。如果MySQL服务器出现故障,Router会将连接错误返回给应用程序。
出于这些原因,应编写应用程序以测试连接错误,如果遇到,则重试连接。如果在您的应用程序中使用此技术或类似技术,那么使用MySQL路由器将不需要任何额外的努力。
以下内容更好地说明了为什么您可能希望使用MySQL路由器并从应用程序的角度研究它的使用方式。
方案
MySQL路由器有几种可能的场景,包括:
作为开发人员,我希望我的应用程序连接到服务,以便默认情况下连接到组复制集群的当前主服务器。
作为管理员,我想设置多个服务,以便MySQL路由器在每个高可用副本集的不同端口上进行侦听。
作为管理员,我希望能够在端口3306上运行连接路由服务,以使其对用户或应用程序更加透明。
作为管理员,我想为每个连接路由服务配置一个模式,以便指定是返回主服务器还是辅助服务器。
MySQL路由器的工作流程
使用MySQL路由器的工作流程如下:
- MySQL客户端或连接器连接到MySQL路由器,例如,端口6446。
- 路由器检查可用的MySQL服务器。
- 路由器打开与合适的MySQL服务器的连接。
- 路由器在应用程序和MySQL服务器之间来回转发数据包
- 如果连接的MySQL服务器出现故障,路由器将断开连接。然后,应用程序可以重试连接到路由器,然后路由器选择一个不同的可用MySQL服务器。
使用MySQL路由器连接
应用程序连接到MySQL路由器,路由器将应用程序连接到可用的MySQL服务器。
此示例演示连接是否透明地连接到其中一个InnoDB集群实例。因为此示例使用沙盒InnoDB集群,其中所有实例都在同一主机上运行,所以我们检查port 状态变量以查看连接了哪个MySQL实例。
使用MySQL客户端连接MySQL路由器,例如:
shell> mysql -u root -h 127.0.0.1 -P 6446 -p
这些端口号取决于您的配置,但在此示例中比较端口:
mysql> select @@port; +--------+ | @@port | +--------+ | 3310 | +--------+ 1 row in set (0.00 sec)
总而言之,客户端(应用程序)连接到端口6446但连接到端口3310上的MySQL实例。
建议
以下是使用MySQL路由器的建议。
在与应用程序相同的主机上安装并运行MySQL Router。有关原因的列表,请参阅 第3章,部署MySQL路由器。
bind_port = 127.0.0.1:<port>在配置文件中 使用路由器绑定到localhost 。或者,在Linux上,禁用TCP连接(请参阅参考资料 --conf-skip-tcp)并将其限制为仅使用Unix套接字连接(请参阅参考资料 --conf-use-sockets)。
1.5 MySQL Router 8.0的新功能
本节总结了MySQL Router 8.0中添加的许多与MySQL Router 2.1相关的新功能。
版本编号
MySQL Router 8.0.3是第一个使用新编号的8.0.x版本,是MySQL Router 2.1.4的后续版本。
MySQL连接器和其他MySQL客户端工具和应用程序现在将其版本号的第一个数字与它们支持的(最高)MySQL服务器版本同步。此更改使您可以轻松直观地确定要将哪个客户端版本用于哪个服务器版本。同样,MySQL路由器现在使用与MySQL服务器相同的版本号。
新功能和变化
routing_strategy 添加了 可选 配置选项。可用的值是 first-available, next-available, round-robin,和 round-robin-with-fallback。
以前,这些策略通过mode配置选项描述为调度模式,其中读写模式默认为第一个可用策略,而只读模式默认为循环策略。这保留了这些模式的先前行为。
在--ssl-key和 --ssl-cert可选的引导命令行选项添加。他们直接使用MySQL客户端的对应方,并指定客户端证书和私钥以方便客户端身份验证。当在引导期间使用的root帐户是使用REQUIRE X509创建时,这很有用,这需要客户端在登录时进行身份验证。
添加了 新的 connect_timeout 和 read_timeout元数据配置文件选项。它们在[DEFAULT]命名空间下定义,并影响内部操作,例如元数据服务器连接。
Bootstrap现在接受InnoDB集群的任何成员,并自动查找并重新连接到可写主服务器。以前,只接受了初级。
Bootstrap现在接受该 --config选项并读取[logger] level 选项的定义。
最大并发客户端连接数从大约500增加到超过5000,这个限制现在取决于操作系统。为此,基于select()的fd事件调用被poll()(或Windows上的WSAPoll())取代。
添加了 一个新的mysqlrouter_plugin_info实用程序来帮助调试MySQL路由器插件。它提供了诸如插件版本,描述,ABI版本,要求和函数指针之类的信息。
其他变更
有关MySQL Router 8.0中引入的所有更改的完整列表,请参阅 MySQL Router 8.0发行说明