为复制集新增节点¶
概述¶
本文描述了如何为已有的 replica set 新增节点。有关复制集部署的
最多可参与投票的节点数¶
一个复制集最多可以拥有7个 参与投票的节点 。如果要为已经拥有7个参与投票节点的复制集新增节点,我们需要将新增的节点设置为 不参与投票的节点 或者将 已有的投票节点 的票数清除。
控制脚本¶
在生产环节中,我们可以修改 control script 来管理节点。
已有节点¶
我们可以使用这些命令来为现有复制集新增节点。我们还可以使用命令 “re-add” 来添加一个已经被移除了的节点。如果这个被移除的节点中的数据较新,它能很快恢复并赶上主节点的数据。
数据文件¶
如果我们有已有节点的备份或者快照,我们可以可以将数据文件( dbPath 文件夹中) 复制到新的机器并使用它们快速的建立一个新的节点。这些数据文件必须是:
同个复制集中可用节点的数据备份。参见 使用文件系统快照来备份及恢复 以获得更多信息。
重要
推荐使用文件快照的方式而不是来 mongodump 和 mongorestore 来为复制集新成员做数据备份。
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.
步骤¶
准备数据目录¶
在我们为现有的 replica set 新增节点的时候,我门需要先通过下列的某一个策略来准备好新节点的 data directory :
请确认新节点的数据目录 没有 数据。新节点将会从已有节点中复制数据。
如果新节点在 recovering 状态,不必担心,在MongoDB复制完毕所有的数据之前,它将都会是该状态,如果复制完毕,则会变为 secondary 。
从已有的节点上手动的复制数据。新节点会成为从节点并赶上复制集的最新的数据集状态。这样复制数据可以减少新节点从初始化到可用所需的时间。
确保我们从新节点上复制来的数据是在 window allowed by the oplog <replica-set-oplog-sizing>`之内的。不然的话,新的节点还是需要全新的初始化复制,将会从其他节点上复制所有的数据, 如 :doc:/tutorial/resync-replica-set-member` 所介绍的一样。
使用 rs.printReplicationInfo() 来确认复制集的oplog状态。
关于复制集架构的信息,请按考 复制集架构 。
为现有复制集新增节点¶
启动新的 mongod 实例。指定数据目录和复制集名。下列例子指了 /srv/mongodb/db0 为数据目录,复制集名为 rs0 的复制集:
mongod --dbpath /srv/mongodb/db0 --replSet rs0
记下新 mongod 实例的主机名和端口信息。
有关配置参数的更多信息,请参见 mongod 手册页面。
连接到复制集的主节点。
我们可以在连接到主节点的时候仅新增一个节点。如果我们不知道哪个节点是主节点,我们可以登陆到每个节点并执行 db.isMaster() 命令。
使用 rs.add() 命令来为复制集新增节点。举个例子,下列命令可以为复制集新增一个主机名为 mongodb3.example.net 的节点。
rs.add("mongodb3.example.net")
我们也可以指定端口:
rs.add("mongodb3.example.net:27017")
检验节点是不是已经是复制集的一员了。使用 rs.conf() 命令来显示 replica set configuration:
rs.conf()
我们可以使用 rs.status() 来查看复制集的状态。关于复制集状态的具体信息请参见 replSetGetStatus。
配置并新增一个节点¶
我们可以通过 rs.add() 来将 members 配置文档新增进复制集中。配置文档必须是 local.system.replset.members 的模式。这些配置文档使用 replica set configuration document 的方式来定义了复制集节点。
例子
添加一个有如下参数的节点:
- 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,
命令如下:
rs.add({_id: 1, host: "mongodb3.example.net:27017", priority: 0, hidden: true})