20.3 将 MySQLRouter 与 InnoDB 群集一起使用

本节介绍如何将 MySQLRouter 与 InnoDB 群集一起使用以实现高可用性。无论您是否部署了沙箱或生产集群,MySQLRouter 都可以使用--bootstrap选项基于 InnoDB 集群的元数据进行自我配置。这将自动配置 MySQLRouter,以将连接路由到群集的服务器实例。Client 端应用程序连接到 MySQLRouter 提供的端口,而无需了解 InnoDB 集群拓扑。万一发生意外故障,InnoDB 集群会自动进行自我调整,并且 MySQL Router 会检测到更改。这消除了您的 Client 端应用程序处理故障转移的需要。有关更多信息,请参见MySQL InnoDB 集群的路由

Note

不要尝试手动配置 MySQLRouter 以重定向到 InnoDB 集群的端口。始终使用--bootstrap选项,因为这可确保 MySQL Router 从 InnoDB 集群的元数据中获取其配置。参见集群元数据和状态

建议的 MySQL Router 部署与应用程序位于同一主机上。使用沙箱部署时,所有内容都在单个主机上运行,因此,您将 MySQL Router 部署到同一主机上。在使用生产部署时,建议将一个 MySQLRouter 实例部署到用于承载一个 Client 端应用程序的每台计算机上。也可以将 MySQLRouter 部署到应用程序实例通过其连接的通用计算机上。您需要 InnoDB 集群的 MASTER 键来自动配置 MySQLRouter。

假设已经安装了 MySQL Router(请参阅安装 MySQLRouter),请使用--bootstrap选项提供属于 InnoDB 集群的服务器实例的位置。 MySQLRouter 使用附带的元数据缓存插件来检索 InnoDB 集群的元数据,该元数据由构成 InnoDB 集群及其在集群中的角色的服务器实例地址列 table 组成。您传递 MySQLRouter 应从中检索 InnoDB 群集元数据的服务器的 URI 类型字符串。例如:

shell> mysqlrouter --bootstrap ic@ic-1:3306 --user=mysqlrouter

系统将提示您 Importing 要使用的 MySQL 实例的实例密码和加密密钥。该加密密钥用于加密 MySQLRouter 用于连接集群的实例密码。还会显示可用于连接到 InnoDB 集群的端口。 MySQLRouter 引导过程创建一个mysqlrouter.conf文件,其设置基于从传递给--bootstrap选项的地址中检索到的集群元数据,在上面的示例ic@ic-1:3306中。基于检索到的 InnoDB 集群元数据,MySQL Router 自动创建一个配置文件,包括一个metadata_cache部分和bootstrap_server_addresses,其中包含集群中所有服务器实例的地址。例如:

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

Tip

在引导 MySQLRouter 后通过添加另一个服务器实例来更改群集的拓扑时,您需要基于更新的元数据来更新bootstrap_server_addresses。使用--bootstrap选项重新启动 MySQL Router,或者手动编辑mysqlrouter.conf文件的bootstrap_server_addresses部分并重新启动 MySQL Router。

生成的 MySQLRouter 配置将创建用于连接到群集的 TCP 端口。创建用于使用经典 MySQL 协议和 X 协议与集群通信的端口。要使用 X 协议,服务器实例必须安装和配置 X 插件。对于沙箱部署,实例会自动设置 X 插件。对于生产部署,如果要使用 X 协议,则需要在每个实例上安装和配置 X 插件,请参阅第 19.2 节“将 MySQL 设置为文档存储”。默认的可用 TCP 端口为:

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

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

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

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

根据您的 MySQLRouter 配置,端口号可能与上述端口号不同。例如,如果您使用--conf-base-port选项或group_replication_single_primary_mode变量。启动 MySQL Router 时,将列出确切的端口。

传入连接的重定向方式取决于所使用的群集类型。使用单主要群集时,读写会话将重定向到单个主要实例,而使用多主要群集时,读写会话将重定向到主要实例之一。对于传入的只读连接,MySQL Router 以循环方式将连接重定向到辅助实例之一。

自举并配置后,启动 MySQL Router:

shell> mysqlrouter &

或者,设置服务以在系统启动时自动启动 MySQL Router,请参阅启动 MySQLRouter。您现在可以如上所述将 MySQLClient 端(例如 MySQL Shell)连接到传入的 MySQLRouter 端口之一,并查看 Client 端如何透明地连接到 InnoDB 集群实例之一。

shell> mysqlsh --uri root@localhost:6442

要验证您实际连接到的实例,只需对状态port发出 SQL 查询。

mysql-js> \sql
Switching to SQL mode... Commands end with ;
mysql-sql> select @@port;
+--------+
| @@port |
+--------+
|   3310 |
+--------+

测试高可用性

要测试高可用性是否有效,请通过杀死实例来模拟意外的停止。群集检测到实例已离开群集并重新配置自身的事实。集群本身如何 true 进行重新配置取决于您使用的是单主集群还是多主集群,以及实例在集群中扮演的角色。

在单主要模式下:

  • 如果当前主节点离开群集,则将选择辅助实例之一作为新的主实例,实例的优先级由最低的server_uuid优先。 MySQL Router 将读写连接重定向到新选择的主数据库。

  • 如果当前辅助节点离开群集,则 MySQLRouter 将停止将只读连接重定向到该实例。

有关更多信息,请参见第 17.4.1.1 节“单主模式”

在多主要模式下:

  • 如果当前的“ R/W”实例离开集群,则 MySQLRouter 会将读写连接重定向到其他主数据库。

  • 如果当前的“ R/O”实例离开集群,

有关更多信息,请参见第 17.4.1.2 节“多主模式”

有多种方法可以模拟离开群集的实例,例如,您可以在实例上强制停止 MySQL 服务器,或者在测试沙箱部署时使用 AdminAPI dba.killSandboxInstance()。在此示例中,假设有一个具有三个服务器实例的单主要沙箱群集部署,并且侦听端口 3310 的实例是当前主要实例。模拟实例意外离开集群:

mysql-js> dba.killSandboxInstance(3310)

使用\sql命令在 MySQL Shell 中切换到 SQL 模式,并验证port变量以检查连接到哪个实例。请注意,第一个SELECT语句失败,因为与原始主数据库的连接丢失。这意味着当前会话已经关闭,MySQL Shell 为您自动重新连接,并且当您再次发出命令时,将确认新端口。

mysql-js> \sql
Switching to SQL mode... Commands end with ;
mysql-sql> SELECT @@port;
ERROR: 2013 (HY000): Lost connection to MySQL server during query
The global session got disconnected.
Attempting to reconnect to 'root@localhost:6446'...
The global session was successfully reconnected.
mysql-sql> SELECT @@port;
+--------+
| @@port |
+--------+
|   3330 |
+--------+
1 row in set (0.00 sec)

这 table 明 InnoDB 集群为我们提供了自动故障转移,MySQL Router 已自动将我们重新连接到新的主实例,并且我们具有高可用性。

MySQLRouter 和元数据服务器

当 MySQLRouter 针对群集进行引导时,它将服务器实例的地址记录在其配置文件中。如果在引导 MySQLRouter 后将任何其他实例添加到集群中,则不会自动检测到它们,因此不会用于连接路由。

为确保新添加的实例正确路由,您必须针对群集引导 MySQLRouter 以读取更新的元数据。这意味着您必须重新启动 MySQL Router 并包括--bootstrap选项。