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

时间:2017-08-09 08:59:33

标签: mongodb pymongo replicaset mongodb-replica-set

使用最近的客户端库(pymongo 3.4,mongodb(nodejs)2.2.27),我无法通过复制连接到我的mongodb服务器。 replicaset配置包含服务器的内部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

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

[更新]注意:我正在尝试连接到服务器的外部ip,这在使用pymongo 2.8或mongodb(js)时工作正常2.1.4

[update]请按照此chat了解更多详情/示例

1 个答案:

答案 0 :(得分:0)

所有官方支持的MongoDB驱动程序(包括节点驱动程序)的更高版本遵循Server Discovery and Monitoring spec (SDAM)Monitoring要求所有驱动程序监视副本集中的所有节点(请参阅What's the point of periodic monitoring)。

此监视的原因是能够始终发现整个副本集的状态,并在当前主节点因任何原因脱机时重新连接到新的主节点。见{{3}}

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

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

  1. 使用驱动程序可访问的副本集配置的IP地址或主机名(推荐)。
  2. 连接到其中一个节点而不指定副本集,基本上将节点视为独立节点(不推荐)。
  3. 如果较旧的驱动程序可以毫无怨言地连接,那么驱动程序已经过时或者没有遵循正确的SDAM规范而不应该使用,因为它的行为无法保证。 MongoDB发布了SDAM规范,并强制要求所有驱动程序遵循它。

相关问题