OPTIONS
翻译或纠错本页面

为有不可用节点的复制集重设复制集配置

当复制集中有 少数 节点不可用的时候,我们可以在现在的 primary`上使用 :method:`rs.reconfig() 来进行重新配置,下列就是 Replica Set Reconfiguration Procedure 的例子。

本文讲述了如何在 **多数**节点不可用的时候进行复制集重新配置:

我们可能会用到其中一个方式,比如说在物理分布式复制集中,当没有一个数据中心拥有多数节点。参考 复制集选举 以获得更多有关该情况的信息。

强制更新复制集配置

在 2.0 版更改.

本文讲述了如何在 replica set 中多数节点不可用的时候恢复复制集的服务。我们可以连接到任意一个存活的节点上,在 rs.reconfig() 的时候使用 force 参数。

The force option forces a new configuration onto the member. Use this procedure only to recover from catastrophic interruptions. Do not use force every time you reconfigure. Also, do not use the force option in any automatic scripts and do not use force when there is still a primary.

强行应用复制集配置:

  1. 备份存活的节点。

  2. 连接进存货的节点,保存现有的配置。可以参考下列命令:

    cfg = rs.conf()
    
    printjson(cfg)
    
  3. 在同个节点上,通过如下方式从 members 数组中移除不可用的节点。可以参考如下命令:

    cfg.members = [cfg.members[0] , cfg.members[4] , cfg.members[7]]
    
  4. 在同一个节点上,通过使用 forcetruers.reconfig() 命令来强行应用配置:

    rs.reconfig(cfg, {force : true})
    

    该操作强制从节点使用新的配置。该配置将会同步到所有存活着的在 members 中节点,并会新选举出一个主节点。

    注解

    当我们使用 force : true 的时候,复制及配置的版本会显著增加(increases significantly)(成百上千的)。这是正常现象,这样设计是为了防止当网络情况不好的时候版本号出现冲突。

  5. 如果出现暂时性的失败或是分离,需要尽快关闭移除的节点。

通过覆盖复制集来重新配置

在2.0版本之前使用。如果MongoDB 是2.0版本或是更新,请使用之前提到的方法 强制更新复制集配置

这些教程都是适用于 replica set 中的 majority 节点不可用的时候。如果多数节点存活着,那么请使用 Examples 中的 rs.reconfig() 命令。

如果我们使用的是2.0版本之前的MongoDB,且复制集中多数节点不可用 ,我们会需要使用这里提到的两种方式。

通过关闭复制来重新配置

该操作将 replica setstandalone 来代替。

  1. 关闭运行着的 mongod 实例。为了确保是正常关闭,请使用 control script 或是 db.shutdownServer() 命令。

    举个栗子,连接到 mongo 窗口中使用 db.shutdownServer() 命令来关闭:

    use admin
    db.shutdownServer()
    
  2. 将数据文件目录备份( dbPath )。

    可选

    If you have a backup of the database you may instead remove this data.

  3. 重启一个 mongod 实例 ( 去除 --replSet 参数)。

    数据现在变的可用了(是单节点模式而不是复制集模式)。客户端可以对数据进行读写。

如果可能的话,请重新部署复制集来提供冗余和强壮数据架构。

通过 “Breaking the Mirror” 重新配置

该操作将现存的 replica set 节点指定为新的 primary 且寻找新的复制集。在下列过程中,新的主节点为 db0.example.net 。MongoDB 从 db0.example.net 上复制节点到复制集的其他节点中。

  1. 关闭运行着的 mongod 实例。为了确保是正常关闭,请使用 control script 或是 db.shutdownServer() 命令。

    举个栗子,连接到 mongo 窗口中使用 db.shutdownServer() 命令来关闭:

    use admin
    db.shutdownServer()
    
  2. 将所有节点的数据文件目录( dbPath )移除(除了 db0.example.net 节点的)。这样其他节点的数据目录都是空的了。

    mv /data/db /data/db-old
    
  3. local 数据库的数据文件移除,这样 db0.example.net 就无local数据库了,例如:

    mkdir /data/local-old
    mv /data/db/local* /data/local-old/
    
  4. 将复制集的每个节点正常启动。

  5. 连接进 db0.example.net ,且执行 rs.initiate() 来初始化复制集。

  6. 通过 rs.add() 来新增节点。举个栗子,将 db1.example.net27017 端口加入复制集:

    rs.add("db1.example.net:27017")
    

    MongoDB将在新增的节点上从 db0.example.net 上进行数据的复制。