与rs.add()的MongoDB脚本不按预期执行

出于某种原因,这个非常基本的脚本不能按预期运行:

rs.initiate(); rs.add("ip-10-0-1-11"); rs.add("ip-10-0-1-12"); 

当我把它叫做(在mongod的一个新的旋转之后)像这样:

 docker exec mongodb mongo localhost:27017/test /script/path.js 

我只看到第二个主机的增加。

 rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2015-12-14T20:27:10.124Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : [ { "_id" : 0, "name" : "ip-10-0-1-10:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 45, "optime" : { "ts" : Timestamp(1450124790, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2015-12-14T20:26:30Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1450124789, 2), "electionDate" : ISODate("2015-12-14T20:26:29Z"), "configVersion" : 2, "self" : true }, { "_id" : 1, "name" : "ip-10-0-1-12:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 40, "optime" : { "ts" : Timestamp(1450124790, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2015-12-14T20:26:30Z"), "lastHeartbeat" : ISODate("2015-12-14T20:27:09.828Z"), "lastHeartbeatRecv" : ISODate("2015-12-14T20:27:06.827Z"), "pingMs" : NumberLong(0), "configVersion" : 2 } ], "ok" : 1 } 

但是,如果我跳回到cli手动添加缺less的主机 – 它没有任何问题。 另外 – 如果我只是再次运行脚本,第二个得到添加正常。

检查日志不会给我任何有用的信息。 我只是看到, ip-10-0-1-12主机被添加,并没有引用ip-10-0-1-11 。 我100%肯定,当我运行这些命令的时候,另一个mongod实例是可到达的。

我已经尝试了几种方法 – 即使如此:

 docker exec mongodb mongo localhost:27017/test --eval 'rs.initiate();rs.add("ip-10-0-1-11");rs.add("ip-10-0-1-12");' 

除了跳入cli和运行load("path/to/script.js")

任何帮助将非常感激。

编辑:

脚本运行时,这是一大堆日志。 上面的一切都是初始化信息,下面的一切都只是接受的连接:

 2015-12-14T20:26:29.759+0000 I COMMAND [conn1] initiate : no configuration specified. Using a default configuration for the set 2015-12-14T20:26:29.759+0000 I COMMAND [conn1] created this configuration for initiation : { _id: "rs0", version: 1, members: [ { _id: 0, host: "ip-10-0-1-10:27017" } ] } 2015-12-14T20:26:29.759+0000 I REPL [conn1] replSetInitiate admin command received from client 2015-12-14T20:26:29.759+0000 I REPL [conn1] replSetInitiate config object with 1 members parses ok 2015-12-14T20:26:29.759+0000 I REPL [conn1] ****** 2015-12-14T20:26:29.759+0000 I REPL [conn1] creating replication oplog of size: 990MB... 2015-12-14T20:26:29.765+0000 I STORAGE [conn1] Starting WiredTigerRecordStoreThread local.oplog.rs 2015-12-14T20:26:29.765+0000 I STORAGE [conn1] The size storer reports that the oplog contains 0 records totaling to 0 bytes 2015-12-14T20:26:29.765+0000 I STORAGE [conn1] Scanning the oplog to determine where to place markers for truncation 2015-12-14T20:26:29.784+0000 I REPL [conn1] ****** 2015-12-14T20:26:29.793+0000 I REPL [ReplicationExecutor] New replica set config in use: { _id: "rs0", version: 1, protocolVersion: 1, members: [ { _id: 0, host: "ip-10-0-1-10:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10, electionTimeoutMillis: 10000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } } 2015-12-14T20:26:29.793+0000 I REPL [ReplicationExecutor] This node is ip-10-0-1-10:27017 in the config 2015-12-14T20:26:29.793+0000 I REPL [ReplicationExecutor] transition to STARTUP2 2015-12-14T20:26:29.793+0000 I REPL [conn1] Starting replication applier threads 2015-12-14T20:26:29.794+0000 I REPL [ReplicationExecutor] transition to RECOVERING 2015-12-14T20:26:29.795+0000 I REPL [conn1] replSetReconfig admin command received from client 2015-12-14T20:26:29.795+0000 I REPL [ReplicationExecutor] transition to SECONDARY 2015-12-14T20:26:29.795+0000 I REPL [ReplicationExecutor] conducting a dry run election to see if we could be elected 2015-12-14T20:26:29.795+0000 I REPL [ReplicationExecutor] dry election run succeeded, running for election 2015-12-14T20:26:29.803+0000 I REPL [ReplicationExecutor] election succeeded, assuming primary role in term 1 2015-12-14T20:26:29.803+0000 I REPL [ReplicationExecutor] transition to PRIMARY 2015-12-14T20:26:29.804+0000 I REPL [conn1] replSetReconfig admin command received from client 2015-12-14T20:26:29.806+0000 I REPL [conn1] replSetReconfig config object with 2 members parses ok 2015-12-14T20:26:29.807+0000 I ASIO [NetworkInterfaceASIO-Replication-0] Successfully connected to ip-10-0-1-12:27017 2015-12-14T20:26:29.808+0000 I REPL [ReplicationExecutor] New replica set config in use: { _id: "rs0", version: 2, protocolVersion: 1, members: [ { _id: 0, host: "ip-10-0-1-10:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 1, host: "ip-10-0-1-12:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10, electionTimeoutMillis: 10000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } } 

rs.initiate()需要几秒钟的副本才能更改状态。 这可能会导致第一个rs.add()无法正常工作。 奇怪的是,我们没有得到这个错误消息。

为避免发生这种问题,您可以尝试使用单个命令启动和configuration副本集中的所有成员:

 rs.initiate( {_id:'rs0', members:[ { _id:1, host:'ip-10-0-1-10:27017'}, { _id:2, host:'ip-10-0-1-11:27017'}, { _id:3, host:'ip-10-0-1-12:27017'}] });