18.1.3.2 多主模式

在多主模式 ( group_replication_single_primary_mode=OFF) 中,没有成员具有特殊角色。任何与其他组成员兼容的成员在加入组时都被设置为读写模式,并且可以处理写入事务,即使它们是并发发出的。

如果一个成员停止接受写入事务,例如,在服务器意外退出的情况下,连接到它的客户端可以被重定向或故障转移到处于读写模式的任何其他成员。Group Replication 本身不处理客户端故障转移,因此您需要使用中间件框架(例如MySQL Router 8.0)、代理、连接器或应用程序本身来安排它。 图 18.5,“客户端故障转移”显示了如果成员离开组,客户端如何重新连接到替代组成员。

图 18.5 客户端故障转移

五个服务器实例 S1、S2、S3、S4 和 S5 部署为一个互连组。 所有服务器都是主服务器。 写入客户端与服务器 S1 和 S2 通信,读取客户端与服务器 S4 通信。 然后服务器 S1 发生故障,中断与其写入客户端的通信。 此客户端重新连接到服务器 S3。

Group Replication 是一个最终一致性系统。这意味着一旦传入流量减慢或停止,所有组成员都具有相同的数据内容。当流量在流动时,事务可以先于其他成员在其他成员上外部化,特别是如果某些成员的写入吞吐量低于其他成员,则可能会产生过时的读取。在多主模式下,速度较慢的成员还可能积累过多的交易积压以进行认证和申请,从而导致更大的冲突和认证失败风险。为了限制这些问题,您可以激活和调整 Group Replication 的流量控制机制,以最小化快速和慢速成员之间的差异。有关流量控制的更多信息,请参见第 18.7.2 节,“流量控制”

从 MySQL 8.0.14 开始,如果你想为组中的每个事务提供事务一致性保证,你可以使用 group_replication_consistency 系统变量来实现。您可以选择适合您组的工作负载和数据读写优先级的设置,同时考虑提高一致性所需的同步对性能的影响。您还可以为各个会话设置系统变量,以保护对并发性特别敏感的事务。有关事务一致性的更多信息,请参阅 第 18.5.3 节,“事务一致性保证”

18.1.3.2.1 交易检查

当以多主模式部署组时,将检查事务以确保它们与该模式兼容。多主模式部署Group Replication时会做如下严格的一致性检查:

  • 如果一个事务在 SERIALIZABLE 隔离级别下执行,那么它的提交在与组同步时会失败。

  • 如果事务针对具有带级联约束的外键的表执行,则在将自身与组同步时其提交失败。

检查由 group_replication_enforce_update_everywhere_checks 系统变量控制。在多主模式下,系统变量通常应设置为ON,但可以选择通过将系统变量设置为 来停用检查OFF。在单主模式下部署时,系统变量必须设置为 OFF.

18.1.3.2.2 数据定义语句

在多主模式下的Group Replication拓扑中,执行数据定义语句时需要注意,也通常称为数据定义语言(DDL)。

MySQL 8.0 引入了对原子数据定义语言 (DDL) 语句的支持,其中完整的 DDL 语句作为单个原子事务提交或回滚。但是,DDL 语句,无论是原子语句还是其他语句,都会隐式结束当前会话中处于活动状态的任何事务,就好像您 COMMIT在执行该语句之前已经完成了操作一样。这意味着 DDL 语句不能在另一个事务中执行,不能在事务控制语句(例如 )中执行,也不能 START TRANSACTION ... COMMIT与同一事务中的其他语句结合使用。

Group Replication 基于乐观复制范例,其中语句被乐观地执行并在必要时回滚。每个服务器在没有首先保护组协议的情况下执行。因此,在多主模式下复制DDL语句时需要多加注意。如果您对同一对象进行模式更改(使用 DDL)和对象包含的数据(使用 DML),则需要在模式操作尚未完成并在各处复制时通过同一服务器处理更改。如果不这样做,可能会在操作中断或仅部分完成时导致数据不一致。

有关 MySQL 8.0 中原子 DDL 支持的详细信息,以及复制某些语句的行为发生的变化,请参阅第 13.1.1 节,“原子数据定义语句支持”

18.1.3.2.3 版本兼容性

为了获得最佳的兼容性和性能,一个组的所有成员都应该运行相同版本的 MySQL 服务器,因此也应该运行相同版本的组复制。在多主模式下,这更为重要,因为所有成员通常都会以读写模式加入组。如果一个组包括运行多个 MySQL 服务器版本的成员,则某些成员可能与其他成员不兼容,因为他们支持其他人不支持的功能,或者缺少其他人拥有的功能。为了防止这种情况,当新成员加入时(包括已升级和重新启动的前成员),该成员对组的其余成员执行兼容性检查。

这些兼容性检查的一个结果在多主模式下尤为重要。如果加入成员运行的 MySQL 服务器版本高于现有组成员运行的最低版本,则它加入组但保持只读模式。(在以单主模式运行的组中,新添加的成员在任何情况下都默认为只读。)运行 MySQL 8.0.17 或更高版本的成员在检查其兼容性时会考虑发布的补丁版本。运行 MySQL 8.0.16 或更低版本,或 MySQL 5.7 的成员,只考虑主要版本。

在以多主模式运行且成员使用不同 MySQL Server 版本的组中,Group Replication 自动管理运行 MySQL 8.0.17 或更高版本的成员的读写和只读状态。如果成员离开组,则运行当前最低版本的成员将自动设置为读写模式。当您将以单主模式运行的组更改为以多主模式运行时,使用 group_replication_switch_to_multi_primary_mode() 功能,Group Replication 自动将成员设置为正确的模式。如果成员运行的 MySQL 服务器版本高于组中存在的最低版本,则成员将自动置于只读模式,而运行最低版本的成员将置于读写模式。

有关组中版本兼容性以及升级过程中这如何影响组行为的完整信息,请参阅 第 18.8.1 节,“在一个组中组合不同的成员版本”