我可以通过以下方式设置mongodb副本集:
mongo --port 27020 < config.js
其中config.js
是javascript配置文件:
config = {
_id: "rsRunly",
members: [{
_id: 0,
host: "o502:27018"
}, {
_id: 1,
host: "o502:27019"
}, {
_id: 3,
host: "o502:27021"
}]
};
rs.initiate(config);
rs.status();
但不能内联:
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();';
收到错误:
2014-08-05T06:48:34.218-0400 SyntaxError: Unexpected identifier at (connect)
exception: connect failed
我尝试使用--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次。
那么如何启动不在config.js
文件中的副本集,而是使用bash命令?
答案 0 :(得分:2)
这里的问题是副本集.initiate()
没有“立即”启动副本集。每个成员检索配置并进入自己的启动阶段时会有延迟。
因此,您需要“等待”该集合进入就绪状态。最好的方法是定期测试rs.status()
响应:
mongo --port 30000 --eval'var config = {_ id:“rs0”,members:[{_ id:0,host:“localhost:30000”},{_ id:1,host:“localhost:30001 “},{_ id:3,host:”localhost:30002“}]}; rs.initiate(config); while(rs.status()。startupStatus ||(rs.status()。hasOwnProperty(“myState”)&amp;&amp; rs.status()。myState!= 1)){printjson(rs.status());睡眠(1000); }; printjson(rs.status());'
.startupStatus
字段将出现在响应中,直到达到合理的状态。所以基本上你否则循环。这就是它的工作原理,并在完成后返回完整状态。
副本集只有在有PRIMARY时才真正可用,但您可能还想检查该结构以确认其他成员的启动状态。
您应该查看此启动值,以便在编写脚本时检查错误。除非您已经执行了等待并检查所有进程是否正在运行,否则还要考虑连接错误。