# 18.7.7 对故障检测和网络分区的响应

18.7.7.1 驱逐超时

18.7.7.2 不可达多数超时

18.7.7.3 自动重新加入

18.7.7.4 退出动作

Group Replication 的故障检测机制旨在识别不再与该组通信的组成员,并在他们可能出现故障时将其驱逐。拥有故障检测机制增加了该组包含大多数正常工作的成员的机会,并且因此来自客户端的请求得到正确处理。

通常,所有组成员都会定期与所有其他组成员交换消息。如果一个群组成员在 5 秒内没有收到来自某个特定同伴的任何消息,则当此检测期结束时,它会产生对该同伴的怀疑。当怀疑超时时,被怀疑的成员被认为是失败的,并被驱逐出组。被驱逐的成员被从其他成员看到的成员列表中删除,但它不知道自己已被驱逐出组,因此它认为自己在线,其他成员无法访问。如果该成员实际上没有失败(例如,因为临时网络问题而断开连接)并且能够恢复与其他成员的通信,它会收到一个包含它已被驱逐出的信息的视图

团体。可以在过程中的多个点配置组成员(包括失败的成员本身)对这些情况的响应。

  1. 默认情况下,如果成员被怀疑失败,则会发生以下行为:直到 MySQL 8.0.20,当产生怀疑时,它会立即超时。一旦该团体确定了过期的嫌疑人,嫌疑人就有责任将其开除。该成员可能会在超时后再存活几秒钟,因为定期执行过期怀疑​​检查。

  2. 从 MySQL 8.0.21 开始,在怀疑超时之前增加了 5 秒的等待时间,被怀疑的成员有责任开除。如果被驱逐的成员恢复通信并意识到它已被驱逐,直到 MySQL 8.0.20,它不会尝试重新加入该组。

  3. 从 MySQL 8.0.21 开始,它会自动尝试重新加入组 3 次(每次尝试之间间隔 5 分钟),如果此自动重新加入过程不起作用,它将停止尝试重新加入组。当被驱逐的成员不尝试重新加入组时,它会切换到超级只读模式并等待操作员注意。(例外情况是在 MySQL 8.0.12 到 8.0.15 的版本中,默认情况是成员自行关闭。从 MySQL 8.0.16 开始,该行为已更改为与 MySQL 5.7 中的行为相匹配。)

    您可以使用本节中描述的组复制配置选项来永久或临时更改这些行为,以满足您的系统要求和优先级。如果您遇到由较慢的网络或机器、具有较高意外瞬时中断率的网络或计划中的网络中断导致的不必要的驱逐,请考虑增加驱逐超时和自动重新加入尝试。从 MySQL 8.0.21 开始,默认设置已朝此方向更改,以减少在这些情况下需要操作员干预以恢复被驱逐成员的频率。请注意,当成员正在经历上述任何默认行为时,尽管它不接受写入,但如果成员仍在与客户端通信,仍然可以进行读取,随着时间的推移,过时读取的可能性会增加。如果避免过时的读取对您来说比避免操作员干预更重要,请考虑减少驱逐超时和自动重新加入尝试或将它们设置为零。

    由于网络分区,未失败的成员可能会与复制组的部分(但不是全部)失去联系。例如,在一组 5 个服务器 (S1,S2,S3,S4,S5) 中,如果 (S1,S2) 和 (S3,S4,S5) 之间存在断开连接,则存在网络分区。第一组(S1,S2)现在是少数,因为它不能联系超过一​​半的组。少数群体中的成员处理的任何事务都被阻止,因为该群体的大多数人不可达,因此该群体无法达到法定人数。有关此方案的详细说明,请参阅第 18.7.8 节,“处理网络分区和仲裁丢失”.在这种情况下,默认行为是少数和多数成员都留在组中,继续接受交易(尽管它们在少数成员上被阻塞),并等待操作员干预。此行为也是可配置的。

    请注意,如果组成员处于不支持相关设置的较旧 MySQL Server 版本,或者处于具有不同默认值的版本中,他们将根据上述默认行为对自己和其他组成员采取行动。例如,不支持的成员group_replication_member_expel_timeout一旦检测到过期的怀疑,系统变量就会驱逐其他成员,即使其他成员支持系统变量并且设置了更长的超时时间,这种驱逐也会被其他成员接受。