eval内联mongodb副本集配置

时间:2014-08-05 11:05:42

标签: mongodb mongo-shell

我可以通过以下方式设置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命令?

1 个答案:

答案 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时才真正可用,但您可能还想检查该结构以确认其他成员的启动状态。

您应该查看此启动值,以便在编写脚本时检查错误。除非您已经执行了等待并检查所有进程是否正在运行,否则还要考虑连接错误。