• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 将MySQL克隆与InnoDB集群一起使用

    在MySQL 8.0.17中,InnoDB集群集成了MySQL Clone插件以提供自动配置连接实例。检索集群数据以使实例可以与集群同步的过程称为分布式恢复。当实例需要恢复集群的事务时,我们区分施主(即提供数据的集群实例)和接收者,这是从供体接收数据的实例。在以前的版本中,组复制仅提供异步复制来恢复加入实例与集群同步所需的事务,以便它可以加入集群。对于具有大量先前处理过的事务的集群,新实例在加入集群之前可能需要很长时间才能恢复所有事务。例如,作为常规维护的一部分,清除了GTID的集群可能会丢失一些恢复新实例所需的事务。在这种情况下,唯一的选择是使用MySQL Enterprise Backup之类的工具手动设置实例,如“将MySQL Enterprise Backup与组复制一起使用”。

    MySQL克隆为实例提供了另一种方法来恢复与集群同步所需的事务。MySQL Clone不再依赖异步复制来恢复事务,而是对施主实例上的数据进行快照,然后将快照传输到接收方。

    警告

    克隆操作期间,接收器中的所有先前数据均被破坏。但是,所有未存储在表中的MySQL设置都将保留。

    克隆操作将快照传输到接收器后,如果集群在传输快照时已处理了事务,则异步复制将用于恢复接收器与集群同步所需的任何数据。这比实例使用异步复制恢复所有事务要高效得多,并且可以避免由清除的GTID引起的任何问题,从而使您能够快速为InnoDB集群配置新实例。有关更多信息,请参见“MySQL服务器克隆插件”和“克隆分布式恢复”。

    与使用MySQL Clone相比,增量恢复是其中加入集群的实例仅使用异步复制从集群中恢复实例的过程。将InnoDB集群配置为使用MySQL Clone时,加入集群的实例将使用MySQL Clone或增量恢复来恢复集群的事务。默认情况下,集群会自动选择最合适的方法,但是您可以选择配置此行为,例如强制克隆,以替换加入实例已经处理的所有事务。在交互模式下使用MySQL Shell时,如果集群不确定它能否继续进行恢复,则默认为默认模式,它将提供一个交互提示。

    另外,状态为Cluster.status() for的成员的输出RECOVERING包括恢复进度信息,使您可以轻松地监视恢复操作,无论它们是使用MySQL Clone还是增量恢复。InnoDB集群在的输出中提供了有关使用MySQL Clone的实例的附加信息Cluster.status()

    使用使用MySQL克隆的群集

    使用MySQL Clone的InnoDB群集提供以下附加行为。

    dba.createCluster()和MySQL克隆

    从版本8.0.17开始,默认情况下,在可以使用MySQL Clone插件的实例上创建新集群时,该集群将自动安装,并且该集群配置为支持克隆。使用所需的BACKUP_ADMIN权限创建InnoDB群集恢复帐户。

    disableCloneBoolean选项设置true为禁用集群的MySQL Clone。在这种情况下,将为此配置添加元数据条目,并且如果安装了MySQL Clone插件,则将其卸载。您可以disableClone在发布dba.createCluster()时或在群集运行时随时使用来设置该选项Cluster.setOption()

    Cluster.addInstance(instance)和MySQL克隆

    instance如果新实例运行的是MySQL 8.0.17或更高版本,并且集群中至少有一个捐助者(包含在group_replication_group_seeds列表中)运行的是MySQL 8.0.17或更高版本,则可以使用MySQL Clone进行联接。使用MySQL Clone的群集遵循将实例添加到群集中记录的行为,并增加了如何传输从群集中恢复实例所需的数据的可能选择。怎样的行为取决于以下因素:Cluster.addInstance(instance)

    • 是否支持MySQL Clone。
    • 是否可以进行增量恢复,这取决于二进制日志的可用性。例如,如果施主实例具有所有必需的二进制日志(GTID_PURGED为空),则可以进行增量恢复。如果没有群集实例需要所有二进制日志,则无法进行增量恢复。
    • 增量恢复是否合适。即使可能进行增量恢复,因为它可能会与实例上已有的数据发生冲突,但仍会检查施主和接收者上的GTID集,以确保增量恢复合适。以下是比较的可能结果:

      • 新增:接收者的GTID_EXECUTEDGTID集为空
      • 相同:接收者的GTID集与捐赠者的GTID集相同
      • 可恢复:接收者的GTID集缺少交易,但是可以从捐赠者那里恢复
      • 无法恢复:捐助者的GTID集缺少交易,可能已被清除
      • 分歧:捐助者和接受者的GTID集已分歧

      当比较结果被确定为相同或可恢复时,增量恢复被认为是适当的。如果比较结果被确定为“不可恢复”或“分散”,则认为增量恢复是不合适的。

      对于被认为是“新建”的实例,不能确定增量恢复是合适的,因为无法确定是否清除了二进制日志,甚至无法确定GTID_PURGEDGTID_EXECUTED变量是否已重置。或者,可能是服务器在启用二进制日志和GTID之前已经处理了事务。因此,在交互模式下,您必须确认要使用增量恢复。

    • gtidSetIsComplete选项的状态。如果您确定已使用完整的GTID集创建了集群,因此可以将具有空GTID集的实例添加到该集群而无需额外确认,请将集群级别的gtidSetIsCompleteBoolean选项设置为true

      警告

      将该gtidSetIsComplete选项设置为true意味着无论连接服务器包含任何数据,都将对其进行恢复,请谨慎使用。如果尝试添加已应用事务的实例,则可能会损坏数据。

    这些因素的组合会影响您发出实例时实例如何加入群集Cluster.addInstance()。该recoveryMethod选项auto默认设置为默认值,这意味着在MySQL Shell的交互模式下,群集选择从群集中恢复实例的最佳方法,并且提示将提示您如何继续。换句话说,群集建议根据最佳方法和服务器支持使用MySQL克隆或增量恢复。如果您没有使用交互模式并且正在编写MySQL Shell脚本,则必须设置recoveryMethod为要使用的恢复类型-cloneincremental。本节介绍了各种可能的方案。

    在交互模式下使用MySQL Shell时,带有添加实例的所有可能选项的主提示符为:

    Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone):
    

    根据提到的因素,可能不会为您提供所有这些选项。本节后面介绍的方案说明了提供的选项。此提示提供的选项是:

    • 克隆:选择此选项可将供体克隆到要添加到集群中的实例,并删除该实例包含的所有事务。MySQL Clone插件会自动安装。使用所需的创建InnoDB群集恢复帐户BACKUP_ADMIN特权。假设您要添加的实例为空(尚未处理任何事务)或包含不想保留的事务,请选择“克隆”选项。然后,集群使用MySQL Clone完全覆盖来自捐赠者集群成员的快照的加入实例。要默认使用此方法并禁用此提示,请将群集的recoveryMethod选项设置为clone
    • 增量恢复选择此选项可使用增量恢复使用异步复制将群集处理的所有事务恢复到加入实例。如果您确定集群曾经处理过的所有更新都是在启用GTID的情况下完成的,则增量恢复是适当的,没有清除的事务,并且新实例包含与集群或其子集相同的GTID集。要默认使用此方法,请将recoveryMethod选项设置为incremental

    上述因素的组合会影响以下提示中哪些选项可用:

    注意

    如果group_replication_clone_threshold已在AdminAPI之外手动更改了系统变量,则群集可能决定使用克隆恢复,而不是遵循这些方案。

    • 在一种情况下

      • 增量恢复是可能的
      • 增量恢复不合适
      • 支持克隆

      您可以在任何选项之间进行选择。建议您使用默认的MySQL Clone。

    • 在一种情况下

      • 增量恢复是可能的
      • 增量恢复是合适的

      没有提示您,并且使用增量恢复。

    • 在一种情况下

      • 增量恢复是可能的
      • 增量恢复不合适
      • 不支持或禁用克隆

      您不能使用MySQL Clone将实例添加到群集中。提示您,建议的选项是继续进行增量恢复。

    • 在一种情况下

      • 增量恢复是不可能的
      • 不支持或禁用克隆

      您无法将实例添加到群集中,并且会出现错误:必须先克隆或完全配置目标实例,然后才能将其添加到目标群集。Cluster.addInstance:显示所需的实例设置(RuntimeError)。这可能是从所有群集实例中清除了二进制日志的结果。建议通过升级集群或将disableClone选项设置为来使用MySQL Clone false

    • 在一种情况下

      • 增量恢复是不可能的
      • 支持克隆

      您只能使用MySQL Clone将实例添加到群集中。这可能是由于群集缺少二进制日志(例如在清除它们时)造成的。

    从提示中选择一个选项后,默认情况下将显示实例从集群恢复事务的进度。通过此监视,您可以检查恢复阶段是否正常运行,以及实例需要多长时间才能加入群集并联机。要取消恢复阶段,问题的监测控制+ C

    Cluster.checkInstanceState()和MySQL克隆

    Cluster.checkInstanceState()运行该操作以针对使用MySQL Clone的群集验证实例时,如果该实例没有二进制日志,例如,因为已清除二进制日志,但Clone可用且未禁用(disableCloneis false),则该操作会提供警告:可以使用克隆。例如:

    The cluster transactions cannot be recovered on the instance, however,
    Clone is available and can be used when adding it to a cluster.
    
    {
    "reason": "all_purged", 
    "state": "warning"
    }
    

    同样,在克隆不可用或已被禁用且二进制日志不可用(例如,由于已清除二进制日志)的情况下,输出包括:

    The cluster transactions cannot be recovered on the instance.
    
    {
    "reason": "all_purged", 
    "state": "warning"
    }
    
    dba.checkInstanceConfiguration()和MySQL克隆

    dba.checkInstanceConfiguration()对具有可用的MySQL克隆但被禁用的实例运行该操作时,将显示警告。