从 MySQL 8.0.16 开始,组复制具有组通信协议的概念。组复制通信协议版本可以被明确管理,并设置为支持最旧的 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 服务器版本上,但只能发送所有组成员都能理解的消息。
MySQL 服务器版本 X 只能加入并在复制组中达到 ONLINE
状态,如果组的通信协议版本小于或等于 X。当新成员加入复制组时,它检查组中现有成员宣布的通信协议版本。如果加入的成员支持该版本,它将加入组并使用组宣布的通信协议,即使成员支持其他通信能力。如果加入的成员不支持通信协议版本,它将被从组中驱逐。
如果两个成员尝试在同一个成员变更事件中加入,它们只能加入,如果通信协议版本对于两个成员都是组的通信协议版本兼容的。具有不同通信协议版本的成员必须单独加入组。
-
例如:一个 MySQL Server 8.0.16 实例可以成功加入使用通信协议版本 5.7.24 的组。
-
一个 MySQL Server 5.7.24 实例不能成功加入使用通信协议版本 8.0.16 的组。
-
两个 MySQL Server 8.0.16 实例不能同时加入使用通信协议版本 5.7.24 的组。
-
两个 MySQL Server 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 Server 版本,组的通信协议版本不会自动升级以匹配。如果您不再需要支持早期版本的成员,可以使用 group_replication_set_communication_protocol()
函数将通信协议版本设置为您升级的 MySQL Server 版本。例如:
SELECT group_replication_set_communication_protocol("8.0.16");
group_replication_set_communication_protocol()
函数作为组操作实现,因此它将在组的所有成员上同时执行。组操作将开始缓冲消息,并等待已经在进行中的任何传出消息完成,然后更改通信协议版本并发送缓冲的消息。如果成员尝试在更改通信协议版本后加入组,组成员将宣布新的协议版本。
MySQL InnoDB 集群自动且透明地管理其成员的通信协议版本,每当使用 AdminAPI 操作更改集群拓扑结构时。InnoDB 集群总是使用当前集群或加入集群的所有实例支持的最新通信协议版本。有关详细信息,请参阅 InnoDB 集群和组复制协议。