MySQL 9.0 中的组复制使用组通信协议的概念,该协议的版本可以显式管理,并设置为适应您希望组支持的最旧的 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 服务器只能在复制组的通信协议版本小于或等于 X 时加入并达到 ONLINE
状态。当新成员加入复制组时,它会检查组中现有成员宣布的通信协议版本。如果加入的成员支持该版本,它将加入组并使用组宣布的通信协议,即使成员支持其他通信功能也是如此。如果加入的成员不支持通信协议版本,则会将其从组中驱逐。
如果两个成员尝试在同一成员资格更改事件中加入,则只有在两个成员的通信协议版本都与组的通信协议版本兼容时,它们才能加入。具有与组不同的通信协议版本的成员必须单独加入。例如:
一个 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 集群和组复制协议.