为什么散列分片键在mongodb中的每个分片上创建块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么散列分片键在mongodb中的每个分片上创建块相关的知识,希望对你有一定的参考价值。

当我使用散列的分片键时,在添加任何数据之前,我的所有分片都已经用块分割,如下面sh.status()的示例输出中所示。

sample.test
    shard key: { "sampleId" : "hashed" }
    unique: false
    balancing: true
    chunks:
            shard001    2
            shard002    2
    { "sampleId" : { "$minKey" : 1 } } -->> { "sampleId" : NumberLong("-4611686018427387902") } on : shard001 Timestamp(1, 0) 
    { "sampleId" : NumberLong("-4611686018427387902") } -->> { "sampleId" : NumberLong(0) } on : shard001 Timestamp(1, 1) 
    { "sampleId" : NumberLong(0) } -->> { "sampleId" : NumberLong("4611686018427387902") } on : shard002 Timestamp(1, 2) 
    { "sampleId" : NumberLong("4611686018427387902") } -->> { "sampleId" : { "$maxKey" : 1 } } on : shard002 Timestamp(1, 3) 

现在,当使用复合键或未散列的键并运行sh.status()时,我看到只有一个我的分片显示包含1个块。现在我必须将其填充到64mb max,以便创建第二个块。在下面的示例中,我有一个shard002和一个shard001。

sample.test
    shard key: { "sampleId" : 1, "uid" : 1 }
    unique: false
    balancing: true
    chunks:
            shard002    1
    { "sampleId" : { "$minKey" : 1 }, "uid" : { "$minKey" : 1 } } -->> { "sampleId" : { "$maxKey" : 1 }, "uid" : { "$maxKey" : 1 } } on : shard002 Timestamp(1, 0)

所以我的问题是为什么在使用散列分片键时没有数据时会生成块?

答案

这是Hashed Sharding的实际行为。

Shard an empty collection

根据mongodb文档

如果使用散列分片键对空集合进行分片:

没有为空或不存在的集合指定区域和区域范围:分片操作创建空块以覆盖整个分片键值范围并执行初始块分发。默认情况下,该操作会为每个分片创建2个块,并在群集中进行迁移。您可以使用numInitialChunks选项指定不同数量的初始块。这种块的初始创建和分发允许更快地设置分片。在初始分发之后,平衡器管理未来的块分布。

以上是关于为什么散列分片键在mongodb中的每个分片上创建块的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB分片集群

MongoDB 哈希索引

19.分片

19.分片

在 MongoDB 上分片 GridFS

MongoDB 分片管理