6.3.3添加副本集实例

创建replicasset后,可以使用ReplicaSet.addInstance ()操作将实例添加为replicasset当前主节点的只读从副本。在此操作期间,replicasset的主节点必须是可访问和可用的。MySQL Replication在添加的实例和主实例之间配置,使用自动创建的MySQL帐户和随机密码。在实例成为可操作的辅助实例之前,它必须与主实例保持同步。这个过程叫做恢复,InnoDB replicasset支持不同的方法,你可以用recoveryMethod选择。

要使实例能够连接replicasset,必须满足各种先决条件。它们被自动检查ReplicaSet.addInstance (),如果发现任何问题,则操作失败。使用dba.configureReplicaSetInstance ()在添加实例之前,验证和配置二进制日志和复制相关选项。MySQL Shell使用相同的用户名和密码连接到目标实例ReplicaSet处理对象。replicasset的所有实例都应该具有相同的管理员帐户,具有相同的权限和密码。在配置实例时,可以创建具有所需授权的自定义管理员帐户dba.configureReplicaSetInstance ()。看到配置InnoDB replicasset实例

InnoDB replicasset恢复方法

当新实例被添加到InnoDB replicasset中时,需要用它包含的现有数据来提供它们。这可以使用以下方法之一自动完成:

  • MySQL克隆,它从一个在线实例中获取一个快照,然后用该快照替换新实例上的任何数据。MySQL Clone非常适合加入一个新的空白实例到InnoDB replicasset。它不依赖于InnoDB replicasset应用的所有事务的完整二进制日志。

    警告

    在克隆操作期间,将销毁所添加实例的所有以前数据。所有没有存储在表中的MySQL设置都被维护。

  • 增量恢复,它依赖于MySQL Replication将所有丢失的事务应用到新实例上。如果新实例上缺少的事务量很小,那么这可能是最快的方法。但是,这种方法只有在InnoDB replicasset中至少有一个在线实例具有完整的二进制日志(包含InnoDB replicasset的整个事务历史)时才可用。如果二进制日志已从所有成员中清除,或者二进制日志仅在实例中已经存在数据库之后才启用,则不能使用此方法。如果要应用的事务量非常大,那么实例在加入InnoDB replicasset之前可能会有很长的延迟。

当一个实例加入一个ReplicaSet时,恢复的使用方式与InnoDB集群中非常相似。MySQL Shell尝试自动选择合适的恢复方法。如果无法安全地选择一种方法,MySQL Shell会提示使用什么方法。有关更多信息,请参见第6.2.2.2节,“在InnoDB集群中使用MySQL克隆”。本节将介绍向replicasset添加实例时的差异。

向replicasset添加实例

使用ReplicaSet.addInstance (实例)操作将辅助实例添加到ReplicaSet。您指定的实例作为一个类似uri的连接字符串。您指定的用户必须具有所需的权限,并且在replicasset中的所有实例上必须相同,请参阅配置InnoDB replicasset实例

例如,在rs-2与用户rsadmin问题:

mysql-js> rs.addInstance('rsadmin@rs-2')这个实例报告自己的地址为rsadmin@rs-2 rsadmin@rs-2:实例配置是合适的。*检查异步复制拓扑…*检查实例的事务状态…注意:目标实例'rsadmin@rs-2'没有预先分配(GTID集是空的)。Shell无法决定复制是否能够完全恢复其状态。提供新实例的最安全、最方便的方法是通过自动克隆提供,它将使用现有复制集成员的物理快照完全覆盖“rsadmin@rs-2”的状态。若要默认使用此方法,请将'recoveryMethod'选项设置为'clone'。警告:它应该是安全的依靠复制增量恢复新实例的状态如果你确定所有更新执行在replicaset完成GTIDs启用,没有清除事务和新实例包含相同的GTID集replicaset或它的一个子集。若要默认使用此方法,请将'recoveryMethod'选项设置为'incremental'。 Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone):

在本例中,我们没有指定恢复方法,因此该操作建议您如何最好地继续。在本例中,我们选择克隆选项,因为在加入replicasset的实例上没有任何现有事务。因此,不存在从联接实例中删除数据的风险。

[C]lone/[I] incremental recovery/[a] port (default Clone): C * Updating topology Waiting for Clone process of the new member to complete. [C]lone/[I] incremental recovery/[a] port (default Clone): C * Updating topology Waiting for Clone process of the new member to complete. [C]lone/[I] incremental recovery/[a] port (default Clone):按^C中止操作。*等待克隆完成…注意:rsadmin@rs-2正在从rsadmin@rs-1 **复制* *克隆转移文件拷贝完成  ############################################################ 100%完成页拷贝  ############################################################ 100%完成重做副本  ############################################################ 100%完成* *复苏阶段:\注:rsadmin@rs-2关闭……*等待服务器重启…准备* rsadmin@rs-2已经重启,等待克隆完成…*克隆进程已经完成:59.63 MB传输大约1秒(~1.00 B/s) **配置rsadmin@rs-2从rsadmin@rs-1复制**等待新的实例同步到PRIMARY…实例'rsadmin@rs-2'已添加到复制集,并正在从rsadmin@rs-1进行复制。

假设该实例对使用InnoDB replicasset有效,恢复将继续进行。在这种情况下,新加入的实例使用MySQL Clone从主服务器复制所有它还没有应用的事务,然后作为一个在线实例加入replicasset。要验证,请使用ReplicaSet.status ()操作:

mysql-js> rs.status() {"replicaSet": {"name": "example", "primary": "rs-1:3306", "status": "AVAILABLE", "statusText": "All instances AVAILABLE .", "topology": {"rs-1:3306": {"address": "rs-1:3306", "instanceRole": "primary", "mode": "R/W", "status": "ONLINE"}, "rs-2:3306": {"address": "rs-2:3306", "instanceRole": "SECONDARY", "mode":"R/O", "replication": {"applierStatus": "APPLIED_ALL", "applierThreadState": "Replica has read all relay log;" waiting for more updates", "receiverStatus": "ON", "receiverThreadState": " waiting for source to send event", "replicationLag": null}, "status": "ONLINE"}}, "type": "ASYNC"}}

这个输出显示了replicasset的名称例子现在由两个MySQL实例组成,主要的是1,76,645。当前有一个二级实例rs-2,这是主节点的副本。ReplicaSet是在线的,这意味着主从端是同步的。此时,replicasset已经准备好处理事务。

如果您想要覆盖交互式MySQL Shell模式,尝试选择最合适的恢复方法,使用recoveryMethod选项来配置实例如何恢复能够加入replicasset所需的数据。有关更多信息,请参见第6.2.2.2节,“在InnoDB集群中使用MySQL克隆”