在单主模式 (group_replication_single_primary_mode=ON
) 中,组只有一个主服务器,该服务器设置为读写模式。组中的所有其他成员都设置为只读模式(使用 super_read_only=ON
)。主服务器通常是第一个引导组的服务器。加入组的所有其他服务器都会了解主服务器,并自动设置为只读模式。
在单主模式下,组复制强制执行只有一个服务器写入组,因此与多主模式相比,一致性检查可以不那么严格,DDL 语句不需要进行任何额外的处理。选项 group_replication_enforce_update_everywhere_checks
启用或禁用对组的严格一致性检查。在单主模式下部署或将组更改为单主模式时,此系统变量必须设置为 OFF
。
指定为主服务器的成员可以通过以下方式更改
如果现有主服务器离开组,无论是自愿还是意外,都会自动选举一个新的主服务器。
可以使用
group_replication_set_as_primary()
函数指定特定成员作为新的主服务器。如果使用
group_replication_switch_to_single_primary_mode()
函数将运行在多主模式下的组更改为运行在单主模式下,则会自动选举一个新的主服务器,或者可以使用该函数指定新的主服务器。
当新主服务器被自动选举或手动指定时,它会自动设置为读写模式,而其他组成员将保持为从服务器,并且因此是只读模式。 图 20.4,“新主服务器选举” 显示了此过程。
当新主服务器被选举或指定时,它可能存在在旧主服务器上已应用但尚未在此服务器上应用的更改的积压。在这种情况下,直到新主服务器赶上旧主服务器,读写事务可能会导致冲突并被回滚,而只读事务可能会导致陈旧读取。组复制的流量控制机制可以最大程度地减少快速成员和慢速成员之间的差异,如果它被激活并正确调整,则可以减少这种情况发生的可能性。有关流量控制的更多信息,请参见 第 20.7.2 节,“流量控制”。还可以使用 group_replication_consistency
系统变量配置组的事务一致性级别,以防止此问题。将其设置为 BEFORE_ON_PRIMARY_FAILOVER
或任何更高的一致性级别会在新当选的主服务器上保留新的事务,直到积压已应用。(这是默认值。)
有关事务一致性的更多信息,请参见 第 20.5.3 节,“事务一致性保证”。如果组未使用流量控制和事务一致性保证,则最佳做法是在将客户端应用程序重新路由到新主服务器之前等待它应用其与复制相关的中继日志。
自动主服务器成员选举过程包括每个成员查看组的新视图、对潜在的新主服务器成员进行排序,并选择最合适的成员。每个成员在本地做出自己的决定,遵循其 MySQL Server 版本中的主服务器选举算法。由于所有成员都必须达成一致,因此成员会调整其主服务器选举算法,如果其他组成员运行的是较低版本的 MySQL Server,则它们的行为与组中 MySQL Server 版本最低的成员相同。
成员在选举主服务器时考虑的因素(按顺序)如下
第一个考虑的因素是哪个成员或哪些成员运行的是最低版本的 MySQL Server。如果所有组成员都运行的是 MySQL 8.0.17 或更高版本,则成员首先按其版本的修订版排序。(如果任何成员运行的是 MySQL 8.0.16 或更早版本,不建议与运行 MySQL 9.0 的成员一起使用,则这些成员首先按其版本的 主要版本排序,而修订版将被忽略。)
如果多个成员运行的是最低版本的 MySQL Server,则第二个考虑的因素是这些成员的成员权重,如成员上的
group_replication_member_weight
系统变量所指定。group_replication_member_weight
系统变量指定 0-100 范围内的数字。所有成员默认权重为 50,因此将权重设置为低于此值以降低其排序,将权重设置为高于此值以提高其排序。可以使用此加权功能来优先使用更好的硬件,或确保在对主服务器进行计划维护期间故障转移到特定成员。如果多个成员运行的是最低版本的 MySQL 服务器,并且这些成员中有多个成员具有最高成员权重(或者成员权重被忽略),则考虑的第三个因素是每个成员生成的服务器 UUID 的词法顺序,如
server_uuid
系统变量所指定。具有最低服务器 UUID 的成员被选为主服务器。此因素充当一个保证的、可预测的平局决胜符,以便所有组成员在无法通过任何重要因素确定时,都能得出相同的决定。
要查找在单主模式下部署时哪个服务器当前为主服务器,请使用 performance_schema.replication_group_members
表中的 MEMBER_ROLE
列。例如
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 |
+-------------------------+-------------+