20.5.1.4 设置组的通信协议版本
MySQL 8.4中的Group Replication使用了一个可以被显式管理的组通信协议版本概念,可以将其设置为支持最老的 MySQL Server 版本,以便在不同 MySQL Server 版本的成员之间形成组,同时确保向后兼容性。
-
MySQL 5.7.14 及更高版本允许消息压缩(见第20.7.4节,“Message Compression”)。
-
MySQL 8.0.16 及更高版本也允许消息分片(见第20.7.5节,“Message Fragmentation”)。
-
MySQL 8.0.27 及更高版本还允许组通信引擎在单主模式下使用单个共识领导人,当
group_replication_paxos_single_leader
设置为true时(见第20.7.3节,“Single Consensus Leader”)。
组中的所有成员都必须使用相同的通信协议版本,以便组成员可以在不同 MySQL Server 版本下运行,但只发送可以被所有组成员理解的消息。
MySQL 服务器版本 X 只能在复制组中加入并达到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 集群和组复制协议。