eval内联mongodb副本集配置
我可以通过以下方式设置mongodb副本集:eval内联mongodb副本集配置,mongodb,mongo-shell,Mongodb,Mongo Shell,我可以通过以下方式设置mongodb副本集: mongo --port 27020 < config.js 但无法在线执行: mongo --port 27020 < 'config = {_id: "rsRunly", members: [ {_id: 0, host: "o502:#27020"}, {_id: 1, host: "o502:27019"}, {_id: 3, host: "o502:27021"}]}; rs.initiate(config); rs.stat
mongo --port 27020 < config.js
但无法在线执行:
mongo --port 27020 < 'config = {_id: "rsRunly", members: [ {_id: 0, host: "o502:#27020"}, {_id: 1, host: "o502:27019"}, {_id: 3, host: "o502:27021"}]}; rs.initiate(config); rs.status();';
我尝试使用--eval
mongo --port 27020 --eval 'config = {_id: "rsRunly", members: [ {_id: 0, host: "o502:27020"}, {_id: 1, host: "o502:27019"}, {_id: 3, host: "o502:27021"}]}; rs.initiate(config); rs.status();'
它给了我输出:
MongoDB shell version: 2.6.3
connecting to: 127.0.0.1:27020/test
[object Object]
但复制集未创建
为什么我需要创建副本集配置内联?
因为我正在创建一个大的sh
文件,其中首先启动所有mongo节点,然后启动副本集。我在那里使用bash变量,比如$port1
,$port2
,$port3
,来保持bash代码的干燥。因此,如果我要使用config.js
而不是内联配置,我必须在sh
文件和config.js
文件中编辑端口号2次
因此如何使用bash命令而不是在
config.js
文件中启动副本集?您这里的问题是副本集.initiate()
不会“立即”启动副本集。每个成员检索配置并进入自己的启动阶段时都会有延迟
因此,您需要“等待”集合进入就绪状态。最好的方法是定期测试rs.status()
响应:
mongo——端口30000——eval’var config={{{u id:0,主机:“localhost:30000”},{{u id:1,主机:“localhost:30001”},{u id:3,主机:“localhost:30002”};rs.initiate(配置);而(rs.status().startupStatus | | |(rs.status().hasOwnProperty(“myState”)和&rs.status().myState!=1)){printjson(rs.status());sleep(1000);};printjson(rs.status());'
响应中将出现.startupStatus
字段,直到达到合理状态。所以基本上你可以循环。这就是它的工作原理,完成后将返回完整状态
副本集只有在存在主副本时才真正可用,但您可能还希望检查该结构以确认其他成员的启动状态
为了在编写脚本时检查错误,您应该查看此项的启动值。还要考虑连接错误,除非您实现了等待和检查所有进程正在运行。
mongo --port 27020 --eval 'config = {_id: "rsRunly", members: [ {_id: 0, host: "o502:27020"}, {_id: 1, host: "o502:27019"}, {_id: 3, host: "o502:27021"}]}; rs.initiate(config); rs.status();'
MongoDB shell version: 2.6.3
connecting to: 127.0.0.1:27020/test
[object Object]