我们希望在实时 Mongo 数据库上运行 MapReduce,主要是为了提取指标。但是,由于这些 MR 拖慢了 Mongo 服务器(尤其是 100% 磁盘 IO),我们遇到了一些严重的中断。我们认为这是由于缺少索引造成的。
是否可以以低优先级执行此类批处理,以免导致我们的实时应用程序无法访问数据库?
答案1
没有办法“优化”您正在运行的 MR 作业 - 它们会产生收益等等,但最终(特别是如果您选择的索引不当)您将通过从 RAM 中逐出其工作集来影响主服务器,从而导致磁盘 IO 争用等。因此,我绝对建议优化您的索引以尽可能避免这种情况。
在减轻负担方面,您可以在辅助服务器上而不是主服务器上运行内存 MR 作业。任何不需要输出到数据库的操作都可以通过这种方式运行(无法在辅助服务器上写出)。
如果这不是一个选择,那么我见过的其他方法包括将数据提供给专门用于运行 MR 作业的“分析”集群,同时保持生产数据库不变。有多种方法可以保持第二个集群的最新状态,从文件系统快照和其他批处理类型技术到使用蒙哥马利或自定义应用程序和可尾随游标复制。
另一种方法是分片以增加主节点的容量。如果您要这样做,请确保您至少运行 2.2 版(撰写本文时为 2.2.2),2.2 版对分片 MR 的支持已得到极大改进
答案2
正如 Adam 所说,在 mongodb 上无法运行优先级较低的作业。我们遇到了同样的问题,昂贵的作业导致其他查询变得非常慢。我们通过将需要由 MR 作业处理的数据复制到不同主机上的专用处理数据库来解决此问题。
除了 Adam 提到的在数据库之间复制数据的 mongooplog 和 tailable cursor 方法之外,您还可以直接通过 javascript 执行此操作,以仅复制所需的数据(可能以增量方式)。有关更多信息,请参阅此博客文章:MongoDB 中的服务质量. 您可能还想使用 mongodump 和 mongorestoremongodump。