【问题标题】:mongodb client libraries fail to connect to replica setmongodb 客户端库无法连接到副本集
【发布时间】:2017-08-09 08:59:32
【问题描述】:

使用最近的客户端库(pymongo 3.4、mongodb (nodejs) 2.2.27),我无法通过复制连接到我的 mongodb 服务器。 副本集配置包含服务器的内部 ips 或主机名。我收到以下错误:

pymongo.errors.ServerSelectionTimeoutError: mongodbdriver20151129-arbiter-1:27017: [Errno 8] nodename nor servname provided, or not known,mongodbdriver20151129-instance-1:27017: [Errno 8] nodename nor servname provided, or not known,mongodbdriver20151129-instance-2:27017: [Errno 8] nodename nor servname provided, or not known

pymongo.errors.ServerSelectionTimeoutError: 10.0.0.5:27017: timed out,10.0.0.6:27017: timed out,10.0.0.4:27017: timed out

我目前正在通过更改副本集配置以包含服务器的外部 ips 来解决它,但我想这会减慢服务器间的通信。如何使用原始 rsconf 从外部位置连接到我的服务器?

[update] 注意:我正在尝试连接到服务器的外部 ip,并且在使用 pymongo 2.8 或 mongodb (js) 2.1.4 时效果很好

[更新] 关注chat 了解更多详情/示例

【问题讨论】:

  • 10.x.x.x 是“私有 IP 范围”。我认为您的副本集成员实际上不在您的本地网络上,这可以解释超时错误。看起来你要么需要公共地址,要么需要类似于 SSH 隧道的东西
  • 对于相同的副本配置,通过旧版本的库工作连接。我正在连接到外部 ip,例如 mongodb://13.85.**.***:27017/,但新库然后尝试连接到 rsconfig 中指定的主机,而不是指定的 ips。
  • 这是设计使然。除非您的“客户端应用程序”和“副本集成员”实际上都能够在同一个网络上(至少在路由规则方面),否则节点之间的配置需要外部地址。情况一直如此。您在“客户端连接”中指定的只是一个种子列表。没有指定不同的内部和外部用法这样的事情。从来没有。
  • 那么为什么我在为同一个副本集使用旧版本(客户端库)时没有收到错误?
  • 那么这个例子在哪里呢?要么举一个例子,否则就承认你错了。这里没有任何证据表明情况会如此,我所知道的所有文档都不是这样。

标签: mongodb pymongo replicaset mongodb-replica-set


【解决方案1】:

所有官方支持的 MongoDB 驱动程序(包括节点驱动程序)的最新版本都遵循Server Discovery and Monitoring spec (SDAM),它要求所有驱动程序监视副本集中的所有节点(请参阅Monitoring)。

这种监控的原因是能够随时发现整个副本集的状态,并在当前主节点因任何原因离线时重新连接到新主节点。见What's the point of periodic monitoring

为了能够监控副本集中的所有节点,驱动程序必须有权访问每个副本集成员。由于您的副本集是使用驱动程序无法访问的内部 IP 定义的,因此驱动程序无法连接到它们。这就是您看到错误的原因。

有几种方法可以解决这个问题:

  1. 使用驱动程序可访问的副本集配置的 IP 地址或主机名(推荐)。
  2. 在不指定副本集的情况下连接到其中一个节点,本质上将该节点视为独立节点(不推荐)。

如果较旧的驱动程序可以毫无问题地连接,则说明驱动程序非常过时或不符合正确的 SDAM 规范,不应使用,因为无法保证其行为。 MongoDB 发布 SDAM 规范并强制所有驱动程序遵循它是有充分理由的。

【讨论】:

  • 我在 rsconfig 中使用公共 ip 进行新部署。是否仍然可以让服务器使用内部 IP 与自己通信?更新 /etc/hosts 适用于主机名,但我必须购买一个域,对吧?
  • 我不确定我是否理解。如果每个服务器都有一个公共和私有 IP,那么您使用哪个 IP 并不重要,因为它们都指向同一个服务器。您可以做的另一件事是将应用程序放入专用网络(以便它可以使用专用 IP 连接到副本集)并通过面向公众的 API 从外部使用公共 IP 访问应用程序。缺点是您必须设计 API,但这会更安全,因为您的数据库无法从 Internet 访问。
猜你喜欢
  • 2013-05-25
  • 2020-12-11
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多