在单主模式下(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
或任何更高的一致性级别将在新选举的主服务器上保留新事务,直到应用积压为止。(在 MySQL 8.4 中,这是默认值。)
有关事务一致性的更多信息,请参阅第 20.5.3 节“事务一致性保证”。如果未对组使用流量控制和事务一致性保证,则最佳做法是在将客户端应用程序重新路由到新主服务器之前,等待新主服务器应用其与复制相关的中继日志。
自动主服务器成员选举过程涉及每个成员查看组的新视图,对潜在的新主服务器成员进行排序,然后选择最合适的成员。每个成员都根据其 MySQL Server 版本中的主服务器选举算法在本地做出自己的决定。因为所有成员都必须达成相同的决定,所以如果其他组成员运行的是较低版本的 MySQL Server,则成员会调整其主服务器选举算法,以便它们的行为与组中 MySQL Server 版本最低的成员的行为相同。
成员在选举主服务器时考虑的因素按顺序如下:
首先考虑的是哪个成员或哪些成员运行的 MySQL Server 版本最低。如果所有组成员都运行 MySQL 8.0.17 或更高版本,则首先按其版本的补丁版本对成员进行排序。(如果有任何成员运行的是 MySQL 8.0.16 或更早版本(不建议与运行 MySQL 8.4 的成员一起使用),则首先按其版本的主要版本对这些成员进行排序,并忽略补丁版本。)
如果有多个成员运行的 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 |
+-------------------------+-------------+