6.3.5使用InnoDB Replicaset

您可以使用与InnoDB集群合作的方式使用InnoDB Replicaset。例如如上所示将实例添加到复制品,你分配一个复制品对象到管理replicaset的变量和调用操作,例如复制品.addinstance()添加实例,这相当于.addinstance()在innodb集群中。因此,许多文件在10bet官方网站第6.2.5节“与InnoDB集群合作”也适用于InnoDB Replicaset。以下支持以下操作复制品对象:

  • 你上网帮助复制品对象,和管理员,使用\帮助复制或者复制品。帮助()\帮助DBA.或者dba.help()。看第6.1节“MySQL管理员”

  • 您可以快速检查一个名称复制品对象使用名称或者复制品.getName()。例如,以下是等同的:

    mysql-js> rs.name示例mysql-js> rs.getname()示例
  • 使用使用的检查有关复制品集的信息复制品。地位()操作,支持延长选项以获得不同级别的细节。例如:

    • 默认为延长是0,定期详细级别。除非默认或意外复制设置和状态外,才包含有关实例和复制状态的基本信息。

    • 环境延长对于1包括元数据版本,服务器UUID,诸如滞后和工作线程的复制信息,用于导出实例的状态,应用程序队列的大小,系统变量的值,以防止意外写入等。

    • 环境延长2包括重要的复制相关配置设置,例如加密连接等。

    输出复制品.status(扩展= 1)非常相似.status(扩展= 1),但主要区别是复制字段始终可用,因为InnoDB Replicaset依赖于所有时间的MySQL复制,与InnoDB集群不同,在增量恢复期间使用它。有关字段的更多信息,请参阅检查群集的状态。地位()

  • 您使用该实例更改用于复制品的实例复制品.addinstance()复制品.RemoveInstance()操作。看将实例添加到复制品, 和从InnoDB集群中删除实例

  • 复制品.rejoininstance()添加返回到复制品的实例,例如故障转移后。

  • 使用复制品.setprimaryInstance()操作以安全地执行复制品的主更改为另一个实例。看replicaset主要的计划更改

  • 使用复制品.forcePrimaryInstance()操作执行主要的强制故障转移。看迫使副本中的主实例

  • 您可以使用MySQL路由器实例,该实例以与InnoDB群集的方式与ReplicAset一起引导。看使用群集的路由器有关信息的信息复制品.listrouters()复制品.removeroutermetadata()。有关使用InnoDB Replicaset的使用MySQL路由器的特定信息使用具有MySQL Router的Replicasets

  • 版本8.0.23 InnoDB Replicaset支持并启用并行Replication Plackier,有时称为多线程副本。使用具有InnoDB Replicaset的并行Replication Plusher要求您的实例已配置正确的设置。如果要从早期版本升级,实例需要更新配置。对于属于InnoDB Replicaset的每个实例,通过发出更新配置dba.configurigureerplicaseTinstance(实例)。请注意,通常dba.configurigurereplicaseTinstance()在将实例添加到副本集之前使用,但在此特殊情况下,无需删除实例并在线进行配置更改。有关更多信息,请参阅配置并行Replication Planterier

    InnoDB Replicaset实例报告有关并行Replication Platier的信息复制品.status(扩展= 1)手术下的操作复制场地。

有关更多信息,请参阅链接的InnoDB集群部分。

以下操作特定于InnoDB Replicaset,只能调用A复制品目的:

replicaset主要的计划更改

使用复制品.setprimaryInstance()操作以安全地执行复制品的主更改为另一个实例。当前主将其降级为辅助和制作的读数,而升级的实例成为新的主要初级,并且是读写的。更新所有其他辅助实例以从新主机复制。已被引导的MySQL路由器实例自动启动将读写客户端重定向到新的主要。

为了安全更改初级才能,所有副本设置实例必须由MySQL Shell访问,并一致gtid_execute套。如果主要是不可用的,则无法恢复它,强制故障转移可能是唯一的选项,请参阅迫使副本中的主实例

在更改主时,升级实例与旧主要的实例同步,确保在拓扑更改提交之前应用于主要的所有事务。如果此同步步骤需要太长或在任何次要实例上不可能,则操作中止了操作。在这种情况下,这些有问题的次要实例必须是从复制或从复制品中删除的,以便失败。

迫使副本中的主实例

与InnoDB集群不同,它在主机意外故障的情况下支持自动故障转移,InnoDB Replicaset没有自动故障检测或基于协商的协议,例如由组复制提供的协议。如果主要是非可用的,则需要手动故障转移。丢失其主要的InnoDB Replicaset有效地只读,并且对于任何写入更改,必须选择新的主要主机。如果您无法连接到主要,并且您无法使用复制品.setprimaryInstance()如上所述,要安全地执行转换到新初级replicaset主要的计划更改, 使用复制品.forcePrimaryInstance()操作执行主要的强制故障转移。这是一个最后的度假作业操作,必须仅用于灾难类型场景,其中当前主机不可用,无法以任何方式恢复。

警告

强制故障转移是一个可能的破坏性动作,必须谨慎使用。

如果未给出目标实例(或为null),则会自动选择最新的实例并将其推广为新的主要主机。如果提供了一个目标实例,则会将其升级到主要,而其他可达次级实例被切换以从新主机复制。目标实例必须具有最新的最新状态gtid_execute在可达实例中设置,否则操作失败。

故障转移与计划的主要变更不同,因为它促销了辅助实例而不同步或更新旧主机。这具有以下主要后果:

  • 尚未在旧的主要失败时尚未应用的任何交易丢失。

  • 如果旧的主要是实际仍在运行和处理事务,则存在旧和新的初始初级的瞬息大脑和数据集。

如果最后一个已知的主要仍可到达,则复制品.forcePrimaryInstance()操作失败,以降低分裂性脑势情况的风险。但是,管理员有责任确保其他实例无法进入旧初级,以防止或最小化这种情况。

在强制故障转移之后,旧主初级被新主机视为无效,并且不再可以成为副本集的一部分。如果在以后您找到恢复实例的方法,则必须从复制品中删除它并将其重新添加为新实例。如果在故障转移期间没有切换到新主机的任何辅助实例,则它们也被视为无效。

故障转移后,数据丢失是可能的,因为旧主要主要可能具有尚未复制到次​​要升级的事务。此外,如果假定出现故障的实例仍然能够处理事务,例如因为它所在的网络仍然运行但从MySQL Shell无法访问,因此它继续从升级的实例发出分歧。在实例上的事务集中恢复已分配在某些情况下分配了发出的事务集,即使可以恢复失败的实例,也无法在某些情况下进行。在许多情况下,从灾难中恢复的最快和最简单的方法是通过丢弃此类分配的事务并重新配置新推广的主要的新实例。

Innodb Replicaset锁定

从80.0.20版,Adminapi使用锁定机制来避免不同操作同时对InnoDB ReplicaseT执行更改。此前,MySQL Shell的不同实例可以同时连接到InnoDB ReplicaseT,并同时执行管理员操作。这可能导致实例状态和错误,例如如果复制品.addinstance()复制品.setprimaryInstance()并行执行。

InnoDB Replicaset操作具有以下锁定:

  • dba.upgrademetadata()dba.createreplicaset()是全球独家操作。这意味着如果MySQL Shell在InnoDB Replicase上执行这些操作,则无法对InnoDB replicaseT或其任何实例执行其他操作。

  • 复制品.forcePrimaryInstance()复制品.setprimaryInstance()是更改主要的操作。这意味着如果MySQL shell针对InnoDB replicaseT执行这些操作,则在第一次操作完成之前,否无法执行更改主或实例更改操作的其他操作。

  • 复制品.addinstance(),复制品.rejoininstance(), 和复制品.RemoveInstance()是更改实例的操作。这意味着如果MySQL Shell在实例上执行这些操作,则锁定实例以锁定任何其他实例更改操作。但是,此锁仅在实例级别,并且InnoDB复制品中的多个实例可以同时执行这种类型的操作之一。换句话说,在InnoDB replicaset中的每隔一个实例可以执行大多数一个实例改变操作。

  • dba.getreplicaset()复制品。地位()是InnoDB Replicaset读取操作,不需要任何锁定。

在实践中,如果您尝试执行InnoDB Replicaset相关操作,而在仍然无法执行的另一个操作仍在运行,则会收到一个错误,指示未能获取所需资源上的锁定。在这种情况下,您应该等待运行操作,该运行操作将锁定完成,只需尝试执行下一次操作。例如:

mysql-js> rs.addinstance(“admin @ rs2:3306”);错误:无法执行操作,因为它无法在实例上获取锁定'RS1:3306'。需要独占访问实例的另一个操作仍在进行中,请等待它完成并再次尝试。Replicaset.addinstance:未能在实例上获取锁定'RS1:3306'(MySQLSH 51400)

在这个例子中,复制品.addinstance()操作失败,因为主实例上的锁定(RS1:3306例如,无法获得,例如因为a复制品.setprimaryInstance()操作(或其他类似操作)仍在运行。

标记复制品

Replicasets的标记及其实例支持。为了标记的目的,复制品支持setOption()setInstanceOption()选项()操作。这些操作通常与他们的方式相同等同物。有关更多信息,请参阅第6.2.9节“标记元数据”。本节记录与复制标签一起使用的差异。

重要的

没有其他选项可以为Replicasets及其实例配置。对于Replicasets,可记录的选项为InnoDB集群设置选项不受支持。唯一支持的选项是此处描述的标记。

复制品。选项()操作显示有关分配给单个复制品实例的标签的信息以及复制品本身。

选项争论复制品.setoption()复制品.setinstanceOption()只支持选项标签命名空间并抛出错误。

复制品.setinstanceoption(实例选项价值复制品.setOption(选项价值操作以与此同时的方式行事等效操作。

如上所述,隐藏实例没有差异从路由中删除实例。例如,要隐藏replicaset实例RS-1, 问题:

mysql-js>myreplicaset..setInstanceOption(icadmin @ Rs-1:3306,“标签:_ h”,真);

已被引导的MySQL路由器针对复制塔检测到更改并删除RS-1来自路由目的地的实例。