为什么哈希分片键会在mongodb中的每个分片上创建块

时间:2019-02-27 13:50:35

标签: mongodb sharding

当我使用哈希分片密钥时,在添加任何数据之前,所有分片都已经被大块分割,如下面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,以便创建第二个块。在下面的示例中,我有一个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)

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

1 个答案:

答案 0 :(得分:0)

这是哈希碎片的实际行为。

Shard an empty collection

根据mongodb文档

  

如果您使用哈希分片密钥对空集合进行分片:

     

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