组复制的分布式恢复过程具有多种内置措施,以确保在恢复过程中出现任何问题时的故障容忍。
分布式恢复的捐赠者从当前视图中的在线组成员列表中随机选择。随机选择捐赠者意味着在多个成员加入组时,同一个服务器不太可能被选择多次。从 MySQL 8.0.17 开始,对于二进制日志的状态传输,加入者只选择运行低于或等于其自身版本的 MySQL 服务器捐赠者。对于早期版本,所有在线成员都可以作为捐赠者。对于远程克隆操作,加入者只选择运行相同补丁版本的捐赠者。请注意,在操作结束时,加入成员重新启动,并与新的捐赠者建立连接,以便从二进制日志传输状态,这可能与原始捐赠者不同。
在以下情况下,组复制检测到分布式恢复中的错误,自动切换到新的捐赠者,并重试状态传输:
-
连接错误 - 出现身份验证问题或连接到候选捐赠者的其他问题。
-
复制错误 - 用于从二进制日志传输状态的其中一个复制线程(接收器或应用程序线程)失败。由于该方法使用现有的 MySQL 复制框架,因此可能出现一些暂时性的错误,导致接收器或应用程序线程出错。
-
远程克隆操作错误 - 远程克隆操作失败或在完成之前停止。
-
捐赠者离开组 - 捐赠者离开组,或者在状态传输过程中停止了组复制。
性能模式表 replication_applier_status_by_worker
显示了最后一个重试的错误。在这些情况下,新的连接将尝试与新的候选捐赠者建立连接。选择不同的捐赠者以避免错误意味着新的候选捐赠者可能不具有相同的错误。如果安装了克隆插件,组复制将首先尝试使用所有适合的在线克隆支持捐赠者进行远程克隆操作。如果所有这些尝试失败,组复制将尝试使用所有适合的捐赠者进行二进制日志状态传输。
对于远程克隆操作,在克隆操作开始之前,用户创建的表空间和数据将从接收者(加入成员)中删除。如果远程克隆操作开始但未完成,加入成员可能会留下部分原始数据文件,或者没有用户数据。如果捐赠者传输的数据在克隆操作停止之前未完全克隆,数据将从接收者中删除。这种情况可以通过重试克隆操作来修复,组复制将自动执行。
在以下情况下,分布式恢复过程无法完成,加入成员离开组:
-
清除事务 - 加入成员所需的事务不在任何在线组成员的二进制日志文件中,并且无法通过远程克隆操作获取数据(因为克隆插件未安装,或者尝试了所有可能的捐赠者但失败)。因此,加入成员无法赶上组。
-
额外事务 - 加入成员已经包含一些不在组中的事务。如果进行了远程克隆操作,这些事务将被删除并丢失,因为加入成员的数据目录将被擦除。如果进行了二进制日志状态传输,这些事务可能与组的事务冲突。有关处理这种情况的建议,请参阅 额外事务。
-
连接重试限制达到 - 加入成员已经尝试了允许的连接重试次数。你可以使用
group_replication_recovery_retry_count
系统变量配置此项(请参阅 第 20.5.4.3 节,“配置分布式恢复”)。 -
没有更多的捐赠者 - 加入成员尝试与每个在线克隆支持捐赠者进行远程克隆操作,但均未成功(如果安装了克隆插件),然后尝试从二进制日志中与每个合适的在线捐赠者进行状态传输,但均未成功。
-
加入成员离开组 - 加入成员离开组或在加入成员上停止组复制,而状态传输正在进行中。
如果加入成员无意离开组,那么在上述情况中除了最后一种情况外,它将根据 group_replication_exit_state_action
系统变量指定的操作。