Mongodb 为复制集新增节点

概览

 

本文描述了如何为已有的 replica set 新增节点。有关复制集部署的模式的信息,参见复制集部署架构文档。

最多可参与投票的节点数

一个复制集最多可以拥有7个 参与投票的节点 。如果要为已经拥有7个参与投票节点的复制集新增节点,我们需要将新增的节点设置为 不参与投票的节点 或者将 已有的投票节点 的票数清除。

初始化脚本

在生产环节中,我们可以修改 init script 来管理节点。

 

已有节点

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

数据文件

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

  • 同个复制集中可用节点的数据备份。参见 用文件系统快照备份并恢复 以获得更多信息。

    重要

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

  • 比在主节点oplog最旧的操作更近。新成员必须能通过从主节点的oplog应用操作获取当前数据。

需求

  1. 一个可用的复制集。

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

否则,请参考 安装教程 和 部署复制集

 

步骤

准备数据目录

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

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

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

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

    确保我们从新节点上复制来的数据是在 window allowed by the oplog <replica-set-oplog-sizing>`之内的。不然的话,新的节点还是需要全新的初始化复制,将会从其他节点上复制所有的数据, 如 在resync a member of  a replica set 所介绍的一样。

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

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

 

为现有复制集新增节点

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

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

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

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

    配选

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

    mongod --config /etc/mongodb.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

 

配置并新增一个节点

我们可以通过 rs.add() 来将 members 配置文档新增进复制集中。配置文档必须是local.system.replset.members 的模式。这些配置文档使用 replica set configuration document 的方式来定义了复制集节点。

重要

指定 members_id 。Mongodb不会自动填入 _id 字段。最后, members 配置文档必须指定 host 的值。其他的字段都是选填的。

例子

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

  •  _id为1
  • mongodb3的主机名和端口号。如:net:27017.
  • 在复制集优先级值为0
  • 设置为隐藏,

命令如下:

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

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号