# 18.5.1.4设置组的通信协议版本

从MySQL 8.0.16开始,组复制具有组通信协议的概念。可以显式管理组复制通信协议版本,并将其设置为适应您希望该组支持的最旧MySQL服务器版本。这使得组可以由不同MySQL服务器版本的成员组成,同时确保向后兼容性。

  • MySQL 5.7.14版本允许对消息进行压缩(请参阅第18.7.4节,“消息压缩”).

  • MySQL 8.0.16的版本还允许对消息进行分段(请参阅第18.7.5节,“消息碎片”).

  • MySQL 8.0.27的版本还允许组通信引擎在组处于单一主模式和组模式时,与单个共识领导者一起运行_复制_帕克斯_仅有一个的_leader设置为true(请参见第18.7.3节,“单一共识领袖”).

    组中的所有成员都必须使用相同的通信协议版本,这样组成员可以处于不同的MySQL服务器版本,但只能发送所有组成员都能理解的消息。

    版本X的MySQL服务器只能加入并访问在线 的如果复制组的通信协议版本小于或等于X,则为复制组中的状态。当新成员加入复制组时,它会检查该组现有成员宣布的通信协议版本。如果加入成员支持该版本,则加入该组并使用该组宣布的通信协议,即使该成员支持其他通信功能。如果加入成员不支持通信协议版本,则将其从组中驱逐。

    如果两个成员试图加入同一个成员身份更改事件,则只有当两个成员的通信协议版本已与组的通信协议版本兼容时,他们才能加入。组中具有不同通信协议版本的成员必须单独加入。例如:

  • 一个MySQL服务器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的组。

    您可以使用组\复制\获取\通信\协议()函数,返回该组支持的最早的MySQL服务器版本。组的所有现有成员返回相同的通信协议版本。例如:

SELECT group_replication_get_communication_protocol();
+------------------------------------------------+
| group_replication_get_communication_protocol() |
+------------------------------------------------+
| 8.0.16                                         |
+------------------------------------------------+

请注意组\复制\获取\通信\协议()函数返回组支持的最低MySQL版本,该版本可能与传递给组的版本号不同组\复制\设置\通信\协议()函数,以及安装在使用该函数的成员上的MySQL服务器版本。

如果需要更改组的通信协议版本,以便早期版本的成员可以加入,请使用组\复制\设置\通信\协议()函数指定要允许的最旧成员的MySQL服务器版本。如果可能的话,这会使该组退回到兼容的通信协议版本。这个组\复制\管理员使用此功能需要特权,并且当您发布声明时,所有现有的组成员必须在线,且不会失去多数。例如:

SELECT group_replication_set_communication_protocol("5.7.25");

如果将复制组的所有成员升级到新的MySQL服务器版本,该组的通信协议版本不会自动升级到匹配的版本。如果不再需要在早期版本中支持成员,可以使用组\复制\设置\通信\协议()函数将通信协议版本设置为您已将成员升级到的新MySQL服务器版本。例如:

SELECT group_replication_set_communication_protocol("8.0.16");

这个组\复制\设置\通信\协议()函数是作为一个组操作实现的,因此它同时在组的所有成员上执行。组操作开始缓冲消息,并等待已在进行的任何传出消息的传递完成,然后更改通信协议版本并发送缓冲消息。如果在更改通信协议版本后的任何时候,某个成员试图加入该组,则该组成员将宣布新的协议版本。

每当使用AdminAPI操作更改集群拓扑时,MySQL InnoDB cluster会自动、透明地管理其成员的通信协议版本。InnoDB群集始终使用当前属于群集或加入群集的所有实例支持的最新通信协议版本。有关详细信息,请参阅InnoDB群集和组复制协议 (opens new window).