我有两个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" }
]
}
)