我们希望在我们的Mongo数据库上运行MapReduce,主要是为了能够提取指标。 但是,由于这些MR陷入了Mongo服务器(尤其是100%磁盘IO),导致了一些不良停机。 我们认为这是由于缺less索引。
是否有可能执行像这些低优先级的批处理过程,使它不会使数据库无法访问我们的实时应用程序?
没有办法让你正在运行的MR作业“很好” – 它们会产生等等,但是最后(特别是如果你的索引select不好的话),你会通过从RAM中驱逐它的工作集来影响主要的, IO争用等。因此,我肯定会build议优化您的索引,以尽可能避免。
就减轻负担而言,您可以在辅助服务器(而不是主服务器)上运行内存中的MR作业。 任何不需要输出到数据库的东西都可以以这种方式运行(无法在辅助中写出)。
如果这不是一种select,那么我所看到的其他方法包括将数据提供给专门用于运行MR作业的“分析”群集,而不改变生产数据库。 要保持第二个群集是最新的,可以采用多种方法,从文件系统快照和其他批处理types技术到使用mongooplog或自定义应用程序和可复制的游标进行复制。
你可以采取的另一个办法是分片,以增加你的初选能力。 如果你要走这条路,确保你的运行速度至less为2.2(2.2.2),对2.2版本的分片支持得到了很大的提高
正如亚当所说,在MongoDB上没有办法优先考虑工作。 我们遇到了昂贵的工作,导致其他查询变得非常缓慢相同的问题。 我们通过将需要由MR作业处理的数据复制到不同主机上的专用运算数据库来解决此问题。
除了在Adam提到的数据库之间复制数据的mongooplog和tailable cursor方法外,还可以通过javascript直接复制所需的数据(可能以增量方式)。 有关更多信息,请参阅此博客文章: MongoDB中的服务质量 。 你也可以使用mongodump和mongorestore mongodump 。