mongodb副本集重新配置脚本
# mongodb副本集重新配置脚本
背景:已经有一个多节点的副本集,但是超过半数的节点失效了,需要重新把正常的节点配置副本集
## 功能
- 正常的节点会重新配置为新的副本集
- 会打印失效的节点,可以后续通过rs.add()添加回来
## 使用
1. mongo_reconfig.js文件的内容如下:
```js
conn = new Mongo("mongodb://127.0.0.1:27007");
db = conn.getDB("admin");
db.auth("root","ee06167b10a177f60766d35baa81955d");
// set secondary to write
rs.slaveOk()
// get the config of the old replication
cfg = rs.conf();
// get all the members status
smembers = rs.status().members;
// for (i = 0; i < smembers.length; i++) {
// if(smembers[i]["health"]){
// newcfgmembers.push(cfg.members[i])
// }
// }
// cfg.members=newcfgmembers;
newcfgmembers = [];
for(let index in smembers) {
if(smembers[index]["health"]){
newcfgmembers.push(cfg.members[index])
}
};
// reconfig
printjson("newcfgmembers is :");
printjson(newcfgmembers);
cfg.members=newcfgmembers;
// printjson(cfg.members);
rs.reconfig(cfg, {force : true})
printjson('the following mongo nodes need to be add if become normal: rs.add("192.168.11.141:27001")');
for(let index in smembers) {
if(!smembers[index]["health"]){
printjson(smembers[index]["name"]);
}
};
- 重新配置副本集
进入放置mongo_reconfig.js的目录,执行js文件:docker exec -i mongo mongo mongodb://127.0.0.1:27007 <
pwd/mongo_reconfig.js
根据实际情况调整命令。其他执行js的命令参考:
mongo localhost:27017/test myjsfile.js
如果是手动登录了mongo shell窗口,可以这样执行:
load("scripts/myjstest.js") //相对存储目录的路径
load("/data/db/scripts/myjstest.js") //绝对路径
MongoDB的数据存储目录是/data/db,那么myjstest.js在/data/db/scripts目录下。
- 恢复失效节点
在第2步中,脚本跑完后会把失效节点打印出来。当失效节点恢复正常后,可以通过rs.add()命令把节点加回来:
rs.add( "192.168.11.141:27001" )
rs.add( "192.168.11.141:27002" )
rs.add( "192.168.11.141:27003" )
rs.add( "192.168.11.141:27004" )
参考资料
- https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/
- https://docs.mongodb.com/manual/tutorial/reconfigure-replica-set-with-unavailable-members/
- https://smite.site/articles/2020/08/07/1596769396111.html