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

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

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

我不知道有哪种 Mongo 配置可以实现这一点。我很想听听如何处理繁重的离线请求而不影响短时间、近乎实时的请求的想法。

答案1

这不是配置问题。您的常规查询将发送到当前主节点。因此,您需要做的就是确保您的批处理操作(我假设是聚合和/或 mapReduce 作业)针对辅助节点运行。您可以通过设置读取偏好secondarysecondaryPreferred

但这带来了一些严重的缺点:

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

如果使用读取首选项secondarysecondaryPreferred无法实现,则最小化长时间运行的操作(如我们的 mapReduce 作业中的聚合)负载的唯一方法是分片,将负载分散到多台机器上。请注意,为了实现这样的负载分配,需要仔细规划和数据建模。

答案2

由于您计划在新副本上执行慢速查询,因此您可能需要设置适合长时间运行的 map-reduce 查询的延迟时间,例如 3 分钟或 10 分钟。通过此延迟,您可以充分利用新副本的性能。它不会一次处理多个查询。

以下是文档:延迟副本集成员

相关内容