我有一个 MongoDB 副本集,它有三个成员:主副本、辅助副本和隐藏辅助副本,仅用于备份。理想情况下,我想添加一个专门用于运行缓慢批处理操作的额外实例。这个想法是让这个实例运行可能需要很长时间才能完成的 map-reduce 样式操作,而不会减慢需要快速完成的常规查询的速度。
我不知道有哪种 Mongo 配置可以实现这一点。我很想听听如何处理繁重的离线请求而不影响短时间、近乎实时的请求的想法。
答案1
这不是配置问题。您的常规查询将发送到当前主节点。因此,您需要做的就是确保您的批处理操作(我假设是聚合和/或 mapReduce 作业)针对辅助节点运行。您可以通过设置读取偏好至secondary
或secondaryPreferred
。
但这带来了一些严重的缺点:
- mapReduce 作业无法始终以内联方式显示其结果,也无法保存。缓解此问题的一种方法是从应用程序端保存结果。
- 无论设置的读取首选项如何,具有阶段的聚合
$out
都将在主服务器上执行 - 根据您的写入关注设置,您的辅助数据库可能保存非最新数据。在某些情况下,这可能是一个问题。
如果使用读取首选项secondary
或secondaryPreferred
无法实现,则最小化长时间运行的操作(如我们的 mapReduce 作业中的聚合)负载的唯一方法是分片,将负载分散到多台机器上。请注意,为了实现这样的负载分配,需要仔细规划和数据建模。
答案2
由于您计划在新副本上执行慢速查询,因此您可能需要设置适合长时间运行的 map-reduce 查询的延迟时间,例如 3 分钟或 10 分钟。通过此延迟,您可以充分利用新副本的性能。它不会一次处理多个查询。
以下是文档:延迟副本集成员