• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用InnoDB ReplicaSet

    使用InnoDB ReplicaSet的方式与使用InnoDB集群的方式几乎相同。例如,如在将实例添加到ReplicaSet中所示,您将一个ReplicaSet对象分配给一个变量,并调用管理副本集的操作,例如ReplicaSet.addInstance()添加实例,这与Cluster.addInstance() InnoDB群集中的等效。因此,“使用InnoDB群集”中的许多文档也适用于InnoDB ReplicaSet。ReplicaSet对象支持以下操作:

    • 您可以ReplicaSet使用\help ReplicaSetReplicaSet.help()\help dba或来获取对象的在线帮助以及AdminAPI dba.help()。请参阅使用AdminAPI。
    • 您可以ReplicaSet使用name或快速检查对象的名称ReplicaSet.getName()。例如,以下内容等效:

      mysql-js> rs.name
      example
      mysql-js> rs.getName()
      example
      
    • 您可以使用ReplicaSet.status()操作检查有关副本集的信息,该操作支持extended获取不同详细程度的选项。例如:

      • 默认extended值为0,这是常规级别的详细信息。除了非默认或意外的复制设置和状态之外,仅包括有关实例和复制状态的基本信息。
      • 设置extended为1包括元数据版本,服务器UUID和用于导出实例状态的原始信息,应用程序队列的大小,防止意外写入的系统变量的值等。
      • 设置extended为2包括与复制相关的重要配置设置,例如SSL,工作线程,复制延迟和心跳延迟。

      请参阅使用检查集群的状态Cluster.status()

    • 您可以使用ReplicaSet.addInstance()ReplicaSet.removeInstance()操作更改用于副本集的实例。请参阅将实例添加到副本集,以及从InnoDB群集中删除实例。
    • 如果实例保留副本集(例如,由于意外暂停),请使用该ReplicaSet.rejoinInstance()操作。请参阅重新加入集群。
    • 您可以使用与InnoDB群集完全相同的方式对复制集进行引导的MySQL路由器实例。见工作与群集的路由器上的信息ReplicaSet.listRouters()ReplicaSet.removeRouterMetadata()。有关将MySQL路由器与InnoDB ReplicaSet一起使用的特定信息,请参见“在MySQL路由器中使用副本集”。

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

    以下操作特定于InnoDB ReplicaSet,并且只能针对ReplicaSet对象调用:

    副本集主要的计划更改

    使用该ReplicaSet.setPrimaryInstance()操作可以安全地将副本集的主数据库更改为另一个实例。当前的主节点降级为辅助节点,并变为只读,而提升后的实例变为新的主节点,并变为可读写状态。所有其他辅助实例均已更新以从新的主实例复制。被引导到副本集的MySQL路由器实例将自动开始将读写客户端重定向到新的主实例。

    为了安全地更改主数据库,所有副本集实例必须可由MySQL Shell访问并且具有一致的GTID_EXECUTED集。如果主服务器不可用,并且无法还原它,则强制故障转移可能是唯一的选择,请参阅在副本集中强制主服务器实例。

    在更改主数据库期间,升级后的实例将与旧的主数据库同步,从而确保在提交拓扑更改之前应用了存在于主数据库上的所有事务。如果此同步步骤花费的时间太长或在任何辅助实例上都不可行,则该操作将中止。在这种情况下,必须修复或从副本集中删除这些有问题的辅助实例,才能进行故障转移。

    强制副本集中的主实例

    与InnoDB群集(在主数据库发生意外故障时支持自动故障转移)不同,InnoDB ReplicaSet没有自动故障检测或基于共识的协议(如组复制提供的协议)。如果主服务器不可用,则需要手动故障转移。丢失主数据库的InnoDB ReplicaSet实际上是只读的,并且对于任何写更改,必须选择一个新的主数据库。如果您无法连接到主数据库,并且无法用于按照副本集主数据库的计划更改ReplicaSet.setPrimaryInstance()所述安全地切换到新的主数据库,请使用ReplicaSet.forcePrimaryInstance()对主数据库执行强制故障转移的操作。这是不得已的操作,只能在当前主数据库不可用且无法以任何方式还原的灾难类型方案中使用。

    警告

    强制故障转移是一种潜在的破坏性操作,必须谨慎使用。

    如果未提供目标实例(或为null),则会自动选择最新实例并将其升级为新的主要实例。如果提供了目标实例,则将其提升为主要实例,而其他可访问的辅助实例则切换为从新的主要实例进行复制。目标实例必须GTID_EXECUTED在可到达的实例中具有最新设置,否则操作将失败。

    故障转移与计划的主要变更不同,因为它可以升级次要实例,而不与旧的主要实例进行同步或更新。这具有以下主要后果:

    • 在旧的主数据库发生故障时,尚未由辅助主数据库应用到辅助数据库的任何事务都将丢失。
    • 如果旧的主数据库实际上仍在运行并正在处理事务,则将出现裂脑,而旧的和新的主数据库的数据集将有所不同。

    如果最后一个已知的主节点仍然可以访问,则该ReplicaSet.forcePrimary()操作将失败,以减少发生裂脑情况的风险。但是,管理员有责任确保其他实例无法访问旧的主数据库,以防止或最小化此类情况。

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

    故障转移后可能会丢失数据,因为旧的主数据库可能具有尚未复制到要升级的辅助数据库的事务。此外,如果假定失败的实例仍然能够处理事务,例如由于其所在的网络仍在运行但无法从MySQL Shell到达,则它将继续与升级后的实例分离。一旦实例上的事务集发生分歧,要进行恢复就需要手动干预,即使在某些情况下可以恢复发生故障的实例,在某些情况下也无法实现。在很多情况下