1.replset内部都能ping通,单独访问或者连接任意一个repeset都没问题
2.pymongo和mongoose都测试过,无法访问到
3.一旦添加副本集参数replicaSet就会报错,无法连接server
4.members配置如下:
求大神解答
1.replset内部都能ping通,单独访问或者连接任意一个repeset都没问题
2.pymongo和mongoose都测试过,无法访问到
3.一旦添加副本集参数replicaSet就会报错,无法连接server
4.members配置如下:
求大神解答
10 回答11.3k 阅读
7 回答5.4k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
首先要理解pymongo或者mongoose这样的驱动连接MongoDB的过程中会发生什么。其实驱动在你眼皮底下做了很多事情来达到高可用,负载均衡等等。为了实现这些功能,驱动连接的并不仅仅是你指定的那一个节点,甚至也不是用你提供的IP地址来连接。而是用你提供的IP和端口连接到复制集,然后查询集群中一共有多少节点,各自的状态是什么,再对所有结点建立连接。当你的集群发生变动,新增了节点或者减少了节点,驱动也是会探测到的。
这些功能要求,驱动实际连接的是复制集中配置的节点IP和端口,以你的例子来说,实际上是在连:
看上去这些hostname是无法解析的,所以你也就无法访问了。
这不是一个容器特有的问题,普通复制集也是同样的原理,但是这里加上容器把事情变得更复杂。因为普通复制集只要能解析上面的hostname就可以了,而如果你把应用放在宿主机上,是不可能访问到容器内部的IP的。所以,你的应用也必须在容器中,并且要能解析上面这些hostname。