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