【问题标题】:MongoDB: Replica set where servers communicate on internal networkMongoDB:服务器在内部网络上通信的副本集
【发布时间】: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


【解决方案1】:

设置水平分割 DNS。使用可从外部主机访问的主机名,但节点本身使用内部 IP 解析它们。

使用 hosts 文件最容易做到这一点,但您也可以运行本地 DNS 服务器。

【讨论】:

  • Split Horizo​​n DNS 听起来像是解决方案,虽然听起来有点老套。我找到了this part of the mongo spec,上面写着“副本集成员必须可以通过副本集配置中列出的主机名从客户端访问。”。这基本上意味着 DNS 恶作剧是实现这种跨网络副本集连接的唯一方法。
【解决方案2】:

我不是网络专家,但我认为有可用的解决方案。

从申请的角度来看,我有两个建议。

  1. 连接到单个主机,例如mymongoserver.com:27017。这可能是 PRIMARY 成员或 SECONDARY。然后open a new connection到副本集:

    db = Mongo("mongodb://user/password@mongodata1:27017,mongodata2:27017,mongodata3:27017/replicaSet=replSet&authSource=admin").getDB("admin")
    

    但是,您的客户端驱动程序可能不支持Mongo() 方法。

  2. 部署Sharded Cluster。让 mongos 主机可以从 Internet 访问,或者更好地设置 2 个 mongos 主机,一个是内部的,一个是公共的。

【讨论】:

  • 对分片集群的经验有限,我想知道在使用 mongos 路由器时是否存在同样的问题。如果路由器实际上充当“具有好处的反向代理”,那么我可以很高兴地让我的 mongo 实例在外部不可见,因为 mongos 将处理和路由所有连接。但是,如果路由器只是握手设备,然后将您的连接委托给适当的 mongod 实例,那么您仍然需要从外部查看那些与内部网络具有相同名称的 mongod 实例。你知道 mongos 的情况吗?
  • mongos 配置有sharding.configDB - 你需要在那里放置配置服务器的内部主机名。它必须充当“有好处的反向代理”,因为如文档中所示,您可以选择使用 ClientSideFieldLevelEncryptionOptions,因此它不能只是一个握手设备。
  • 考虑一个本地分片集群,不需要从本地 PC 到 Config 或 Shard 服务器打开防火墙。您所需要的只是连接到 mongos 主机。 Traffic to and from mongos Instances mongos 实例为分片集群提供查询路由。客户端连接到 mongos 实例,从客户端的角度来看,这些实例的行为类似于 mongod 实例。反过来,mongos 连接到作为分片集群组件的所有 mongod 实例。 所以,应该可以工作。
  • 从我读到现在的内容,我倾向于同意这应该可行。这是一个有用的,也许更优雅的解决方案,即使它没有回答最初的问题。
  • mongoses 不会公布自己的地址,并且驱动程序不会像连接到 RS 节点那样连接到内部 mongos 地址。一个分片集群可以在不同的网络上拥有 mongoses。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多