mongod(v2.6.5)分片群集查询延迟问题?

时间:2015-04-15 03:40:45

标签: linux node.js mongodb amazon-ec2

我正在运行一个使用mongo分片群集的节点(0.10.26)应用程序。我使用三个成员副本集作为分片。以下是我的其他配置详情

硬件和操作系统设置

  1. EC2:m3.large(RAM:7.5G)
  2. Linux Ubuntu 12.04(内核:3.2.0-69-虚拟64位)
  3. 磁盘:400 G SSD(EBS)(安装了noatime,预读设置为32)
  4. 应用程序的加载模式

    1. 插入率= 20-30 /秒 大多数插入都是针对日志集合的,并且它们会发生 每时每刻。
    2. 查询率= 50-100 /秒
    3. updates = ~30 / second
    4. 蒙戈

      1. 存储引擎:默认(mmapv1)
      2. 索引大小:3.5G
      3. 工作集:270 MB
      4. 猫鼬版本:3.8.25
      5. Mongo版本:2.6.5
      6. 我的应用程序提供了一个界面,可以将日志记录下载为带有特定过滤器的csv文件。当我尝试csv下载时,应用程序变得非常慢。

        经过一番调查后,我得出结论,对日志的查询需要很长时间(> 2分钟,有时长达10分钟) 由于数据库响应缓慢,应用程序也很慢

        问题

        1. 为什么查询日志需要很长时间。

          如果我做一个explain(),我会看到它命中了索引。

          mongostat(以1秒延迟运行时)表示存在 发生了很多页面错误(~800-1100)/秒。这页纸 查询返回后,故障会消退。后续查询返回 在几秒钟内。

          工作集+索引大小= 3.7 G

          RAM = 7.5 G。

          日志集合的大小= 50 G

        2. 频繁写入日志集合是否会影响读取操作 在同一个集合上。这种担忧是否适用于我的工作量?

1 个答案:

答案 0 :(得分:0)

根据我的很多事情,我们需要在这里考虑解决问题。我不确定Mongo方面到底发生了什么,但是我会看到一些事情,

  1. 您说您允许用户为日志提供过滤器并创建它的csv然后下载。 在这种情况下, csv文件的平均大小是多少?
  2. ----如果它太大,那么我可能认为您正在使用游标来获取数据,然后将其写入可能是IO密集型的文件(页面错误可以证明这一点。)。除此之外,您还可以查看专为高效批量操作而设计的MongoExport和MongoDump选项。

    1. 你说你正在过滤记录,然后你正在使用什么过滤器?它是最佳的吗?你有正确的索引吗?
    2. ----检查过滤效率。虽然你说你正在使用索引而查询正在使用索引。还是可以添加更有效的新索引吗?如果是,请添加它。

      1. 将记录与过滤器匹配后,您是否正在获取该文档的所有属性(日志记录)?
      2. ----如果答案是肯定的,那么他们真的需要吗?如果答案为否,则尝试仅获取所需数据。避免不必要的处理

        1. 我能想到的另一种技巧是如何进行分片?
        2. ----对于日志,一般搜索过滤器(日期,错误等)是什么?在NoSQL Dbs中,首先要确定需求/查询/过滤器,然后再确定模式/集合等。如果你没有考虑那个,那么它是时候因为你的数据库大小很小。一旦它成长,你就不能在以后再做。

          希望这有帮助:)