MongoDB中的默认块大小和拆分行为

时间:2014-09-16 07:37:19

标签: mongodb sharding

我有一些分片集合。它们的大小在MongoDB 2.4.11中介于50-90MiB之间。根据文档的默认块大小为64MB。

当我使用下面的命令检查块分发时,

db.getCollection(collName).getShardDistribution()

显示

一些大小低于64MB的集合已被分成几个块。

data : 58.13MiB docs : 148540 chunks : 2
estimated data per chunk : 29.06MiB
estimated docs per chunk : 74270

一些大小为x的集合,其中64MB< x< 128 MB有超过2个块。

data : 98.24MiB docs : 277520 chunks : 4
estimated data per chunk : 24.56MiB
estimated docs per chunk : 69380

预计会出现这种情况吗?这是怎么发生的?

1 个答案:

答案 0 :(得分:5)

64MB(可配置)的值是最大块大小而不是目标块大小。根据经验,一般来说,块的大小只有一半这么大,但是有很多因素,基本上这是正常的,无需担心。

为了解释一下,块通常会在达到最大大小之前被拆分很久。有两种机制可以导致拆分,一种只适用于集合的初始分片,另一种机制将一直运行(只要有写入发生且未被禁用)。

两种机制实际上使用相同的命令来确定是否应该拆分块,内部命令splitVector()。调用splitVector时,它会检查指定的范围(在本例中为整个集合)并返回一个或多个拆分(如果有)(空数组表示块大小正确且不需要分割)。

随后的块分割由mongos完成。您用于写入集合的任何mongos将跟踪写入给定块的数据量,并将定期检查(基于写入块的数量)是否存在任何有效的分割点利用splitVector这样做。如果找到有效的分割点,它将在下次获得所需的锁定时尝试分割。

你可能想知道它如何选择分裂点 - 这有点复杂,它可以基于数据大小或文档数量,当然还有你设置的最大块大小。检查特定数据集的最佳方法是进行一些测试。例如,以下是两个集合foo.databar.data。我创建了bar.data只有50MiB的数据,foo.data创建了200MiB的数据 - 它们都具有相同大小的文档。 bar.data集合未被拆分,因此splitVector对此块保持原样感到满意,而foo.data集合被拆分为9个与您所看到的大小相似的初始块(~24MiB):

{  "_id" : "bar",  "partitioned" : true,  "primary" : "shard0000" }
        bar.data
            shard key: { "_id" : 1 }
            chunks:
                shard0000   1
            { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 
{  "_id" : "foo",  "partitioned" : true,  "primary" : "shard0000" }
    foo.data
        shard key: { "_id" : 1 }
        chunks:
            shard0000   9
    { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("0a831759adacefd1231e6939") } on : shard0000 Timestamp(1, 0) 
        { "_id" : ObjectId("0a831759adacefd1231e6939") } -->> { "_id" : ObjectId("150f322badacefd1233c920a") } on : shard0000 Timestamp(1, 1) 
        { "_id" : ObjectId("150f322badacefd1233c920a") } -->> { "_id" : ObjectId("1f9bfd35adacefd1235b2786") } on : shard0000 Timestamp(1, 2) 
        { "_id" : ObjectId("1f9bfd35adacefd1235b2786") } -->> { "_id" : ObjectId("2a213937adacefd1237829cb") } on : shard0000 Timestamp(1, 3) 
        { "_id" : ObjectId("2a213937adacefd1237829cb") } -->> { "_id" : ObjectId("34b25e1cadacefd12396d4b1") } on : shard0000 Timestamp(1, 4) 
        { "_id" : ObjectId("34b25e1cadacefd12396d4b1") } -->> { "_id" : ObjectId("3f3643feadacefd123b4a8f2") } on : shard0000 Timestamp(1, 5) 
        { "_id" : ObjectId("3f3643feadacefd123b4a8f2") } -->> { "_id" : ObjectId("49c8edafadacefd123d33325") } on : shard0000 Timestamp(1, 6) 
        { "_id" : ObjectId("49c8edafadacefd123d33325") } -->> { "_id" : ObjectId("5458e4ddadacefd123f14eb5") } on : shard0000 Timestamp(1, 7) 
        { "_id" : ObjectId("5458e4ddadacefd123f14eb5") } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 8)