• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 分布式恢复的容错

    组复制的分布式恢复过程具有许多内置措施,以确保过程中出现任何问题时的容错能力。

    从当前视图中合适的在线组成员的现有列表中随机选择用于分布式恢复的捐助者。选择随机的捐助者意味着当多个成员进入该组时,很有可能一次选择同一台服务器的机会不多。从MySQL 8.0.17开始,为了从二进制日志进行状态转移,连接器仅选择一个供体,该供体与自己相比运行的MySQL服务器的修补程序版本较低或相等。对于早期版本,所有在线成员都可以成为捐助者。对于远程克隆操作,联接程序仅选择运行与自身相同修补程序版本的施主。请注意,如果在操作结束时加入成员重新启动,

    在以下情况下,组复制在分布式恢复中检测到错误,自动切换到新的施主,然后重试状态传输:

    • 连接错误-与候选供体的连接存在身份验证问题或其他问题。
    • 复制错误-用于从二进制日志进行状态转移的复制线程之一(接收者线程或应用线程)失败。由于这种状态转移方法使用现有的MySQL复制框架,因此某些瞬时错误可能会导致接收方或应用线程中的错误。
    • 远程克隆操作错误-远程克隆操作失败或在完成之前已停止。
    • 施主离开组-施主离开组,或在状态转移过程中停止施主上的组复制。

    性能架构表replication_applier_status_by_worker显示导致最后重试的错误。在这些情况下,尝试使用新的候选供体在错误之后进行新连接。如果发生错误,则选择其他供体意味着新的候选供体可能没有相同的错误。如果安装了克隆插件,则组复制将首先尝试使用每个合适的支持在线克隆的捐助者进行远程克隆操作。如果所有这些尝试均失败,则组复制将尝试使用所有合适的施主从二进制日志中依次进行状态传输(如果可能)。

    警告

    对于远程克隆操作,在远程克隆操作开始从供体传输数据之前,先删除用户创建的表空间和收件人(加入成员)上的数据。如果远程克隆操作开始但未完成,则加入成员可能会保留其原始数据文件的一部分或没有用户数据。如果在完全克隆数据之前停止了克隆操作,则将捐赠者转移的数据从接收者中删除。可以通过重试克隆操作来纠正这种情况,组复制会自动执行此操作。

    在以下情况下,分布式恢复过程无法完成,加入成员退出组:

    • 清除的事务-任何联机组成员的二进制日志文件中都没有加入成员所需的事务,并且无法通过远程克隆操作获取数据(因为未安装克隆插件,或者因为尝试了全部克隆可能的捐助者,但失败了。因此,加入成员无法赶上该组。
    • 事务冲突-加入成员已经包含了一些在组中不存在的事务。如果执行远程克隆操作,则这些事务将被删除并丢失,因为会删除加入成员上的数据目录。如果从捐赠者的二进制日志进行状态转移,则这些事务可能与组的事务冲突。
    • 达到连接重试限制-加入成员已进行了连接重试限制所允许的所有连接尝试。您可以使用group_replication_recovery_retry_count系统变量进行配置(请参见“配置分布式恢复”)。
    • 没有更多的捐助者-加入成员依次尝试与每个支持在线克隆的捐助者进行远程克隆操作(如果已安装克隆插件),但是没有成功地尝试从二进制日志中通过每个合适的在线方式进行状态转移如果可能的话,再依次捐赠。
    • 加入成员离开组-加入成员离开组,或者在状态转移进行期间,组复制在加入成员上停止。

    如果加入成员无意中离开了组,那么在上面列出的任何情况下(除了最后一个情况),它将继续执行group_replication_exit_state_action系统变量指定的操作