MySQL 8.0.12 和 MySQL 5.7.24 中提供的
group_replication_exit_state_action
系统变量指定当成员由于错误或问题无意中离开组时组复制执行的操作,并且无法自动重新加入或不尝试。请注意,在被开除的成员的情况下,该成员在重新连接到群组之前并不知道自己被开除,因此只有在该成员设法重新连接,或者该成员对自己产生怀疑并且驱逐自己。
按影响顺序,退出操作如下:
如果是退出动作,实例通过将系统变量设置为 将 MySQL 切换到
READ_ONLY
超级只读模式 。当成员处于超级只读模式时,客户端不能进行任何更新,即使他们有 权限(或弃用super_read_only
ON
CONNECTION_ADMIN
SUPER
特权)。但是,客户端仍然可以读取数据,并且由于不再进行更新,因此读取过时数据的可能性会随着时间的推移而增加。使用此设置,您因此需要主动监视服务器的故障。此退出操作是 MySQL 8.0.15 的默认操作。执行该退出操作后,成员状态显示ERROR
在群组视图中。如果
OFFLINE_MODE
是退出操作,实例通过将系统变量设置为 将 MySQL 切换到离线offline_mode
模式ON
。当成员处于离线模式时,连接的客户端用户在他们的下一个请求时断开连接并且不再接受连接,具有CONNECTION_ADMIN
特权(或已弃用SUPER
特权)的客户端用户除外。Group Replication 还将系统变量设置super_read_only
为ON
,因此客户端无法进行任何更新,即使它们已经连接到CONNECTION_ADMIN
orSUPER
特权。此退出操作可防止更新和过时读取(具有规定权限的客户端用户读取除外),并使 MySQL Router 等代理工具能够识别服务器不可用并重定向客户端连接。它还使实例保持运行状态,以便管理员可以在不关闭 MySQL 的情况下尝试解决问题。此退出操作可从 MySQL 8.0.18 获得。执行此退出操作后,成员的状态将显示为ERROR
组视图中的状态(不是OFFLINE
,这意味着成员具有可用的组复制功能但当前不属于组)。如果
ABORT_SERVER
是退出操作,实例将关闭 MySQL。指示成员自行关闭可防止所有过时读取和客户端更新,但这意味着 MySQL 服务器实例不可用并且必须重新启动,即使没有该步骤问题本可以解决。当系统变量被添加到 MySQL 8.0.15 时,此退出操作是 MySQL 8.0.12 的默认设置。执行此退出操作后,该成员将从组视图中的服务器列表中删除。
请记住,无论设置什么退出操作,都需要操作员干预,因为已经用尽其自动重新加入尝试(或从未尝试过)并且已被驱逐出组的前成员在不重新启动组的情况下不允许重新加入复制。退出操作只影响客户端是否仍然可以读取无法重新加入组的服务器上的数据,以及服务器是否保持运行。
如果在成员成功加入组之前发生失败,
则不执行指定的退出操作。如果在本地配置检查期间出现故障,或者加入成员的配置与组的配置不匹配,就会出现这种情况。在这些情况下,
系统变量保留其原始值,服务器不会关闭 MySQL。为了保证在Group Replication没有启动的情况下,服务器无法接受更新,因此我们建议
在启动时在服务器的配置文件中设置,Group Replication改为group_replication_exit_state_action
super_read_only
super_read_only=ON
OFF
成功启动后在主要成员上。当服务器配置为在服务器启动时启动 Group Replication ( ) 时,此保护措施尤为重要,但在使用命令
group_replication_start_on_boot=ON
手动启动 Group Replication 时也很有用。START
GROUP_REPLICATION
如果成员成功加入组后发生失败,则执行指定的退出操作。在以下情况下会出现这种情况:
Applier error - 复制应用程序中存在错误。此问题不可恢复。
分布式恢复不可能- 存在一个问题,意味着组复制的分布式恢复过程(使用远程克隆操作和二进制日志的状态传输)无法完成。Group Replication 会在有意义的地方自动重试分布式恢复,但如果没有更多选项可以完成该过程,则会停止。有关详细信息,请参阅 第 18.5.4.4 节,“分布式恢复的容错”。
Group configuration change error - 如第 18.5.1 节“配置在线组”中所述,在使用函数执行组范围内的配置更改期间发生错误 。
Primary election error - 在单主模式下为组选择新的主成员期间发生错误,如 第 18.1.3.1 节“单主模式”中所述。
无法到达的多数超时- 成员已与大多数组成员失去联系,因此处于少数状态,并且
group_replication_unreachable_majority_timeout
系统变量设置的超时已过期。成员被群开除- 对该成员提出了怀疑,
group_replication_member_expel_timeout
系统变量设置的任何超时都已过期,该成员恢复了与群的通信,发现它已被开除。超出自动重新加入尝试次数-
group_replication_autorejoin_tries
系统变量被设置为指定在失去多数票或被驱逐后自动重新加入尝试的次数,并且成员完成了此次数的尝试但没有成功。
下表总结了每种情况下的失败场景和操作:
表 18.3 组复制失败情况下的退出操作
故障情况 |
组复制开始于 |
组复制开始于
|
---|---|---|
成员未通过本地配置检查 加入成员和组配置不匹配 |
MySQL 继续运行
在启动时设置 |
MySQL 继续运行
在启动时设置 |
成员上的应用程序错误 分布式恢复不可能 组配置更改错误 初选错误 无法到达的多数超时 成员被开除出群 超出自动重新加入尝试 |
或者
或者 MySQL 关闭 |
或者
或者 MySQL 关闭 |