2015-12-14 64 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