使用 docker 在 MongoDB 中的副本集,当另一个成员添加到集合中时,主要有错误并停止成为主要成员



我有两个docker容器,每个容器运行一个mongo实例,它们是这样初始化的:

docker run --name mongodb-shard-1-node-1 -d -v mongodb-shard-1-node-1:/data/db -p 27031:27017 mongo --replSet rs0 --smallfiles --oplogSize 128 

当我docker inspect mongodb-shard-1-node-1时,它显示IP 172.17.0.2

docker run --name mongodb-shard-1-node-2 -d -v mongodb-shard-1-node-2:/data/db -p 27020:27017 mongo --replSet rs0 --smallfiles --oplogSize 128 

当我docker inspect mongodb-shard-1-node-2时,它显示IP 172.17.0.4

所以我继续使用 docker exec -it mongodb-shard-1-node-1 mongo 访问mongodb-shard-1-node-1,并将其初始化为主要成员,如下所示:

rs.initiate()
{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "ee3c41ef76b2:27017",
    "ok" : 1
}

然后我继续向该成员添加mongodb-shard-1-node-2,使其作为辅助成员工作,起初看起来它有效:

rs0:PRIMARY> rs.add("172.17.0.4:27017")
{ "ok" : 1 }
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2016-05-20T01:04:02.095Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "members" : [ervalMillis" : NumberLong(2000),
            {       "_id" : 0,
                    "name" : "ee3c41ef76b2:27017",
                    "state" : 1,,
                    "uptime" : 27,PRIMARY",
                    "optime""ts" : Timestamp(1463706237, 1),
                    },      "t" : NumberLong(1)
                    "infoMessage" : "could not find member to sync from",
                    "electionDate" : ISODate("2016-05-20T01:03:43Z"),
                    "self" : truen" : 2,
            {,
                    "name" : "172.17.0.4:27017",
                    "state" : 0,,
                    "uptime" : 4,"STARTUP",
                    "optime""ts" : Timestamp(0, 0),
                    },      "t" : NumberLong(-1)
                    "lastHeartbeat" : ISODate("2016-05-20T01:04:01.187Z"),
                    "pingMs" : NumberLong(0),Date("1970-01-01T00:00:00Z"),
            }       "configVersion" : -2
    "ok" : 1
}

但是由于某种原因它立即失败了,我不知道为什么,这就是我得到的:

rs0:PRIMARY> rs.status()
2016-05-20T01:04:18.007+0000 E QUERY    [thread1] Error: error doing query:
failed: network error while attempting to run command 'replSetGetStatus' on host '127.0.0.1:27017'  :
DB.prototype.runCommand@src/mongo/shell/db.js:135:1
DB.prototype.adminCommand@src/mongo/shell/db.js:153:16
rs.status@src/mongo/shell/utils.js:1090:12
@(shell):1:1
2016-05-20T01:04:18.012+0000 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2016-05-20T01:04:18.018+0000 I NETWORK  [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) ok
rs0:SECONDARY

怎么了?我该如何解决?

编辑:为了澄清,我已经通过执行文档的这一部分所说的操作来尝试容器之间的连接: 测试所有成员之间的连接

我的问题在这里得到了回答: https://dba.stackexchange.com/a/139145/91866

我将引用整个答案:

您的主服务器正在尝试将自身自动配置为ee3c41ef76b2:27017,然后解析为环回 ( 127.0.0.1 ),然后环回 ( ),然后容器没有按预期响应。根据第二个容器如何解析ee3c41ef76b2,尤其是它不解析为 172.17.0.2,它也可能无法与主容器通信。

假设您对连接是正确的(并且您已经验证了实例正在侦听 IP 而不仅仅是 loopbasck),那么您需要覆盖自动检测并在调用 rs.initiate() 时明确,如下所示:

rs.initiate(
    {
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "172.17.0.2:27017" },
         { _id: 1, host : "172.17.0.4:27017" }
      ]
    }
)

相关内容

最新更新