前言
一般生产环境下,我们总是会遇到副本集迁移节点到新机器上的问题,或者扩容出一个新secondary节点的需求,所以这里把我的笔记放在这里供参考,如果有不妥之处请指出,谢谢;
1.添加Secondary节点
有时候需要在已有的Replica set架构中添加节点
注:
Replica Set有最大选举节点数限制:7个,超过7个如果还想再添加则只能作为
non-voting member
1.1 创建文件目录
如果是在一台新机器上,则按照复制集节点中的目录创建即可,注意权限配置
1.2、copy配置文件mongodb.cnf
复制过来后,根据上步的文件目录进行相应的修改,若与原目录一致则可以不用修改,注意端口若有需要的话也记得一并修改
1.3、复制数据源
其实这一步有两种方法选择:
方法1: 使用内部自动复制机制
在数据量不大的情况下,可以使用此方法快捷方便
先在新机器上启动mongod进程
/usr/local/mongodb/bin/mongod -f /data1/conf/mongod.conf
然后直接在Pirmary节点上添加新节点即可
之后就等待所有数据同步完毕,新节点状态从STARTUP2变为;Secondary
注:
我通过测试发现这种同步方式真的非常非常慢,并且还消耗资源,因为这种方式是同步未压缩的源数据,而3.1的方法是复制经过压缩的数据文件;
方法2:直接复制从库的数据文件
如果数据量巨大,并且考虑担心影响主库性能等问题,可以使用如下第二种方法
即复制secondary目录下所有文件,此种方法简单快捷,并且不会占用太多的带宽
步骤:
(注:此时新机器上不启动mongod进程)
使用如下命令冻结一个secondary节点,防止写入新数据导致数据文件不一致,
db.fsyncLock() ---注意执行完此命令后窗口不要关闭,等待copy完成后使用
注:此时可以通过db.currentOp()在最后看到fsyncLock:true标签状态
将此时被冻结的secondary节点
--dbPath
参数对应目录下的所有文件全部拷贝到新机器上去;
待copy完成后,解锁当前secondary节点
db.fsyncUnlock()--解锁
启动新节点进程
/usr/local/mongodb/bin/mongod -f /data1/conf/mongod.conf
此时在Primary节点上添加此新节点
查看复制状态:
>db.printSlaveReplicationInfo() ---可以查看到新节点与复制集的数据状态
查看新节点的状态
此时新节点正在同步数据,从而使其与复制集Primary节点的数据状态一致,如果需要更新同步的数据很少量的话,则会很快变为
“Secondary”
而新节点的shell提示符也会随之而改变:
rs1:STARTUP2>
rs1: SECONDARY>
补充
4.修改同步源:
当然我们也可以手动修改数据同步节点(默认Primary上同步),可通过如下命令修改同步源
>rs.syncFrom("myHost:27017") ---myHost可以是符合条件的Secondary节点
注:
- 3.4版本以后,如果初始化同步正在进行中执行此命令,将会终止初始化同步进程,以新目标节点重新开始数据同步;
-
3.4以前版本,初始化过程不终止,完成后将再修改同步源
myHost符合条件:
- 必须要有数据,不能是arbiter节点,或处于startup2,recovering状态;
- 有权访问
- 同一个集群配置中的节点
- members[n].buildIndexes = true
- 必须是另外的节点,不能是自己