了解MongoDB块拆分

问题描述 投票:1回答:1

我是MongoDB的新手,我正在阅读手册。我已经了解了什么是碎片和块(其他分布式系统有类似的概念),但我很难理解这两行:

块可以表示的最小范围是单个唯一的分片键值。仅包含具有单个分片键值的文档的块无法拆分。

这是文档的链接:data partitioning。鉴于minKey = 0和maxKey = 200的文档提供的示例,任何人都可以给我一个可以拆分的块和无法拆分的块的示例吗?特别是一块不可拆分的块内的文档是什么样的?我认为如果x是分片键并且相对于范围175-200的块是最小的,那么不可分割,x = 180的文档将插入该不可分割的块中。我错了?其他类型的密钥会发生什么?

mongodb sharding chunks
1个回答
1
投票

假设您有一组分片的推文。为简单起见,我将使用'account_id'作为分片键(例如问题中的x)。请注意,由于我们很快就会看到这个用例,这是一个糟糕的分片键。

该集合是分片的,accounts_id的范围被分解成将分布在分片中的块。一个块将从175-200引用account_ids。

过了一段时间,这些帐户中的每一个都继续推文,这个块的大小增长到分成两个块的点:[175, 183][184,200]

更进一步,假设在这个范围内有一个令人难以置信的多产用户(比如account_id: 180)不停发推。最终,块分割将发生在该帐户本身处于块中的点,例如, [180,180]。随着越来越多的推文被添加到集合中,此块的大小将继续增长,但由于分片键处于最精细的粒度(即单个account_id),因此无法拆分块。可能存在与该块相对应的大量文档,但是无法通过仅对account_id进行过滤来分割该块。

这种具体情况是为什么这可能是一个不可取的分片键。

相比之下,假设基于tweet_id对集合进行分片。理论上,这个值在理论上是唯一的,因此不存在单个值将块大小增加到无法拆分的风险。

© www.soinside.com 2019 - 2024. All rights reserved.