我想测试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通过分片键均匀分布?但为什么插入速度不降低,有没有错?你有相同的情况还是成功减少了时间?
我使用多线程来成功减少时间。
答案 0 :(得分:1)
这里有两种可能的情况:
1.插入在所有分片上均匀分布,在这种情况下读取以及写入性能将随着添加的每个分片线性改善。 mongos(路由器)的数量也可以增加
2.插入仅关注一个或一部分分片,在这种情况下,添加分片无助于提高性能。这可能表明shardKey具有较低的基数或随机因子。查看此链接:Choosing a Shard key
由于您没有给我们足够的数据(关于使用的shardKey和影响所有分片的插入),您需要推断出上述两种情况中的哪一种阻止了写性能的提高。
希望这有帮助。
答案 1 :(得分:-1)
您不能通过分片“显着”提高插入速度。如果要在跨副本集中几乎平均分配插入操作,则在插入期间要做出太多决策。实际上,通过分片,您可以在手中处理更多操作,而不是插入单个实例。
如果你想要一个真正的速度并且你可以负担得起一些稳定性,你最好的选择是转换写入确认并使用fire& forget insert。