7.4.6.1 使用 MySQL Clone 的集群

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

dba.createCluster() 和 MySQL Clone

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

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

Cluster.addInstance(instance) 和 MySQL Clone

如果新实例运行 MySQL 8.0.17 或更高版本,并且集群中至少存在一个捐赠者(包含在 group_replication_group_seeds 列表中)运行 MySQL 8.0.17 或更高版本,则可以使用 MySQL Clone 来加入 instance。使用 MySQL Clone 的集群遵循 第 7.4.4 节,“将实例添加到 InnoDB 集群” 中记录的行为,并且增加了如何从集群传输恢复实例所需数据的选择。如何 Cluster.addInstance(instance) 行为取决于以下因素

  • 是否支持 MySQL Clone。

  • 增量恢复是否可行,这取决于二进制日志的可用性。例如,如果捐赠者实例具有所有必需的二进制日志(GTID_PURGED 为空),则增量恢复可行。如果集群实例都没有所有必需的二进制日志,则增量恢复不可行。

  • 增量恢复是否合适。即使增量恢复可能可行,但由于它有可能与实例上已有的数据发生冲突,因此会检查捐赠者和接收者的 GTID 集以确保增量恢复是合适的。比较可能产生以下结果

    • 新:接收者具有空的 GTID_EXECUTED GTID 集

    • 相同:接收者具有与捐赠者 GTID 集相同的 GTID 集

    • 可恢复:接收者具有缺少事务的 GTID 集,但这些事务可以从捐赠者恢复

    • 不可恢复:捐赠者具有缺少事务的 GTID 集,可能已将其清除

    • 分叉:捐赠者和接收者的 GTID 集已分叉

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

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

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

    警告

    gtidSetIsComplete 选项设置为 true 意味着无论加入的服务器包含哪些数据,都会恢复它,请谨慎使用。如果您尝试添加一个已应用事务的实例,则存在数据损坏的风险。

这些因素的组合会影响您发出 Cluster.addInstance() 时实例加入集群的方式。默认情况下,recoveryMethod 选项设置为 auto,这意味着在 MySQL Shell 的交互模式下,集群会选择从集群恢复实例的最佳方式,并且提示会建议您如何进行。换句话说,集群会根据最佳方法和服务器支持的功能来建议使用 MySQL Clone 或增量恢复。如果您没有使用交互模式并正在编写 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 将实例添加到集群。您会收到提示,并且建议的选项是继续进行增量恢复。

  • 在以下情况下

    • 增量恢复不可行

    • 不支持克隆或已禁用克隆

    您无法将实例添加到集群中,并且会显示 ERROR: The target instance must be either cloned or fully provisioned before it can be added to the target cluster. Cluster.addInstance: Instance provisioning required (RuntimeError)。这可能是由于从所有集群实例中清除了二进制日志。建议您使用 MySQL Clone,方法是升级集群或将 disableClone 选项设置为 false

  • 在以下情况下

    • 增量恢复不可行

    • 支持克隆

    您只能使用 MySQL Clone 将实例添加到集群。这可能是由于集群缺少二进制日志,例如当它们被清除时。

选择提示中的选项后,默认情况下会显示实例从集群恢复事务的进度。此监控使您可以检查恢复阶段是否正常工作,以及实例加入集群并上线需要多长时间。要取消恢复阶段的监控,请按 CONTROL+C

dba.checkInstanceConfiguration() 和 MySQL Clone

当对具有可用但禁用的 MySQL Clone 的实例运行 dba.checkInstanceConfiguration() 操作时,会显示警告。