【发布时间】:2021-07-05 21:30:32
【问题描述】:
我有一个副本集部署,其中我的服务器位于内部网络上,并且它们在该网络上可见:
- mongodata0:27017
- mongodata1:27017
- mongodata2:27017
所有三台服务器在 Internet 上都是可见的(单个负载平衡器,NAT-ed 端口):
- mymongoserver.com:27017
- mymongoserver.com:27018
- mymongoserver.com:27019
现在考虑到这个设置,从内部网络连接很容易,连接字符串类似于“mongodata1:27017,mongodata2:27017,mongodata3:27017”。 但是,从互联网连接是不可能的,因为我需要使用 conn 字符串“mymongoserver.com:27017,mymongoserver.com:27018,mymongoserver.com:27019”,而 mongo 客户端给我一个错误,上面写着:
"FailedToSatisfyReadPreference: 找不到匹配读取的主机 首选项 { mode: "nearest" } 用于设置 myReplSet"
在我看来,Mongo 不喜欢其他成员看到的每个成员的 URI 与 mongo 客户端提供的 URI 不同的事实。 我总是可以单独连接到每个成员,但不能连接到整个副本集。
现在我可以将副本集成员配置为使用他们的外部 IP 互相查看,因此我可以通过 Internet 连接到副本集,但我将失去从内部网络连接的能力。 这看起来确实是一种非常常见的部署方案,人们可能会期望它有一个非常标准的解决方案(唯一奇怪的是 NAT-ed 端口,但我怀疑它有什么不同)。但是,很长一段时间以来,我一直在互联网上寻找解决方案或最佳实践,但毫无结果。
到目前为止,我想出的唯一解决方案是访问 SSL 隧道后面的服务器,这样我就可以将它们作为 mongodata0,... 并将 mongodata0、mongodata1 和 mongodata2 主机名绑定到我的 /etc/hosts 中的 localhost,但这感觉比较笨重,并且仍然需要内部网络中成员的端口不同。
任何帮助将不胜感激。
【问题讨论】:
标签: mongodb