# 18.8.1 在一个组中组合不同的成员版本

18.8.1.1 升级期间的成员版本

18.8.1.2 组复制通信协议版本

Group Replication 根据捆绑 Group Replication 插件的 MySQL 服务器版本进行版本控制。例如,如果一个成员正在运行 MySQL 5.7.26,那么这就是 Group Replication 插件的版本。要在组成员问题上检查 MySQL 服务器的版本:

SELECT MEMBER_HOST,MEMBER_PORT,MEMBER_VERSION FROM performance_schema.replication_group_members;
+-------------+-------------+----------------+
| member_host | member_port | member_version |
+-------------+-------------+----------------+
| example.com |	   3306     |   8.0.13	     |
+-------------+-------------+----------------+

有关了解 MySQL 服务器版本和选择版本的指导,请参阅第 2.1.2 节,“要安装哪个 MySQL 版本和发行版”.

为了获得最佳兼容性和性能,组的所有成员都应运行相同版本的 MySQL 服务器,因此也应运行相同的组复制。但是,当您在升级在线组时,为了最大限度地提高可用性,您可能需要同时运行具有不同 MySQL 服务器版本的成员。根据 MySQL 版本之间所做的更改,您可能会在这种情况下遇到不兼容问题。例如,如果某个功能在主要版本之间已被弃用,那么将这些版本组合到一个组中可能会导致依赖已弃用功能的成员失败。相反,写入运行较新 MySQL 版本的成员,而组中有运行较旧 MySQL 版本的读写成员可能会导致缺少新版本中引入的功能的成员出现问题。

为了防止这些问题,组复制包括兼容性策略,使您能够安全地将运行不同版本 MySQL 的成员组合在同一组中。成员应用这些策略来决定是否正常加入组,或者以只读模式加入,或者不加入组,这取决于哪个选择导致加入成员和组的现有成员的安全操作。在升级方案中,每台服务器都必须离开组、升级并使用其新的服务器版本重新加入组。此时,成员为其新服务器版本应用策略,这可能与它最初加入组时应用的策略有所不同。

作为管理员,您可以指示任何服务器尝试加入任何组,方法是适当地配置服务器并发出开始 GROUP_REPLICATION陈述。加入或不加入组,或以只读模式加入组的决定是在您尝试将其添加到组后由加入成员自己做出和实施的。加入成员接收有关当前组成员的 MySQL 服务器版本的信息,评估自己与这些成员的兼容性,并应用在其自己的 MySQL 服务器版本中使用的策略 (不是现有成员使用的策略)来决定它是否兼容。

加入成员在尝试加入组时应用的兼容性策略如下:

  • 如果成员运行的 MySQL 服务器版本低于现有组成员运行的最低版本,则成员不会加入组。

  • 如果成员运行与现有组成员运行的最低版本相同的 MySQL 服务器版本,则成员正常加入组。

  • 如果成员运行的 MySQL 服务器版本高于现有组成员运行的最低版本,则成员加入组但保持只读模式。此行为仅在组以多主模式运行时有所不同,因为在以单主模式运行的组中,新添加的成员在任何情况下都默认为只读。

    运行 MySQL 8.0.17 或更高版本的成员在检查其兼容性时会考虑发布的补丁版本。运行 MySQL 8.0.16 或更低版本或 MySQL 5.7 的成员仅考虑主要版本。例如,如果您有一个成员都运行 MySQL 版本 8.0.13 的组:

  • 运行 MySQL 5.7 版的成员不会加入。

  • 运行 MySQL 8.0.16 的成员正常加入(因为它考虑了主要版本)。

  • 运行 MySQL 8.0.17 的成员加入但仍处于只读模式(因为它考虑了补丁版本)。

    请注意,加入运行 MySQL 5.7.27 之前版本的成员会检查所有组成员以查找他们自己的 MySQL 服务器主要版本是否较低。因此,对于任何成员都在运行 MySQL 8.0 版本的组,他们无法通过此检查,并且即使该组已经有其他成员在运行 MySQL 5.7,也无法加入该组。从 MySQL 5.7.27 开始,加入成员仅检查运行最低主要版本的组成员,因此他们可以加入存在其他 MySQL 5.7 服务器的混合版本组。

    在成员使用不同 MySQL Server 版本的多主模式组中,Group Replication 自动管理运行 MySQL 8.0.17 或更高版本的成员的读写和只读状态。如果成员离开组,运行现在最低版本的成员将自动设置为读写模式。当您将在单主模式下运行的组更改为在多主模式下运行时,使用group_replication_switch_to_multi_primary_mode()功能,组复制自动将成员设置为正确的模式。如果成员运行的 MySQL 服务器版本高于组中存在的最低版本,则成员将自动置于只读模式,而运行最低版本的成员将置于读写模式。