PyMongo随机断开与mongos的连接

2024-06-02 08:20:23 发布

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

我有一个MongoDB集群(2.6.3),有三个mongos进程和两个副本集,没有启用分片。在

特别是我有7台主机(都是Ubuntu Server 14.04):

  • 主机1:mongos+客户端应用
  • 主机2:mongos+客户端应用
  • 主机3:mongos+客户端应用
  • 主机4:RS1_主(或RS1_辅助)和RS2_仲裁器
  • 主机5:RS1_辅助(或RS1_主要)
  • 主机6:RS2_主(或RS2_辅助)和RS1_仲裁器
  • 主机7:RS2_辅助(或RS2_主要)

这里的客户机应用程序是一个Zato Cluster,每个服务器上运行4个gunicorn worker,每个服务器使用两个PyMongo.MongoClient实例访问MongoDB。 这些MongoClient对象的创建如下:

MongoClient(mongo_hosts, read_preference=ReadPreference.SECONDARY_PREFERRED, w=0, max_pool_size=25)
MongoClient(mongo_hosts, read_preference=ReadPreference.SECONDARY_PREFERRED, w=0, max_pool_size=10)

其中mongo\u主机是:'host1:27017,host2:27017,host2:27017'在所有服务器中。在

因此,我总共有12个MongoClient个实例,max_pool_size=25(每个服务器有4个),其他12个实例有max_pool_size=10(每个服务器也有4个)

我的问题是:

当Zato集群启动并开始接收请求(每个最多10 rq/s,使用简单的循环法进行平衡),就会创建一组新的连接,然后在每个mongos中保持大约15-20个永久打开。在

然而,在某个随机点,在没有明显原因的情况下,三个mongos中的几个连接突然同时断开,然后连接总数随机变化,直到几分钟后(从5到10)再次稳定下来。 尽管发生了这种情况,尽管我在MongoDB日志中没有看到慢查询(无论是在mongos还是在mongod中),平台的性能都会严重降低。在

我一直在隔离问题,并已尝试:

  • 将每个MongoClient中的连接字符串更改为'localhost:27017',以查看问题是否仅出现在其中一个客户端中。这个问题一直存在,并且它同时影响着这三个mongos,因此它看起来像是服务器端的东西。在
  • 添加日志跟踪以确保MongoClient内部的性能丢失。结果是在MongoClient中运行一个简单的find查询在客户端运行的时间显然超过1秒,而通常不到10ms,但是正如我之前所说的,在MongoDB日志中我看不到任何慢查询(默认的分析级别是100ms)。在
  • 监视平台活动,查看发生这种情况时是否会增加负载。没有,甚至可以在低负荷期发生。在
  • 监视服务器中的其他变量,例如cpu使用率或磁盘活动。我没有发现任何可疑的东西。在

最后的问题是:

  • 有没有人见过类似的情况(PyMongo的连接被中断)?在
  • 我还能看看这个问题吗?在
  • 可能的解决方案:MongoClient允许max_pool_size的定义,但我没有找到对min_pool_size的任何引用。有可能这样定义吗?也许将连接数设为静态可以解决我的性能问题。在

关于MongoDB版本的注意事项:我目前运行的是MongoDB 2.6.3,但是在从2.6.1升级之前就已经遇到了这个问题,所以在上一个版本中并没有介绍这个问题。在


Tags: 实例服务器客户端sizemongomongodb情况集群