是否可以在一组数据库文件上运行多个mongod实例?

例如,我们有大量的多字节数据集,在这些数据集上运行非常复杂的查询

{ $or: [ { id: 30000001, ... }, { id: 30000005, ... }, ..., { id: 30001005, ... } ] }

看起来CPU实际上是一个瓶颈,所以我可以在同一组数据库文件上运行多个mongod实例。

为此,我们考虑使用副本集,但是由于CPU原因,我们宁愿不要求额外的磁盘空间。

不,这是不可能的,你不能使用目前相同的文件运行多个实例 – 你需要的关键function(pipe理哪个实例能够写入文件)是不存在的。 我不认为这是function要求列表(我找不到),并考虑到我可以想到的一些潜在的问题,这样做可以做到这一点似乎是一个远射请求,但欢迎您提出要求 。

您列出的$or查询示例(并且您build议您有更复杂的示例)将并行运行多个查询,并通过它的外观实质上嵌套逻辑$or s,方法是在每个子句中列出多个_id 。 对$or中的每个子句进行多次扫描,即使是覆盖索引查询,当该数组很大时,索引查询依然会是索引的大量扫描。

如果你没有使用被覆盖的索引(在你的解释中只查找indexOnly),那么这将意味着很多文档扫描,除非你的整个数据集适合内存,这意味着很多页面错误。

既然您已经声明这是在您的系统上执行此操作的“唯一方法”(我认为架构审查也是一个好主意),那么当前,如果您遇到单个主机上的CPU问题,则复制或分片是你的两个select横向扩展。 我还要确保CPU处于用户所在的位置,而不是系统(最简单的方法是将MMS与munin-node一起安装,并跟踪用户(通常是mongod,如果是专用系统的话)与系统CPU随时间的变化。

但是,在你做这个之前,确保你在2.2上运行 – 2.2中的一个主要改进是切换到TCMalloc – 我不能确定,因为malloc问题很难在最好的时候诊断/定义,但是如果你正在运行2.0,TCMalloc可能会帮助你。