Group Replication 根据 Group Replication 插件捆绑的 MySQL Server 版本进行版本控制。例如,如果一个成员正在运行 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 Server 版本的成员。根据 MySQL 版本之间所做的更改,您可能会在这种情况下遇到不兼容问题。例如,如果某个功能在主要版本之间已被弃用,那么将这些版本合并到一个组中可能会导致依赖已弃用功能的成员失败。反过来,
为了防止这些问题,Group Replication 包含兼容性策略,使您能够安全地将运行不同版本 MySQL 的成员组合在同一组中。成员应用这些策略来决定是正常加入组,还是以只读模式加入,或者不加入组,这取决于哪种选择导致加入成员和组中现有成员的安全操作。在升级场景中,每个服务器都必须离开组,进行升级,然后使用其新服务器版本重新加入组。此时,成员应用其新服务器版本的策略,这可能与它最初加入组时应用的策略不同。
START GROUP_REPLICATION
作为管理员,您可以通过适当配置服务器并发出语句
来指示任何服务器尝试加入任何组。加入或不加入群组,或以只读模式加入群组的决定,由加入成员在您尝试将其添加到群组后自行做出和实施。加入成员接收当前组成员的 MySQL Server 版本信息,评估自己与这些成员的兼容性,并应用自己 MySQL Server 版本中使用的策略(而不是现有成员使用的策略)来决定是否加入兼容的。
加入成员在尝试加入组时应用的兼容性策略如下:
如果成员运行的 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 Server 主版本是否较低。因此,对于任何成员都运行 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 服务器版本高于组中存在的最低版本,则成员将自动置于只读模式,而运行最低版本的成员将置于读写模式。