翻译或纠错本页面

为复制集新增节点

On this page

概述

This tutorial explains how to add an additional member to an existing replica set. For background on replication deployment patterns, see the 复制集架构 document.

最多可参与投票的节点数

A replica set can have a maximum of seven voting members. To add a member to a replica set that already has seven voting members, you must either add the member as a non-voting member or remove a vote from an existing member.

Init Scripts

In production deployments you can configure a init script to manage member processes.

已有节点

我们可以使用这些命令来为现有复制集新增节点。我们还可以使用命令 “re-add” 来添加一个已经被移除了的节点。如果这个被移除的节点中的数据较新,它能很快恢复并赶上主节点的数据。

数据文件

如果我们有已有节点的备份或者快照,我们可以可以将数据文件( dbPath 文件夹中) 复制到新的机器并使用它们快速的建立一个新的节点。这些数据文件必须是:

  • 同个复制集中可用节点的数据备份。参见 Back Up and Restore with Filesystem Snapshots 以获得更多信息。

    重要

    推荐使用文件快照的方式而不是来 mongodumpmongorestore 来为复制集新成员做数据备份。

  • More recent than the oldest operation in the primary’s oplog. The new member must be able to become current by applying operations from the primary’s oplog.

需求

  1. 一个可用的复制集。

  2. 一个拥有数据集的MongoDB节点,且可以与现有复制集通讯。

否则,请参考 installation tutorial部署复制集

步骤

准备数据目录

在我们为现有的 replica set 新增节点的时候,我门需要先通过下列的某一个策略来准备好新节点的 data directory

  • 请确认新节点的数据目录 没有 数据。新节点将会从已有节点中复制数据。

    如果新节点在 recovering 状态,不必担心,在MongoDB复制完毕所有的数据之前,它将都会是该状态,如果复制完毕,则会变为 secondary

  • 从已有的节点上手动的复制数据。新节点会成为从节点并赶上复制集的最新的数据集状态。这样复制数据可以减少新节点从初始化到可用所需的时间。

    确保我们从新节点上复制来的数据是在 window allowed by the oplog 之内的。不然的话,新的节点还是需要全新的初始化复制,将会从其他节点上复制所有的数据, 如 复制集成员的重新同步 所介绍的一样。

    使用 rs.printReplicationInfo() 来确认复制集的oplog状态。

关于复制集架构的信息,请按考 复制集架构

为现有复制集新增节点

  1. 启动新的 mongod 实例。指定数据目录和复制集名。下列例子指了 /srv/mongodb/db0 为数据目录,复制集名为 rs0 的复制集:

    mongod --dbpath /srv/mongodb/db0 --replSet rs0
    

    记下新 mongod 实例的主机名和端口信息。

    有关配置参数的更多信息,请参见 mongod 手册页面。

    配选

    我们可以在 配置文件 mongo.conf 中指定数据目录和复制集名,并可以通过如下命令来启动 mongod

    mongod --config /etc/mongod.conf
    
  2. 连接到复制集的主节点。

    我们可以在连接到主节点的时候仅新增一个节点。如果我们不知道哪个节点是主节点,我们可以登陆到每个节点并执行 db.isMaster() 命令。

  3. 使用 rs.add() 命令来为复制集新增节点。举个例子,下列命令可以为复制集新增一个主机名为 mongodb3.example.net 的节点。

    rs.add("mongodb3.example.net")
    

    我们也可以指定端口:

    rs.add("mongodb3.example.net:27017")
    
  4. 检验节点是不是已经是复制集的一员了。使用 rs.conf() 命令来显示 replica set configuration

    rs.conf()
    

    我们可以使用 rs.status() 来查看复制集的状态。关于复制集状态的具体信息请参见 replSetGetStatus

配置并新增一个节点

You can add a member to a replica set by passing to the rs.add() method a members document. The document must be in the form of a members document. These documents define a replica set member in the same form as the replica set configuration document.

重要

Specify a value for the _id field of the members document. MongoDB does not automatically populate the _id field in this case. Finally, the members document must declare the host value. All other fields are optional.

例子

添加一个有如下参数的节点:

  • an _id of 1.
  • a hostname and port number of mongodb3.example.net:27017.
  • a priority value within the replica set of 0.
  • a configuration as hidden,

Issue the following:

rs.add({_id: 1, host: "mongodb3.example.net:27017", priority: 0, hidden: true})