MySQL 8.4 中的组复制使用组通信协议的概念,该协议的版本可以显式管理,并设置为适应您希望组支持的最旧 MySQL 服务器版本。这使您可以从使用不同 MySQL 服务器版本的成员中组建组,同时确保向后兼容性。
MySQL 5.7.14 及更高版本允许压缩消息(参见第 20.7.4 节,“消息压缩”)。
MySQL 8.0.16 及更高版本还允许分片消息(参见第 20.7.5 节,“消息分片”)。
MySQL 8.0.27 及更高版本还允许组通信引擎在组处于单主模式并且
group_replication_paxos_single_leader
设置为 true 时使用单个共识领导者(参见第 20.7.3 节,“单一共识领导者”)。
组的所有成员都必须使用相同的通信协议版本,以便组成员可以处于不同的 MySQL 服务器版本,但只能发送所有组成员都能理解的消息。
版本为 X 的 MySQL 服务器只能加入复制组并在复制组中达到ONLINE
状态,前提是组的通信协议版本小于或等于 X。当新成员加入复制组时,它会检查组中现有成员宣布的通信协议版本。如果加入的成员支持该版本,它会加入组并使用组宣布的通信协议,即使成员支持其他通信功能。如果加入的成员不支持通信协议版本,它将被驱逐出组。
如果两个成员试图在同一成员资格更改事件中加入,它们只能在两个成员的通信协议版本都与组的通信协议版本兼容的情况下加入。与组具有不同通信协议版本的成员必须单独加入。例如
一个 MySQL 服务器 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。
一个 MySQL 服务器 5.7.24 实例不能成功加入使用通信协议版本 8.0.16 的组。
两个 MySQL 服务器 8.0.16 实例不能同时加入使用通信协议版本 5.7.24 的组。
两个 MySQL 服务器 8.0.16 实例可以同时加入使用通信协议版本 8.0.16 的组。
您可以使用group_replication_get_communication_protocol()
函数检查组使用的通信协议,该函数返回组支持的最旧 MySQL 服务器版本。组的所有现有成员都返回相同的通信协议版本。例如
SELECT group_replication_get_communication_protocol();
+------------------------------------------------+
| group_replication_get_communication_protocol() |
+------------------------------------------------+
| 8.0.16 |
+------------------------------------------------+
请注意,group_replication_get_communication_protocol()
函数返回组支持的最低 MySQL 版本,这可能与传递给group_replication_set_communication_protocol()
函数的版本号不同,也可能与您使用该函数的成员安装的 MySQL 服务器版本不同。
如果您需要更改组的通信协议版本,以便早期版本的成员可以加入,请使用group_replication_set_communication_protocol()
函数来指定您想要允许的最旧成员的 MySQL 服务器版本。这将使组尽可能回退到兼容的通信协议版本。使用此函数需要GROUP_REPLICATION_ADMIN
权限,并且在您发出语句时,所有现有组成员都必须处于联机状态,并且没有丢失多数。例如
SELECT group_replication_set_communication_protocol("5.7.25");
如果您将复制组的所有成员升级到新的 MySQL 服务器版本,组的通信协议版本不会自动升级以匹配。如果您不再需要支持早期版本的成员,您可以使用group_replication_set_communication_protocol()
函数将通信协议版本设置为已将成员升级到的新 MySQL 服务器版本。例如
SELECT group_replication_set_communication_protocol("8.0.16");
group_replication_set_communication_protocol()
函数作为组操作实现,因此它将在组的所有成员上同时执行。组操作开始缓冲消息并等待已在进行中的任何传出消息的传递完成,然后更改通信协议版本并发送缓冲的消息。如果您在更改通信协议版本后尝试在任何时间加入组,组成员会宣布新的协议版本。
MySQL InnoDB 集群会在使用 AdminAPI 操作更改集群拓扑时自动并透明地管理其成员的通信协议版本。InnoDB 集群始终使用当前构成集群的一部分或加入集群的所有实例支持的最新通信协议版本。有关详细信息,请参见InnoDB 集群和组复制协议。