mongo副本集节点RECOVERING状态处理案例

背景:

线上架构为MongoDB副本集,三节点外加一隐藏备份节点,由于备份节点所在机房关停需要迁移备份节点至新机房

问题发现:

迁移过程需要全量拷贝数据至新机房,数据拷贝至新机房,重新启动备份节点,发现状态一直RECOVERING状态

问题分析:

排查发现oplogsize设置为50G,而数据量大小为150G左右,新机房机器配置为sas盘,写入性能很差,故网络传输很慢,传输大约2个小时左右,而在这两个小时期间,发现业务有大量的update操作,导致oplog被覆盖。

问题处理:

1、由于是备份节点,不会暂时影响到业务,跟业务沟通找到业务低峰期大约在下午3-6点时段;

2、查找是否可以在线修改oplogsize大小,发现当前版本(3.2.20)还不支持,故关闭备份节点,mv数据文件到backup目录下,开启备份节点重新全量拉取数据,然后在同步oplog。幸运的是,业务给了确实未做大量的修改类操作,oplog未被覆盖,数据同步成功,开启监控,完成。

技术难点:
由于对MongoDB是新手,查阅文档发现MongoDB3.6才可以在线修改oplogsize
旧版本修改只能通过一下方法修改
oplog大小的指定
在mongod创建oplog大小之前,可以replication.oplogSizeMB参数指定,如果已经创建好了oplog大小,后续需要改变的话,步骤如下:
方法一:简单粗暴型
将节点停掉,修改配置文件中oplog大小,然后删掉data数据目录下的所有文件,启动节点,重新拉取数据;要一个节点一个节点做
方法二:稍微复杂点的
a、关闭从节点
db.shutdownServer()
b、注释掉副本集参数replSet,然后作为一个单实例启动该节点
c、创建oplog的备份
mongodump --host=10.110.98.189 --port=9311 -udba -pxxxxxx --authenticationDatabase=admin -d local -c 'oplog.rs' -o /data1/LSW_product_picture_mongo/backup
d、确认local下没有tmp表,然后将oplog的最新一条记录保存到tmp表中
use local
db.temp.drop()
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
db.temp.find()
e、删掉当前的oplog表
db = db.getSiblingDB('local')或者use local
db.oplog.rs.drop()
f、创建新的oplog大小,比如50g:
db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )
g、将刚才保存在temp中的oplog插入新建立的oplog表中
db.oplog.rs.save( db.temp.findOne() )
db.oplog.rs.find()
h、去掉副本集参数replSet的注释,重新启动该节点

猜你喜欢

转载自www.cnblogs.com/DBA-3306/p/9687660.html