mongodb副本集重新配置脚本

  |   0 评论   |   0 浏览

# 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"]); 
  }
};
  1. 重新配置副本集
    进入放置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目录下。

  1. 恢复失效节点
    在第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" )

参考资料



标题:mongodb副本集重新配置脚本
作者:SmiteLi
地址:https://smite.site/articles/2020/08/19/1597815859574.html