Mongodb:处理离线查询而不影响常规查询

我有一个MongoDB副本集有三个成员:主要,次要和隐藏的辅助,仅用于备份。 理想情况下,我想添加专门用于运行缓慢批量操作的附加实例。 这个想法是让这个实例运行map-reduce风格的操作,这可能需要很长时间才能完成,而不会减慢快速完成所需的常规查询。

我不知道可以实现这一点的Mongoconfiguration。 我很乐意听到如何处理繁重的离线请求,而不会影响短时间,接近实时的请求。

这不是configuration的问题。 您正常的查询被发送到当前的主要。 所以你所要做的就是确保你的批量操作(我假设聚合和/或mapReduce作业)是针对辅助操作运行的。 您可以通过将readPreference设置为secondarysecondaryPreferred来完成此操作。

但是这带来一些严重的缺点,

  1. mapReduce作业不能总是显示他们的结果内联,他们不能被保存。 缓解这个问题的一个方法是从应用程序端保存结果。
  2. 无论设置的读取首选项如何,具有$out阶段的聚合都将在主服务器上执行
  3. 根据您的写入问题设置,您的辅助程序可能保存的数据不是最新的。 在某些情况下这可能是一个问题。

如果使用secondarysecondaryPreferred读取优先选项,这是不可能的,唯一的办法是尽量减less长时间运行的操作(如聚合)我们的mapReduce作业的负载是分片,分裂在多台机器上的负载。 请注意,为了实现这样的负载分配,需要仔细的计划和数据build模。

由于您计划在新副本上执行缓慢的查询。 您可能需要为长时间运行的map-reduce查询设置适当的延迟时间。 如3分钟或10分钟。 通过这个延迟,你可以从你的新副本中获得完整的性能。 它不会一次处理多个查询。

这里是文档: 延迟副本集成员