【发布时间】:2014-11-06 03:53:29
【问题描述】:
我有一个带有 2 个分片(比如说 A 和 B)的 mongodb 分片,每个分片有 17GB 可用空间。我将包含对象 ID 的 _id 设置为分片键。
以下是用于设置 db 和 collection 的命令。
sh.enableSharding("testShard");
sh.shardCollection("testShard.shardedCollection", {_id:1});
然后我尝试向 mongos 服务器发起 4,000,000 个插入查询。我执行脚本低于 4 次。
for(var i=0; i<1000000; i++){
db.shardedCollection.insert({x:i});
}
使用 _id 作为分片键,据我了解,上述 4000000 个文档将适合 1 个分片,所有插入将仅发生在 A 分片中。
然而,结果并不像我预期的那样,在 A 分片中插入了约 130 万份文档,在 B 分片中插入了另外约 270 万份文档。
为什么会这样? shard coll 设置命令中是否缺少某些内容?还是我的理解有误,可能mongodb中有default range shard key之类的东西?
如果有人可以分享默认范围分片键的行为(不知道标签),那将非常有帮助。
下面是 sh.status() 结果
shard key: { "_id" : 1 }
chunks:
B 5
A 5
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("540c703398c7efdea6037cbc") } on : B Timestamp(6, 0)
{ "_id" : ObjectId("540c703398c7efdea6037cbc") } -->> { "_id" : ObjectId("540c703498c7efdea603bfe3") } on : A Timestamp(6, 1)
{ "_id" : ObjectId("540c703498c7efdea603bfe3") } -->> { "_id" : ObjectId("540c704398c7efdea605d818") } on : A Timestamp(3, 0)
{ "_id" : ObjectId("540c704398c7efdea605d818") } -->> { "_id" : ObjectId("540c705298c7efdea607f04e") } on : A Timestamp(4, 0)
{ "_id" : ObjectId("540c705298c7efdea607f04e") } -->> { "_id" : ObjectId("540c707098c7efdea60c20ba") } on : B Timestamp(5, 1)
{ "_id" : ObjectId("540c707098c7efdea60c20ba") } -->> { "_id" : ObjectId("540c7144319c0dbee096f7d6") } on : B Timestamp(2, 4)
{ "_id" : ObjectId("540c7144319c0dbee096f7d6") } -->> { "_id" : ObjectId("540c7183319c0dbee09f58ad") } on : B Timestamp(2, 6)
{ "_id" : ObjectId("540c7183319c0dbee09f58ad") } -->> { "_id" : ObjectId("540eb15ddace5b39fbc32239") } on : B Timestamp(4, 2)
{ "_id" : ObjectId("540eb15ddace5b39fbc32239") } -->> { "_id" : ObjectId("540eb192dace5b39fbca8a84") } on : A Timestamp(5, 2)
{ "_id" : ObjectId("540eb192dace5b39fbca8a84") } -->> { "_id" : { "$maxKey" : 1 } } on : A Timestamp(5, 3)
【问题讨论】: