【问题标题】:Is there any multicore exploiting NoSQL system?是否有任何多核利用 NoSQL 系统?
【发布时间】:2010-10-03 00:57:34
【问题描述】:

我从昨天开始就在玩 MongoDB,并且非常喜欢它。我正在尝试导入大量数据(20 亿行)并将其编入索引,但它似乎没有使用我的系统具有的 8 个内核,并且导入以正常速率(60000 条记录/秒)进行。我只能想象索引这个集合中的两列可能需要多长时间。是否有任何 MondoDB 类型的数据库利用 CPU 的多核特性?

【问题讨论】:

  • 我认为你不能一次有效地处理来自多个核心的数据插入。
  • @zneak:我实际上是在考虑将数据插入到多个集合(表)中。只是我不确定以这种方式分开是否有益。我的意思是,我不会在大表上添加索引,而是创建许多小表,然后在每个小表上创建索引。然后从前端,我将查询所有表以获取所需的值。您对这种方法有什么建议吗?
  • 我不是 NoSQL 专家。我所知道的是,您不能安全地修改来自多个线程的数据而不锁定它,因此我的评论。 :/对不起,我无能为力。 (不过,我也知道您应该填充集合,然后创建索引。否则,您会浪费大量时间在每次插入时重新索引数据。)
  • @zneak:是的。谢谢你的指点。我没有索引它。我让它运行,现在它完成了插入大约 15 亿个 :) 虽然不确定构建索引需要多长时间......再次感谢您的帮助。

标签: mongodb database nosql


【解决方案1】:

如果 MongoDB 有一个致命弱点,那就是它只支持单线程写入和单线程 map-reduce。

与往常一样,这里需要权衡取舍。单线程写入是避免锁定问题和最小化开销的最简单方法。同样,多线程 map-reduce 是锁定数据的好方法。因此,生产系统上的单线程 map-reduce 可能更容易、更安全。

但是,您并非没有工具。 MongoDB 将为每个实例提供一个写入线程。因此,如果您对 MongoDB 进行分片,那么您将为每个分片获得一个写入线程。

如果您想在 20 亿行上使用多个索引,那么无论如何您都需要考虑分片。这里有一些快速的数学运算:MongoID 是 12 个字节。 MongoID 上的索引将为 2B * 12 字节 = 22GB+。如果您现在想再添加两个索引(即使只是两个 4 字节整数),我们所说的每个索引都是 7.5GB。

因此,在 2B 行中,您所说的索引超过 37GB(最少)。在大多数 8 核服务器上,这意味着您甚至无法将索引保存在内存中,更不用说任何数据了。

因此,如果您想在这里获得出色的性能,则需要开始研究分片。只是根据一般数字。 FWIW,MySQL 将不再擅长处理 2B 文档。有了这么多数据,您真的需要多台服务器来跟上负载。

【讨论】:

  • 我想分片是这次唯一的方法。谢谢你的建议。我在 MySQL 和 MongoDB 中都建立了索引。将使用先完成的那个:) 也是一个很好的基准测试......
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2014-03-10
  • 1970-01-01
相关资源
最近更新 更多