由于某种原因,这个非常基本的脚本没有按预期运行:
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 :(得分: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'}]
});