eval内联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

我可以通过以下方式设置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.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]