18.1.3.1 单主模式

在单主模式 ( 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() 函数将以多主模式运行的组更改为以单主模式运行,则会自动选举一个新的主,或者您可以通过指定它来指定新的主。

只有当所有组成员都运行 MySQL 8.0.13 或更高版本时才能使用这些功能。当自动选择或手动指定新的主服务器时,它会自动设置为读写,而其他组成员仍然是辅助服务器,因此是只读的。 图 18.4,“新初选” 显示了这个过程。

图 18.4 新初选

五个服务器实例 S1、S2、S3、S4 和 S5 部署为一个互连组。 服务器 S1 是主要服务器。 写入客户端与服务器 S1 通信,读取客户端与服务器 S4 通信。 然后服务器 S1 发生故障,中断与写入客户端的通信。 然后服务器 S2 接管成为新的主服务器,写客户端现在与服务器 S2 通信。

When a new primary is elected or appointed, it might have a backlog of changes that had been applied on the old primary but have not yet been applied on this server. 在这种情况下,在新的主数据库赶上旧的主数据库之前,读写事务可能会导致冲突并被回滚,而只读事务可能会导致过时的读取。Group Replication 的流量控制机制可以最大限度地减少快速和慢速成员之间的差异,如果它被激活并适当调整,可以减少这种情况发生的机会。有关流量控制的更多信息,请参阅 第 18.7.2 节,“流量控制”。从 MySQL 8.0.14 开始,您还可以使用 group_replication_consistency 系统变量来配置组的事务一致性级别以防止此问题。该设置 BEFORE_ON_PRIMARY_FAILOVER(或任何更高的一致性级别)在新选出的主节点上保留新事务,直到应用积压。有关事务一致性的更多信息,请参阅 第 18.5.3 节,“事务一致性保证”。如果一个组没有使用流量控制和事务一致性保证,那么在将客户端应用程序重新路由到它之前等待新的主应用程序应用其与复制相关的中继日志是一个很好的做法。

18.1.3.1.1 初选算法

自动主要成员选举过程涉及每个成员查看组的新视图,对潜在的新主要成员进行排序,并选择最合适的成员。每个成员根据其 MySQL 服务器版本中的主要选举算法在本地做出自己的决定。因为所有成员必须做出相同的决定,所以如果其他组成员正在运行较低的 MySQL 服务器版本,则成员会调整他们的主要选举算法,以便他们与组中具有最低 MySQL 服务器版本的成员具有相同的行为。

成员在选举初选时考虑的因素依次如下:

  1. 考虑的第一个因素是哪个或哪些成员正在运行最低的 MySQL 服务器版本。如果所有组成员都运行 MySQL 8.0.17 或更高版本,则成员首先按其发布的补丁版本排序。如果任何成员正在运行 MySQL Server 5.7 或 MySQL 8.0.16 或更低版本,则成员首先按其发布的主要版本排序,补丁版本将被忽略。

  2. 如果多个成员正在运行最低的 MySQL 服务器版本,则考虑的第二个因素是每个成员的成员权重,由成员的 group_replication_member_weight 系统变量指定。如果该组的任何成员正在运行 MySQL Server 5.7,而该系统变量不可用,则忽略该因素。

    系统变量指定 0-100 范围内的 group_replication_member_weight 数字。所有成员的默认权重均为 50,因此将权重设置为低于此值以降低其排序,将权重设置为高于此值以增加其排序。您可以使用此加权函数来优先使用更好的硬件,或确保在主要的计划维护期间故障转移到特定成员。

  3. 如果不止一个成员正在运行最低的 MySQL 服务器版本,并且其中不止一个成员具有最高成员权重(或忽略成员权重),则考虑的第三个因素是每个成员生成的服务器 UUID 的字典顺序,由 server_uuid系统变量指定。具有最低服务器 UUID 的成员被选为主要成员。该因素充当有保证和可预测的决胜局,以便所有小组成员在无法由任何重要因素决定的情况下做出相同的决定。

18.1.3.1.2 寻找主

要找出在单主模式下部署时哪个服务器当前是主服务器,请使用 表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   |
+-------------------------+-------------+
警告

status 变量已被弃用,group_replication_primary_member 并计划在未来的版本中删除。

或者使用 group_replication_primary_member 状态变量。

mysql> SHOW STATUS LIKE 'group_replication_primary_member'