MongoDB:在单台机器上进行分片.是否有意义?

why*_*ous 8 sharding mongodb

在MongoDB中创建了一个由11446615个文档组成的集合.

每个文件都有以下形式:

{ 
 "_id" : ObjectId("4e03dec7c3c365f574820835"), 
 "httpReferer" : "http://www.somewebsite.pl/art.php?id=13321&b=1", 
 "words" : ["SEX", "DRUGS", "ROCKNROLL", "WHATEVER"],     
 "howMany" : 3 
}
Run Code Online (Sandbox Code Playgroud)

httpReferer:只是一个网址

单词:从上面的url解析的单词.列表的大小在15到90之间.

我打算使用这个数据库来获取具有类似内容的网页列表.

我将使用单词字段查询此集合,以便在此字段上创建(或者更确切地说,开始创建)索引:

db.my_coll.ensureIndex({words: 1})
Run Code Online (Sandbox Code Playgroud)

创建此集合需要很长时间.我尝试了两种方法(以下测试在我的笔记本电脑上进行):

  1. 插入和索引插入花费5.5小时主要是由于cpu密集的数据预处理.索引需要30个小时.
  2. 插入前编制索引将所有数据插入集合需要几天时间.

我主要关注它减少生成集合的时间.我不需要复制(至少现在).查询也不必是快速的.

现在,问题的时间:

我只有一台机器有一个磁盘我可以运行我的应用程序.运行多个数据库实例并在它们之间拆分数据是否有意义?

Ehe*_*Tov 16

是的,在单个服务器上进行分片确实有意义.

  1. 目前,MongoDB仍然使用每个mongodb服务器的全局锁.创建多个服务器将从彼此的锁中释放服务器.

  2. 如果您运行具有单独NUMA的多核计算机,这也可以提高性能.

  3. 如果您的服务器的负载增加太多,则初始分片可以在将来更轻松地进行水平扩展.你现在也可以这样做.

机器各不相同 我建议编写自己的批量插入基准程序并启动各种MongoDB服务器分片.我有一个16核RAIDed机器,我发现3-4分片似乎是我的重写数据库的理想选择.我发现我的两个NUMA是我的瓶颈.


tst*_*rzl 8

使用mongodb v3.0.x的现代(2015)中,使用mmap进行集合级锁定,这会略微提高写入吞吐量(假设您写入多个集合),但如果使用有线引擎,则会有文档级锁定,具有更高的写入吞吐量.这消除了在单个机器上进行分片的需要.虽然技术上仍然可以通过在单个机器上进行分片来提高mapReduce的性能,但在这种情况下,您最好只使用可以利用多个内核的聚合框架.如果您非常依赖map reduce算法,那么使用Hadoop之类的东西最有意义.

分割mongodb的唯一原因是水平缩放.因此,如果单个机器无法容纳足够的磁盘空间,内存或CPU功率(罕见),则分片将变得有益.我认为很少有人有足够的数据需要进行分片,即使是大型企业,特别是因为有线网提供了压缩支持,可以将磁盘使用量减少80%以上.很少有人使用mongodb来大规模地执行CPU密集查询,因为有更好的技术可以做到这一点.在大多数情况下,IO是性能中最重要的因素,没有多少查询是CPU密集型的,除非您运行了大量复杂的聚合,甚至在插入时索引了地理空间.

最有可能的原因是你需要进行分片,如果你有很多消耗大量内存的索引,那么有线网可以减少这种情况,但它仍然是最常见的分片原因.在一台机器上进行分片可能会导致不必要的开销,而很少或没有任何好处.