20.5.4.4 分布式恢复的故障容忍
分布式恢复过程中,Group Replication 已经内置了一些措施,以确保在出现问题时的故障容忍。
分布式恢复的捐赠者将从当前视图中的可用在线组成员列表中随机选择。随机选择捐赠者意味着,在多个成员加入组的情况下,相同服务器不太可能被选中超过一次。在状态转移过程中,从二进制日志选择的捐赠者需要运行与自己相同或低于patch版本的MySQL Server。对于早期版本,所有在线成员都允许作为捐赠者。对于远程克隆操作,joiner 只选择运行相同patch版本的捐赠者。请注意,在操作结束时,加入成员重启后,它将与新的捐赠者建立连接,以从二进制日志进行状态转移,这可能是原始捐赠者的不同成员。
在以下情况下,Group Replication 在分布式恢复中检测到错误,自动切换到新捐赠者,并重试状态转移:
-
连接错误 - 出现身份验证问题或与候选捐赠者的连接问题。
-
复制错误 - 在状态转移过程中使用的复制线程(接收器或应用程序线程)之一失败。由于这个状态转移方法使用了现有的MySQL 复制框架,因此可能会出现一些暂时性错误,导致接收器或应用程序线程失败。
-
远程克隆操作错误 - 远程克隆操作失败或在完成前被停止。
-
捐赠者离开组 - 捐赠者离开组,或者在捐赠者的Group Replication中止了状态转移过程。
性能Schema表replication_aplier_status_by_worker
显示了导致最后一次重试的错误。在这些情况下,新的连接将尝试使用新候选捐赠者。选择不同的捐赠者在出现错误时意味着新的候选捐赠者可能不具有相同的错误。如果安装了clone插件,Group Replication将尝试使用每个合适的在线clone支持捐赠者来执行远程克隆操作。如果所有这些尝试失败,Group Replication将尝试从二进制日志中进行状态转移,以便与所有合适的捐赠者进行交互,如果可能。
在远程克隆操作中,对于接收方(加入成员)中的用户创建表空间和数据将被删除,直到远程克隆操作开始传输来自捐赠者的数据。如果远程克隆操作开始但未完成,加入成员可能会留下部分原始数据文件或无用户数据。由捐赠者传输的数据在克隆操作停止前从接收方中被删除。这一情况可以通过重试克隆操作来修复,Group Replication将自动执行重试。
在以下情况下,分布式恢复过程无法完成,并且加入成员离开组:
-
已 purged 的事务 - 加入成员需要的交易记录不在任何在线组成员的二进制日志文件中,也不能通过远程克隆操作获取(因为克隆插件未安装,或者由于克隆尝试了所有可能的捐赠者但失败)。因此,加入成员无法与组同步。
-
额外事务 - 加入成员已经包含一些不在组中的交易记录。如果进行了远程克隆操作,这些事务将被删除并丢失,因为加入成员的数据目录将被擦除。如果从捐赠者的二进制日志中执行状态转移,这些事务可能与组的事务冲突。关于如何处理这种情况,请参阅Extra Transactions。
-
连接重试限制已达到 - 加入成员已经尝试了连接的次数超过了连接重试限制。你可以使用
group_ replication_ recovery_ retry_ count
系统变量来配置(见Section 20.5.4.3,“Configuring Distributed Recovery”)。 -
没有更多捐赠者 - 加入成员已经尝试了远程克隆操作,每个在线clone支持的捐赠者(如果安装了克隆插件),然后尝试从二进制日志中执行状态转移,每个可用的在线捐赠者(如果可能)。
-
成员加入后离开组 - 成员加入后离开组或在状态转移进行中,Group Replication 在加入成员上停止。
如果加入成员无意地离开组,在上述情况中除了最后一种情况外,它将按照 group_ replication_exit_state_action
系统变量指定的操作进行。