dbDao 百度贴吧:http://tieba.baidu.com/dbdao
MongoDB技术学习QQ群: 421431253
概览
本文描述了如何为已有的 replica set 新增节点。有关复制集部署的模式的信息,参见复制集部署架构文档。
最多可参与投票的节点数
一个复制集最多可以拥有7个 参与投票的节点 。如果要为已经拥有7个参与投票节点的复制集新增节点,我们需要将新增的节点设置为 不参与投票的节点 或者将 已有的投票节点 的票数清除。
已有节点
我们可以使用这些命令来为现有复制集新增节点。我们还可以使用命令 “re-add” 来添加一个已经被移除了的节点。如果这个被移除的节点中的数据较新,它能很快恢复并赶上主节点的数据。
数据文件
如果我们有已有节点的备份或者快照,我们可以可以将数据文件( dbPath 文件夹中) 复制到新的机器并使用它们快速的建立一个新的节点。这些数据文件必须是:
-
同个复制集中可用节点的数据备份。参见 用文件系统快照备份并恢复 以获得更多信息。
重要
推荐使用文件快照的方式而不是来 mongodump 和 mongorestore 来为复制集新成员做数据备份。
-
比在主节点oplog最旧的操作更近。新成员必须能通过从主节点的oplog应用操作获取当前数据。
步骤
准备数据目录
在我们为现有的 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状态。
关于复制集架构的信息,请按考 复制集架构 。
为现有复制集新增节点
-
启动新的 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 的方式来定义了复制集节点。
例子
添加一个有如下参数的节点:
- _id为1
- mongodb3的主机名和端口号。如:net:27017.
- 在复制集优先级值为0
- 设置为隐藏,
命令如下:
rs.add({_id: 1, host: "mongodb3.example.net:27017", priority: 0, hidden: true})