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