常见的方法,直接把新的节点加入到现有的MongoDB集群中,让它自己去同步数据,这个方法最简单省事。
但是,也会存在一些缺点:
1、全量同步期间,集群的负载会变高,如果业务程序的read_timeout write_timeout 设置的比较低可能会有感知。对此可以调大业务程序链接mongodb的几个timeout参数。
2、需要事先估算下oplog的大小,防止出现新的节点还处于全量同步的过程中,现有集群的oplog被覆盖的情况。这样的话,新的节点永远也加不进集群里。
鉴于上述2个原因,生产上大库(例如1T以上)的加节点,我一般采样下面的方法:
假设节点标识为:主节点:M 2个备节点:S1 S2 , 新加入的节点为S3
1、关停一个从节点S1的MongoDB进程。 生产基本上都是一主两备(PSS架构)吧,如果还是一主一备一仲裁(PSA架构),建议乘早改掉,官方都不推荐了。
2、scp拷贝这个S1的数据到新的节点S3。
3、启动step1关停的从节点S1的MongoDB进程,自动加回集群。
4、启动新的节点S3的MongoDB进程。
5、在原先的主节点M上,执行添加S3节点的操作。
6、S3节点会加入后会根据oplog中的信息,尝试增量同步,等一段时间完成增量同步后即可加入集群。
TIPS:
oplog 在MongoDB>=3.6+ 版本(希望没记错)已经可以在线调整的。看下当前的oplog存多久的,就可估算出能不能撑到拷完数据,如果担心不够大就先在线调整下就行。