在单主模式下(group_replication_single_primary_mode=ON
),组中只有一个主服务器处于读写模式。组中的所有其他成员都设置为只读模式(使用super_read_only=ON
)。主服务器通常是第一个引导组的服务器。所有其他加入组的服务器都会学习主服务器并自动设置为只读模式。
在单主模式下,Group Replication 强制只有一个服务器写入组,因此与多主模式相比,一致性检查可以不那么严格,DDL 语句不需要特殊处理。选项 group_replication_enforce_update_everywhere_checks
启用或禁用组的一致性检查。当部署单主模式或将组更改为单主模式时,该系统变量必须设置为 OFF
。
指定为主服务器的成员可以通过以下方式更改:
-
如果现有的主服务器离开组,无论是自愿还是意外,新的主服务器将自动被选举。
-
您可以使用
group_replication_set_as_primary()
函数指定新的主服务器。 -
如果您使用
group_replication_switch_to_single_primary_mode()
函数将组从多主模式更改为单主模式,新的主服务器将自动被选举,或者您可以通过指定它与函数一起使用来指定新的主服务器。
当新的主服务器被选举或指定时,它将自动设置为读写模式,而其他组成员将保持为只读模式。图 20.4,「新主服务器选举」 显示了这个过程。
当新的主服务器被选举或指定时,它可能具有旧主服务器上应用的更改的积压,但这些更改尚未应用于该服务器。在这种情况下,直到新的主服务器赶上旧主服务器之前,读写事务可能会导致冲突并回滚,读取事务可能会导致过时的读取。Group Replication 的流控制机制,减少了快速和慢速成员之间的差异,如果启用并正确调整,可以减少这种情况的发生。有关流控制的更多信息,请参见 第 20.7.2 节,「流控制」。您也可以使用 group_replication_consistency
系统变量来配置组的事务一致性级别,以防止这种问题。设置 BEFORE_ON_PRIMARY_FAILOVER
(或更高的一致性级别)将在新的主服务器上持有新的事务,直到积压被应用。有关事务一致性保证的更多信息,请参见 第 20.5.3 节,「事务一致性保证」。如果不使用流控制和事务一致性保证,对组来说是一个良好的做法,在将客户端应用程序重新路由到新的主服务器之前,等待新的主服务器应用其复制相关的中继日志。
自动主服务器选举过程涉及每个成员查看组的新视图,排序潜在的新主服务器成员,并选择最适合的成员。每个成员在本地做出自己的决定,遵循 MySQL Server 版本的主服务器选举算法。因为所有成员必须达成相同的决定,因此成员会根据组中最低的 MySQL Server 版本来调整其主服务器选举算法,以便与其他成员保持一致。
成员在选举主服务器时考虑的因素,按顺序是:
-
首先考虑的因素是哪些成员或成员正在运行最低版本的 MySQL 服务器。如果所有组成员都运行 MySQL 8.0.17 或更高版本,成员首先根据其发行版的补丁版本排序。(如果任何成员运行 MySQL 8.0.16 或更低版本 - 不推荐与运行 MySQL 8.3 的成员一起使用 - 这些成员首先根据其发行版的主要版本排序,并忽略补丁版本。)
-
如果多个成员正在运行最低版本的 MySQL 服务器,第二个考虑的因素是每个成员的成员权重,如
group_replication_member_weight
系统变量在成员上指定。group_replication_member_weight
系统变量指定了 0-100 之间的数字。所有成员默认权重为 50,因此设置低于此值以降低排序,设置高于此值以增加排序。您可以使用此加权函数来优先使用更好的硬件或确保在计划维护主服务器期间 failover 到特定成员。 -
如果多个成员正在运行最低版本的 MySQL 服务器,并且多个成员具有最高的成员权重(或成员权重被忽略),第三个考虑的因素是每个成员生成的服务器 UUID 的字典顺序,如
server_uuid
系统变量指定。具有最低服务器 UUID 的成员被选为主服务器。这个因素作为一个保证和可预测的tie-breaker,以便所有组成员在无法根据任何重要因素确定时达到相同的决定。
要确定在单一主模式下当前是哪个服务器作为主服务器,请使用 MEMBER_ROLE
列在 performance_schema.replication_group_members
表中。例如:
mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------------------+-------------+
| remote1.example.com | PRIMARY |
| remote2.example.com | SECONDARY |
| remote3.example.com | SECONDARY |
+-------------------------+-------------+