带有rs.add()的MongoDB脚本未按预期执行

时间:2015-12-14 20:43:59

标签: mongodb docker replicaset

由于某种原因,这个非常基本的脚本没有按预期运行:

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 } } }

1 个答案:

答案 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'}]
   });