文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9MB
PDF (A4) - 40.0MB
手册页 (TGZ) - 258.5KB
手册页 (Zip) - 365.5KB
信息 (Gzip) - 4.0MB
信息 (Zip) - 4.0MB


20.1.3.1 单主模式

在单主模式下(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.4 新主服务器选举

Five server instances, S1, S2, S3, S4, and S5, are deployed as an interconnected group. Server S1 is the primary. Write clients are communicating with server S1, and a read client is communicating with server S4. Server S1 then fails, breaking communication with the write clients. Server S2 then takes over as the new primary, and the write clients now communicate with server S2.

当选举或指定新的主服务器时,它可能积压了已应用于旧主服务器但尚未应用于此服务器的更改。在这种情况下,在新主服务器赶上旧主服务器之前,读写事务可能会导致冲突并回滚,而只读事务可能会导致读取过时的数据。组复制的流量控制机制(可最大程度地减少快成员和慢成员之间的差异)可以减少这种情况发生的可能性(如果已激活并正确调整)。有关流量控制的更多信息,请参阅第 20.7.2 节“流量控制”。还可以使用 group_replication_consistency 系统变量来配置组的事务一致性级别以防止此问题。将其设置为 BEFORE_ON_PRIMARY_FAILOVER 或任何更高的一致性级别将在新选举的主服务器上保留新事务,直到应用积压为止。(在 MySQL 8.4 中,这是默认值。)

有关事务一致性的更多信息,请参阅第 20.5.3 节“事务一致性保证”。如果未对组使用流量控制和事务一致性保证,则最佳做法是在将客户端应用程序重新路由到新主服务器之前,等待新主服务器应用其与复制相关的中继日志。

20.1.3.1.1 主服务器选举算法

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

成员在选举主服务器时考虑的因素按顺序如下:

  1. 首先考虑的是哪个成员或哪些成员运行的 MySQL Server 版本最低。如果所有组成员都运行 MySQL 8.0.17 或更高版本,则首先按其版本的补丁版本对成员进行排序。(如果有任何成员运行的是 MySQL 8.0.16 或更早版本(不建议与运行 MySQL 8.4 的成员一起使用),则首先按其版本的主要版本对这些成员进行排序,并忽略补丁版本。)

  2. 如果有多个成员运行的 MySQL Server 版本最低,则考虑的第二个因素是每个成员的成员权重,如成员上 group_replication_member_weight 系统变量所指定。

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

  3. 如果多个成员运行的是最低版本的 MySQL 服务器,并且其中多个成员具有最高的成员权重(或者成员权重被忽略),则考虑的第三个因素是每个成员生成的服务器 UUID 的字典顺序,如 server_uuid 系统变量所指定。具有最低服务器 UUID 的成员被选为主服务器。此因素充当了有保证且可预测的决胜因素,以便在无法通过任何重要因素确定时,所有组成员都能做出相同的决定。

20.1.3.1.2 查找主服务器

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