从 MySQL 8.0.16 开始,Group Replication 有了组通信协议的概念。组复制通信协议版本可以明确管理,并设置为适应您希望组支持的最旧的 MySQL 服务器版本。这使得组可以由不同 MySQL 服务器版本的成员组成,同时确保向后兼容性。
MySQL 5.7.14 的版本允许压缩消息(请参阅 第 18.7.4 节,“消息压缩”)。
MySQL 8.0.16 的版本还允许对消息进行分段(请参阅 第 18.7.5 节,“消息分段” )。
MySQL 8.0.27 的版本还允许组通信引擎在组处于单主模式并
group_replication_paxos_single_leader
设置为 true 时与单个共识领导者一起运行(请参阅 第 18.7.3 节,“单一共识领导者” )。
组内的所有成员必须使用相同的通信协议版本,这样组内成员可以在不同的MySQL Server版本上发送所有组内成员都能理解的消息。
ONLINE
如果组的通信协议版本小于或等于 X
,版本 X 的 MySQL 服务器只能加入并达到
复制组的状态。当新成员加入复制组时,它会检查由复制组宣布的通信协议版本集团的现有成员。如果加入的成员支持该版本,则它加入该组并使用该组已公布的通信协议,即使该成员支持额外的通信能力。如果加入的成员不支持通信协议版本,则将其开除出群。
如果两个成员试图加入同一个成员变更事件,则只有当两个成员的通信协议版本已经与组的通信协议版本兼容时,他们才能加入。来自群组的不同通信协议版本的成员必须隔离加入。例如:
一个 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 服务器版本,则该组的通信协议版本不会自动升级以匹配。如果您不再需要支持早期版本的成员,您可以使用该
group_replication_set_communication_protocol()
功能将通信协议版本设置为您将成员升级到的新 MySQL Server 版本。例如:
SELECT group_replication_set_communication_protocol("8.0.16");
该
group_replication_set_communication_protocol()
函数作为一个组动作实现,因此它在组的所有成员上同时执行。组操作开始缓冲消息并等待已经在进行中的任何传出消息的传递完成,然后更改通信协议版本并发送缓冲的消息。如果成员在您更改通信协议版本后随时尝试加入群组,群组成员将宣布新的协议版本。
每当使用 AdminAPI 操作更改集群拓扑时,MySQL InnoDB 集群会自动透明地管理其成员的通信协议版本。InnoDB 集群始终使用当前属于集群或加入集群的所有实例支持的最新通信协议版本。有关详细信息,请参阅 InnoDB Cluster 和 Group Replication Protocol。