我们拥有数 GB 的大型数据集,可在其上运行非常复杂的查询,例如
{ $or: [ { id: 30000001, ... }, { id: 30000005, ... }, ..., { id: 30001005, ... } ] }
此时 CPU 实际上似乎是一个瓶颈,因此如果能够在同一组数据库文件上运行多个 mongod 实例将会很有利。
为此,我们考虑过使用副本集,但不希望仅仅因为 CPU 原因而需要额外的磁盘空间。
答案1
不,这是不可能的,目前您无法使用相同的文件运行多个实例 - 您需要的关键功能(管理哪个实例具有写入文件的能力)不存在。我认为这也不在功能请求列表中(我找不到它),考虑到我能想到的允许这样做的潜在问题数量,这似乎是一个长远的请求,但欢迎您要求它。
您列出的查询示例$or
(您建议使用更复杂的查询)将并行运行多个查询,从外观上看,您$or
通过在每个子句中列出多个查询,本质上就是嵌套了逻辑_id
。对于 中的每个子句$or
,即使使用覆盖索引查询,当该数组很大时,仍然会有大量索引扫描。
如果您没有使用覆盖索引(在您的解释中寻找 indexOnly true
),那么这也意味着大量的文档扫描,并且除非您的整个数据集都适合内存,否则这将意味着大量的页面错误。
由于您已经声明这是在您的系统上执行此操作的“唯一方法”(我认为架构审查也是一个好主意),那么目前,如果您在单个主机上遇到 CPU 问题,那么复制或分片是您进行水平扩展的两个选项。我还会确保 CPU 在用户空间中,而不是系统空间中(最简单的方法是安装彩信和munin 节点并跟踪用户(如果是专用系统则通常为 mongod)与系统 CPU 随时间的变化。
不过,在你这样做之前,请确保你正在运行 2.2 - 2.2 中的一个主要改进是转变到TCMaloc 的- 我不能确定,因为 malloc 问题在最好的情况下也很难诊断/定义,但如果您运行的是 2.0,TCMalloc 可能会在这里为您提供帮助。