步骤
准备数据目录
在我们为现有的 replica set 新增节点的时候,我门需要先通过下列的某一个策略来准备好新节点的 data directory :
-
请确认新节点的数据目录 没有 数据。新节点将会从已有节点中复制数据。
如果新节点在 recovering 状态,不必担心,在MongoDB复制完毕所有的数据之前,它将都会是该状态,如果复制完毕,则会变为 secondary 。
-
从已有的节点上手动的复制数据。新节点会成为从节点并赶上复制集的最新的数据集状态。这样复制数据可以减少新节点从初始化到可用所需的时间。
确保我们从新节点上复制来的数据是在 window allowed by the oplog 之内的。不然的话,新的节点还是需要全新的初始化复制,将会从其他节点上复制所有的数据, 如 复制集成员的重新同步 所介绍的一样。
使用 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。