我该如何配置Mongodb集群?

时间:2011-07-08 16:36:33

标签: mongodb sharding

我正在运行一个分片的mongodb环境 - 3个mongod分片,1个mongod配置,1个mongos(没有复制)。

我想使用mongoimport将csv数据导入数据库。我有超过210个csv文件,以500,000的增量存储了1.05亿条记录。我知道mongoimport是单线程的,我读到我应该运行多个mongoimport进程以获得更好的性能。但是,我试过了,并没有加快速度:

当并行运行3个mongoimports时,每个进程得到~6k插入/秒(所以18k i / s)与运行1 mongoimport相比,我得到~20k插入/秒。

由于这些进程是通过单个mongod配置和mongos路由的,我想知道这是否是由于我的群集配置。我的问题是,如果我以不同的方式设置我的群集配置,我会获得更好的mongoimport速度吗?我想要更多的mongos流程吗?我应该一次关闭多少个mongoimports进程?

2 个答案:

答案 0 :(得分:5)

所以,你需要做的第一件事是“预先拆分”你的块。

假设您已经对要导入的集合进行了分片。当您“从头开始”时,所有数据将开始转到单个节点。当该节点填满时,MongoDB将开始将该节点“拆分”为块。一旦它达到大约8个块(即大约8x64MB的索引空间),它将开始迁移块。

基本上,你有效地写入单个节点然后该节点正在减速,因为它必须将其数据读写到其他节点。

这就是为什么你没有看到3 mongoimport的任何加速。所有数据仍然是单个节点,并且您正在最大化该节点的吞吐量。

这里的技巧是“预分割”数据。在您的情况下,您可能需要进行设置,以便在每台计算机上获得大约70个文件的数据。然后,您可以在不同的线程上导入这些文件,并获得更好的吞吐量。

Craigslist的Jeremy Zawodny对此here进行了合理的记录。 MongoDB网站有一些文档here

答案 1 :(得分:1)

我发现了一些有助于批量加载的事情。

在您加载完所有内容之后,推迟构建索引(除了您需要在分片键上使用的索引)。

每个分片运行一个mongos和mongoimport,并行加载。

最大的改进:Presplit你的大块。这有点棘手,因为您需要确定需要多少块以及大致如何分配数据。拆分后,你必须等待经销商四处移动它们。