天天看点

303、副本集如何扩容

前言

一般生产环境下,我们总是会遇到副本集迁移节点到新机器上的问题,或者扩容出一个新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()          ---可以查看到新节点与复制集的数据状态
           

查看新节点的状态

303、副本集如何扩容

此时新节点正在同步数据,从而使其与复制集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
    • 必须是另外的节点,不能是自己