# 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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于