mongodb分片如何工作?如何通过分片提高插入速度?

时间:2014-11-07 13:15:05

标签: performance mongodb insert sharding

我想测试MongoDB的插入速度。有4个分片,3个配置,4个mongos,chunksize 64M,当我插入100个双倍[100000]数据时,它可以自动分片,但插入速度没有提高。

(1) I create a database,create a collection "docs",and insert 100 double[100000],it takes 30S
(2) I drop the "docs",create a new collection "docs",enablesharding ,insert a {name:"hashed"},it takes 30S or more.

每个分片几乎都有相同的数据或块数,我已经改变了5MB,20MB,100MB,200MB,但是无法使速度降低3/4。

Sharding减少了每个分片处理的操作数,因此如何通过添加分片来缩短插入时间,提高插入速度?    或者我的测试数据有误,它太小而无法显示mongodb的性能?    我停止了Balancer(),sh.stopBalancer(),sh.status()

mongos> sh.status()
--- Sharding Status --- 
 sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("5450ed56eb3978383f81a863")
}
  shards:
    {  "_id" : "s1",  "host" : "192.168.137.101:27017" }
    {  "_id" : "s2",  "host" : "192.168.137.102:27018" }
    {  "_id" : "s3",  "host" : "192.168.137.103:27019" }
    {  "_id" : "s4",  "host" : "192.168.137.104:27020" }
  databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "liu",  "partitioned" : true,  "primary" : "s2" }
        liu.docs
            shard key: { "name" : "hashed" }
            chunks:
                s1  4
                s2  7
                s3  6
                s4  5
            too many chunks to print, use verbose if you want to force print
    {  "_id" : "test",  "partitioned" : false,  "primary" : "s1" }

每个分片都有数据,这意味着mongodb通过分片键均匀分布?但为什么插入速度不降低,有没有错?你有相同的情况还是成功减少了时间?

我使用多线程来成功减少时间。

2 个答案:

答案 0 :(得分:1)

这里有两种可能的情况:
1.插入在所有分片上均匀分布,在这种情况下读取以及写入性能将随着添加的每个分片线性改善。 mongos(路由器)的数量也可以增加 2.插入仅关注一个或一部分分片,在这种情况下,添加分片无助于提高性能。这可能表明shardKey具有较低的基数或随机因子。查看此链接:Choosing a Shard key

由于您没有给我们足够的数据(关于使用的shardKey和影响所有分片的插入),您需要推断出上述两种情况中的哪一种阻止了写性能的提高。

希望这有帮助。

答案 1 :(得分:-1)

您不能通过分片“显着”提高插入速度。如果要在跨副本集中几乎平均分配插入操作,则在插入期间要做出太多决策。实际上,通过分片,您可以在手中处理更多操作,而不是插入单个实例。

如果你想要一个真正的速度并且你可以负担得起一些稳定性,你最好的选择是转换写入确认并使用fire& forget insert。