1

我可以通过以下方式设置 mongodb 副本集:

mongo --port 27020 < config.js

config.jsjavascript配置文件在哪里:

    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中编辑端口号 2 次。shconfig.js

那么如何在config.js文件中而不是使用 bash 命令启动副本集呢?

4

1 回答 1

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, 主机: "localhost:30002" } ] }; rs.initiate(配置);而 (rs.status().startupStatus || (rs.status().hasOwnProperty("myState") && rs.status().myState != 1)) { printjson( rs.status() ); 睡眠(1000);}; printjson(rs.status());'

.startupStatus字段将出现在响应中,直到达到合理的状态。所以基本上你否则循环。这就是它的工作原理,完成后将返回完整状态。

并且副本集仅在存在 PRIMARY 时才真正可用,但您可能还想检查该结构以确认其他成员的启动状态。

您应该为此查看启动值,以便在编写脚本时检查错误。还要考虑连接错误,除非您以其他方式实现了等待并检查所有进程是否正在运行。

于 2014-08-08T05:33:11.683 回答