为什么散列分片键在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的实际行为。
根据mongodb文档
如果使用散列分片键对空集合进行分片:
没有为空或不存在的集合指定区域和区域范围:分片操作创建空块以覆盖整个分片键值范围并执行初始块分发。默认情况下,该操作会为每个分片创建2个块,并在群集中进行迁移。您可以使用numInitialChunks选项指定不同数量的初始块。这种块的初始创建和分发允许更快地设置分片。在初始分发之后,平衡器管理未来的块分布。
以上是关于为什么散列分片键在mongodb中的每个分片上创建块的主要内容,如果未能解决你的问题,请参考以下文章