mongodb客户端库无法连接到副本集

njL*_*jLT 5 mongodb pymongo replicaset mongodb-replica-set

使用最新的客户端库(pymongo 3.4、mongodb (nodejs) 2.2.27),我在通过复制连接到我的 mongodb 服务器时遇到问题。复制集配置包含服务器的内部 ip 或主机名。我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

或者

pymongo.errors.ServerSelectionTimeoutError: 10.0.0.5:27017: timed out,10.0.0.6:27017: timed out,10.0.0.4:27017: timed out
Run Code Online (Sandbox Code Playgroud)

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

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

[更新] 关注此聊天以获取更多详细信息/示例

kev*_*adi 5

所有官方支持的 MongoDB 驱动程序(包括节点驱动程序)的更高版本都遵循服务器发现和监视规范 (SDAM),该规范要求所有驱动程序监视副本集中的所有节点(请参阅监视)。

进行此监视的原因是能够始终发现整个副本集的状态,并在当前主节点因任何原因离线时重新连接到新的主节点。请参阅定期监控的意义何在

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

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

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

如果较旧的驱动程序可以毫无投诉地进行连接,则该驱动程序可能非常过时,或者不遵循正确的 SDAM 规范,因此不应使用,因为无法保证其行为。MongoDB 发布了 SDAM 规范并强制所有驱动程序遵循它,这是有充分理由的。