2015-04-15 43 views
0

我正在运行使用mongo分片群集的节点(0.10.26)应用程序。我正在使用三个副本集作为分片。这里是我的其他配置细节mongod(v2.6.5)分片群集查询延迟问题?

硬件和操作系统设置

  1. EC2:m3.large(RAM:7.5G)
  2. Linux操作系统Ubuntu 12.04(内核:3.2.0-69虚拟64位)
  3. 磁盘:400g的SSD(EBS)(安装有noatime的和的32预读设定)

应用的负载模式

  1. 插入率= 20-30 /秒 大多数刀片是日志收集和他们发生 所有的时间。
  2. 查询率= 50-100 /秒
  3. 更新=〜30 /第二

蒙戈

  1. 存储引擎:默认(mmapv1)
  2. 指数大小:3.5G
  3. 工作组:270 MB
  4. 猫鼬版本:3.8.25
  5. 蒙戈版本:2.6.5

我的应用程序提供下载日志记录为具有一定过滤CSV文件的接口。当我尝试csv下载时,应用程序变得非常慢。

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

问题

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

    如果我做了解释(),我看到它碰到了索引。

    mongostat(当以1秒的延迟运行时)表示有 有许多页面错误发生(〜800 - 1100)/秒。查询返回后页面 故障消退。随后的查询在几秒钟内返回 。

    工作集+索引大小= 3.7 G

    RAM = 7.5 G.

    大小日志收集= 50g的

  2. 是否频繁写入日志收集影响在同一采集读取操作 。这种担心是否适用于我的工作负荷?

+0

你拥有了一个非常详细的问题(我很高兴看到这从一个新的用户),但你可以保持平均每个职位有一个问题?在你的情况下,有4个。 –

回答

0

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

  1. 你说你允许用户提供日志过滤器并创建它的csv然后下载。 在这种情况下,csv文件的平均大小是多少?

----如果太大,则可能我认为你正在使用游标来获取数据,然后将其写入可以是IO密集型文件(页面错误可以证明)。代替这个,你可以检查MongoExport和MongoDump选项,这些选项是专为高效批量操作而设计的。

  1. 你说你正在过滤记录,然后你正在使用什么过滤器?这是最佳吗?你有正确的索引吗?

----检查过滤效率。虽然你说你正在使用索引,并且查询正在使用索引。仍然可以添加更高效的新索引吗?如果是,请添加它。

  1. 将记录与过滤器进行匹配后,您是否获取该文档的所有属性(日志记录)?

----如果答案是肯定的,那么他们真的需要吗?如果答案是否定的,则尝试仅获取所需的数据。避免不必要的处理。

  1. 我能想到的另一种技术是,如何完成分片?

----对于日志,什么是常规搜索过滤器(日期,错误等)?在NoSQL Dbs中,首先应确定需求/查询/过滤器,然后决定模式/集合等。如果您还没有考虑过,那么现在是因为您的数据库规模很小。一旦它增长,你不能以后再做。

希望这有助于:)

+0

感谢您的回复。 csv文件的平均大小为3-4 MB。 我认为这个指数是最佳的。 我没有获取所有的属性。目前我只有一个碎片。所以所有的数据都是一个碎片。 – samba01

+0

我认为基于你使用的日期或过滤器的分片应该有所帮助。也检查批量导出选项。您可以在导出期间通过过滤器。 –