2017-08-09 168 views
0

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

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

[更新]按照此chat更多细节工作得很好/ examples

+0

'10.x.x.x'是一个“专用IP范围”。我认为你的副本集成员实际上不在你的本地网络上,这将解释超时错误。看起来你需要使用公共地址或类似于SSH隧道 –

+0

的公共地址,以便通过旧版本的库工作连接。我正在连接到外部IP,例如'mongodb://13.85.**.***:27017 /',但新库尝试连接到rsconfig中指定的主机而不是指定的ips。 – njLT

+0

这是设计。除非您的“客户端应用程序”和“副本集成员”实际上能够位于同一网络上(至少在路由规则方面),否则外部地址对于节点之间的配置是必需的。这一直是这种情况。您在“客户端连接”中指定的仅仅是**种子列表**。没有指定不同的内部和外部使用的东西。从来没有过。 –

回答

0

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

此监控的原因是能够随时发现整个副本集的状态,并在当前主要因任何原因而离线时重新连接到新的主要副本。请参阅What's the point of periodic monitoring

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

有一对夫妇的方式来解决这个问题:

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

如果较旧的驱动程序可以无需连接进行连接,那么驱动程序已经过时或者没有遵循正确的SDAM规范,因此不能保证其行为。 MongoDB发布了SDAM规范,并要求所有驱动程序遵循它的原因很充分。

+0

我在rsconfig中使用公共ip进行新部署。是否可以让服务器使用内部IP与自己进行通信?更新/ etc/hosts适用于主机名称,但我必须购买域名,对吧? – njLT

+0

我不确定我明白。如果每台服务器都有公用和专用IP,则应使用哪个IP,因为这两个IP都指向同一台服务器。您可以做的另一件事是将应用程序放在专用网络的内部(以便它可以使用专用IP连接到副本集),并通过面向公众的API从外部使用公共IP访问应用程序。缺点是你必须设计API,但这会更安全,因为你的数据库无法从互联网上访问。 –