2015-12-14 62 views
2

出于某种原因,如预期这个非常基本的脚本不运行:MongoDB的脚本rs.add()不执行按预期

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并手动添加缺少的主机 - 它没有问题。另外 - 如果我只是再次运行脚本,第二个会像平常一样添加。

检查日志不会给我任何有用的信息。我只看到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 } } } 

回答

0

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

为了避免这个问题发生,您可以尝试启动和配置所有成员在副本中的一个命令设置:

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'}] 
    }); 
+0

这似乎这样的伎俩。谢谢! – sidsy