1

我发现了一个教程建立一个mongo replica set using docker,我的命令是蒙戈副本集找不到主

创建网络集群

sudo docker network create curator-cluster 

创建一个名为mongo1特定容器,地图27018至27017内并设置名称为rs0

sudo docker run \ 
-p 27018:27017 \ 
--name mongo1 \ 
--net curator-cluster \ 
mongo mongod --replSet rs0 

我的配置,

config = { 
"_id" : "rs0", 
"members" : [{"_id" : 0, "host" : "mongo1:27017"}, 
{"_id" : 1, "host" : "mongo2:27017"}, 
{"_id" : 2, "host" : "mongo3:27017"}] 
} 

最后,我在3个容器

5949826d5bb1  mongo      "/entrypoint.sh mongo" 22 hours ago  Up 22 hours   0.0.0.0:27020->27017/tcp mongo3 
dcf37866dbb6  mongo      "/entrypoint.sh mongo" 22 hours ago  Up 22 hours   0.0.0.0:27019->27017/tcp mongo2 
14202f76089f  mongo      "/entrypoint.sh mongo" 22 hours ago  Up 22 hours   0.0.0.0:27018->27017/tcp mongo1 

sudo docker exec -it mongo1 mongo结果是

MongoDB shell version: 3.2.9 
connecting to: test 
Server has startup warnings: 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2016-09-22T10:24:29.655+0000 I CONTROL [initandlisten] 
rs0:PRIMARY> 

看起来像我有一个主现在,并试图在容器上插入出头(比如说mongo1) ,MongoDB可以很好地同步。

现在我试图用命令连接到集上bryan数据库(注10.145.168.151是我的IP)

mongo --host rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 bryan 

我的结果是

MongoDB shell version: 2.6.9 
connecting to: rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020/bryan 
2016-09-23T16:46:18.819+0800 starting new replica set monitor for replica set rs0 with seeds 10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 
2016-09-23T16:46:18.819+0800 [ReplicaSetMonitorWatcher] starting 
2016-09-23T16:46:18.819+0800 changing hosts to rs0/mongo1:27017,mongo2:27017,mongo3:27017 from rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 
2016-09-23T16:46:18.820+0800 getaddrinfo("mongo2") failed: Name or service not known 
2016-09-23T16:46:18.821+0800 getaddrinfo("mongo1") failed: Name or service not known 
2016-09-23T16:46:18.822+0800 getaddrinfo("mongo3") failed: Name or service not known 
2016-09-23T16:46:18.822+0800 Error: connect failed to replica set rs0/10.145.168.151:27018,10.145.168.151:27019,10.145.168.151:27020 at src/mongo/shell/mongo.js:148 
exception: connect failed 

如果我使用的NodeJS(猫鼬),我得到MongoError: no primary found in replicaset

我认为问题是getaddrinfo("mongo2") failed: Name or service not known所以我的问题是如何解决这个问题。谢谢

+0

你检查了教程中的第一条评论吗? “...因为它无法解析主机上的主机名mongo1-3,所以失败。”解决方案也是详细的,它对你有用吗?我指的是这个网站:http://www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/ – alexbt

+0

谢谢,我错过了这个评论 – Bryan

回答

2

对不起,对于最近的回复,但我遇到了这个问题与不同的vnets和缺少主机名。如果我使用ips连接,那么我的印象是这样,然后集群会使用ips来响应。我错了。即使您使用ips连接,主机名也必须可用。

但是,如果你愿意,你可以改变从主机名到IPS的实现(这是因为虽然所有客户端)

1)连接到蒙戈CLI

2)cfg = rs.conf()

你会看到cfg.members[0].host作为"hostname:27017"

3)每个条目做cfg.members[i].host = "ip(i):27017"

例如:cfg.members[0].host = "10.0.0.1:27017"

4)rs.reconfig(cfg) 你应该得到的回应: { "ok" : 1 }

现在你应该能够连接。这有一些注意事项,所以一定要考虑后果(如果更改等)

+0

谢谢。这有帮助。 – Neil