PyMongo随机丢弃与mongos的连接

时间:2014-07-25 14:53:04

标签: python mongodb pymongo zato

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

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

  • host1:mongos + Client aplication
  • host2:mongos + Client aplication
  • host3:mongos +客户端应用
  • host4:RS1_Primary(或RS1_Secondary)和RS2_Arbitrer
  • host5:RS1_Secondary(或RS1_Primary)
  • host6:RS2_Primary(或RS2_Secondary)和RS1_Arbitrer
  • host7:RS2_Secondary(或RS2_Primary)

此处的客户端应用程序是Zato Cluster,每个服务器中运行4个gunicorn worker,每个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_hosts在所有服务器中都是'host1:27017,host2:27017,host2:27017'

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

我的问题是:

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

然而,在一些随机点并且没有明显原因的情况下,在所有三个mongos中突然同时丢失了几个连接,然后连接总数不断变化,直到它在某些连接后再次稳定分钟(从5到10)。 虽然这种情况发生了,但即使我在MongoDB日志中看不到慢速查询(mongos和mongod都没有),平台的性能也会大幅降低。

我一直在隔离这个问题,并且已经尝试过:

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

所以,最后的问题是:

  • 有没有人见过类似的东西(在PyMongo中删除了连接)?
  • 我还可以查看调试问题的其他内容吗?
  • 可能的解决方案:MongoClient允许定义max_pool_size,但我找不到对min_pool_size的任何引用。有可能这样定义吗?也许将连接数量设为静态可以解决我的性能问题。

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

0 个答案:

没有答案