单主模式
在单主模式 ( 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()函数将在多主模式下运行的组更改为在单主模式下运行,则会自动选举一个新的主节点,或者您可以通过使用该函数指定新的主节点来指定它。
仅当所有组成员都运行 MySQL 8.0.13 或更高版本时才能使用这些功能。当自动选举或手动指定新的主服务器时,它会自动设置为读写,而其他组成员仍为辅助服务器,因此为只读。 图 20.4,“新的初选” 显示了这个过程。
图 20.4 新的初选

五个服务器实例 S1、S2、S3、S4 和 S5 部署为互连组。 服务器 S1 是主服务器。 写入客户端正在与服务器 S1 通信,读取客户端正在与服务器 S4 通信。 服务器 S1 然后出现故障,中断与写入客户端的通信。 然后,服务器 S2 接管作为新的主服务器,写入客户端现在与服务器 S2 进行通信。
当选举或指定新的主服务器时,它可能会积压已应用于旧主服务器但尚未应用于此服务器的更改。在这种情况下,在新的主数据库赶上旧的主数据库之前,读写事务可能会导致冲突并回滚,而只读事务可能会导致过时的读取。组复制的流量控制机制可以最大限度地减少快速成员和慢速成员之间的差异,如果激活并正确调整,则可以减少发生这种情况的机会。有关流量控制的更多信息,请参见 第 20.7.2 节“流量控制”。从 MySQL 8.0.14 开始,您还可以使用 group_replication_consistency 系统变量来配置组的事务一致性级别来防止此问题。该设置 BEFORE_ON_PRIMARY_FAILOVER(或任何更高的一致性级别)在新选择的主数据库上保留新事务,直到应用积压。有关事务一致性的更多信息,请参阅 第 20.5.3 节“事务一致性保证”。如果组未使用流量控制和事务一致性保证,则最好等待新主数据库应用其与复制相关的中继日志,然后再将客户端应用程序重新路由到该主数据库。
20.1.3.1.1 初选算法
自动主要成员选举过程涉及每个成员查看组的新视图,对潜在的新主要成员进行排序,并选择最合适的成员。每个成员按照其 MySQL Server 版本中的初选算法在本地做出自己的决定。由于所有成员必须做出相同的决定,因此如果其他组成员运行较低的 MySQL Server 版本,则成员会调整其主要选举算法,以便它们与组中具有最低 MySQL Server 版本的成员具有相同的行为。
成员在选举初选时考虑的因素依次如下:
-
第一个考虑的因素是哪个或哪些成员正在运行最低的 MySQL 服务器版本。如果所有组成员都运行 MySQL 8.0.17 或更高版本,则成员首先按其发布的补丁版本排序。如果任何成员运行 MySQL Server 5.7 或 MySQL 8.0.16 或更低版本,则成员首先按其发布的主要版本排序,并忽略补丁版本。
-
如果多个成员运行最低的 MySQL Server 版本,则考虑的第二个因素是每个成员的成员权重,由
group_replication_member_weight成员上的系统变量指定。如果该组的任何成员正在运行 MySQL Server 5.7,而该系统变量不可用,则该因素将被忽略。系统
group_replication_member_weight变量指定 0-100 范围内的数字。所有成员的权重默认为 50,因此设置低于此权重可降低其排序,设置高于此权重可提高其排序。您可以使用此权重函数来确定使用更好硬件的优先级,或确保在主节点的计划维护期间故障转移到特定成员。 -
如果多个成员运行最低的 MySQL Server 版本,并且其中多个成员具有最高的成员权重(或忽略成员权重),则考虑的第三个因素是每个成员生成的服务器 UUID 的字典顺序,由系统变量指定
server_uuid。具有最低服务器 UUID 的成员被选为主要成员。该因素充当有保证且可预测的决胜局,以便在无法由任何重要因素决定的情况下,所有小组成员都会做出相同的决定。
20.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 |
+-------------------------+-------------+
警告
状态group_replication_primary_member 变量已被弃用,并计划在未来版本中删除。
或者使用 group_replication_primary_member 状态变量。
mysql> SHOW STATUS LIKE 'group_replication_primary_member'




