Python 副本集组成更改时pymongo无法连接

Python 副本集组成更改时pymongo无法连接,python,mongodb,pymongo,Python,Mongodb,Pymongo,从mongoDB副本集中删除主机,但不更改使用该副本集传递给mongo_客户端(或MongoReplicaSetClient)的主机字符串,似乎会在重新启动服务时中断pymongo连接。提出的这一例外是: pymongo.errors.ServerSelectionTimeoutError:host4:27017:[Errno-2]名称或服务未知 问题可以归结为以下几点: hosts1 = "host1, host2, host3, host4" # where host1 and host2

从mongoDB副本集中删除主机,但不更改使用该副本集传递给mongo_客户端(或MongoReplicaSetClient)的主机字符串,似乎会在重新启动服务时中断pymongo连接。提出的这一例外是:

pymongo.errors.ServerSelectionTimeoutError:host4:27017:[Errno-2]名称或服务未知

问题可以归结为以下几点:

hosts1 = "host1, host2, host3, host4"  # where host1 and host2 are not available anymore
hosts2 = "host3, host4"  # only has valid hosts
hosts3 = ["host1", "host2", "host3", "host4"]  # expressed as a list

client = MongoClient(hosts1, 27017, replicaset="rs0")
db = client['admin']
db.authenticate('user', 'pass')
因此,该脚本将在hosts1上失败,但在host2和host3上工作,即

client = MongoClient(hosts2, 27017, replicaset="rs0")  # works
或:

这方面的问题是,在重新启动服务之前,这个问题不会变得明显,这可能会在副本集成员身份更改后很久发生

它与hosts2一起工作的事实表明所使用的主机字符串格式是有效的。那么,为什么在重新启动服务时第一个会失败呢?

答案可以在解析器中的pymongo connection split_hosts过程中找到

解析器不会忽略间距,即使URI规范(RFC2396)指定应该排除空格,并且空格可以用作delimeter(第2.3.4节)。主机名中包含空格会导致联网失败 错误

host2字符串工作的原因是列表中的第一个主机仍然有效,因为它不是以空格开头的,并且正确解析。其他两个都是错误的,但是pymongo驱动程序只需要一个就可以找到一个正常工作的主机,而 然后,它可以使用“查找所有其他对象”

因此,问题的答案是删除逗号后的空格

hosts1 = "host1,host2,host3,host4"
解决方法很简单,但是,这种情况下最大的问题是,在重新启动服务之前,问题不会变得明显,这可能会导致 副本集的成员身份更改后可能需要很长时间

hosts1 = "host1,host2,host3,host4"