当副本集组合更改时,pymongo无法连接

2024-05-02 20:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

从mongoDB副本集中删除主机,但不更改使用该副本集传递给mongo_客户端(或mongoreplicationclient)的主机字符串,似乎会在重新启动服务时中断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上运行,即

^{pr2}$

或者:

client = MongoClient(hosts3, 27017, replicaset="rs0")  # works

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

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


Tags: 字符串clientdb副本mongoclientpymongohost3host2
1条回答
网友
1楼 · 发布于 2024-05-02 20:22:47

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

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

host2字符串工作的原因是列表中的第一个主机仍然有效,因为它不是以空格开头的,并且能够正确解析。另外两个是错误的,但是pymongo驱动程序只需要一个就可以找到一个正常工作的主机 然后它就可以使用find-all-other。在

因此,问题的答案是去掉逗号后的空格。在

hosts1 = "host1,host2,host3,host4"

修复很简单,但是,这种情况下最大的问题是,在重新启动服务之前,问题不会变得明显,这可能会 在副本集的成员身份更改后很长时间。在

相关问题 更多 >