20.7.7.4 退出操作
系统变量group_replication_exit_state_action
指定了Group Replication在成员意外离开组群时所采取的操作,包括自动重新加入或不尝试。请注意,在被驱逐成员的情况下,成员不知道自己已经被驱逐,直到它重新连接到组群,所以指定的操作仅在成员成功重新连接或成员自行怀疑自己并驱逐自己时才会执行。
按照影响顺序,退出操作如下:
-
如果退出操作是
READ_ONLY
,实例将切换到超级只读模式,将系统变量super_read_only
设置为ON
。当成员处于超级只读模式时,客户端不能执行任何更新,即使它们拥有CONNECTION_ADMIN
特权(或已弃用的SUPER
特权)。然而,客户端仍然可以读取数据,因为更新不再被执行,因此随着时间的推移,可能出现过时读取的可能性增加。因此,在设置此退出操作时,您需要积极监控服务器以避免故障。这是默认退出操作;在执行完毕后,成员的状态将显示为ERROR
在组群视图中。 -
如果exit action是
OFFLINE_MODE
,实例将切换到离线模式,设置系统变量offline_mode
为ON
。当成员处于离线模式时,已连接的客户端用户在下一个请求中将被断开连接,并且不再接受新的连接,除非是拥有CONNECTION_ADMIN
特权(或弃用的SUPER
特权)的客户端用户。Group Replication还将设置系统变量super_read_only
为ON
,因此,即使客户端用户拥有CONNECTION_ADMIN
或SUPER
特权,也不能进行任何更新操作。这exit action防止了更新和陈旧读取(除了客户端用户拥有指定的特权),并启用了代理工具,如MySQL Router,来识别服务器不可用,并将客户端连接重定向。同时,这也使得实例继续运行,以便管理员可以尝试解决问题而不需要关闭MySQL。在执行完exit action后,成员的状态将在组视图中显示为ERROR
(不是OFFLINE
,因为该成员当前不属于任何组)。 -
如果
ABORT_SERVER
是退出操作,实例将关闭 MySQL。 instructing 成员自己关机防止所有过期读取和客户端更新,但这意味着 MySQL 服务器实例不可用并且需要重新启动,即使问题可以在不需要这个步骤的情况下解决。在执行此退出操作后,成员将从组的视图中被删除。
请注意,无论设置的退出操作是什么,操作员干预都是必需的,因为已经耗尽自动重新连接尝试(或从未有过)的成员在被驱逐出组后不能重新加入,而需要重新启动 Group Replication。退出操作只影响客户端是否可以继续读取无法重新加入组的服务器上的数据,以及服务器是否保持运行。
如果在成员成功加入组之前出现故障,指定的退出动作group_replication_exit_state_action
将不会被执行。这是当本地配置检查失败或加入成员的配置与组的配置不匹配时的情况。在这些情况下,super_read_only
系统变量将保留其原始值,服务器不会关闭 MySQL。因此,我们建议在启动服务器时将super_read_only=ON
设置在配置文件中,这样Group Replication在成功启动后会将其更改为OFF
。这项保护措施尤其重要,当服务器被配置以在启动时启动Group Replication(group_replication_start_on_boot=ON
),但也对手动使用START GROUP_REPLICATION
语句启动Group Replication非常有用。
如果在成员成功加入组后出现故障,指定的退出动作将被执行。这是以下情况中的一个:
-
Applier错误 - 复制applier中存在错误。这项问题不可恢复。
-
分布式恢复不可能 - 发生了一些问题,使得 Group Replication 的分布式恢复过程(使用远程克隆操作和从二进制日志中传输状态)无法完成。Group Replication 会自动重试分布式恢复,但如果没有更多的选项可以完成该过程,则停止。有关详细信息,请见第20.5.4.4节,“分布式恢复故障容错”。
-
组配置更改错误 - 在使用函数进行组-wide 配置更改时发生了错误,详见第20.5.1节,“在线组配置”。
-
主选举错误 - 在单一主模式下对组进行新主成员选举时发生了错误,详见第20.1.3.1节,“单一主模式”。
-
不可达多数超时 - 成员已经与组成员大多数失去联系,因此处于少数状态,并且由
group_replication_unreachable_majority_timeout
系统变量设置的超时已经过期。 -
组员被逐出 - 对于该成员,已经出现了怀疑,并且
group_replication_member_expel_timeout
系统变量设置的超时期限已过期,该成员恢复与组的通信后发现自己已经被逐出。 -
自动重新加入尝试次数用尽 -
group_replication_autorejoin_tries
系统变量设置了在失去多数或逐出后自动重新加入的尝试次数,该成员完成了这些尝试但未成功。
以下表格总结了每种故障情况下的失败场景和动作:
表20.3 Group Replication故障情况中的退出动作
故障情况 |
使用 |
使用 |
---|---|---|
成员失败本地配置检查 加入成员和组配置之间的不匹配 |
MySQL继续运行 在启动时设置 |
MySQL 继续运行 在启动时设置 |
应用程序错误 分布式恢复不可能 组配置更改错误 主选举错误 不可达多数超时 成员从组中被驱逐 自动重新连接尝试次数用尽 |
或
或 MySQL 关闭 |
或
或 MySQL 关闭 |