理解 MongoDB 分块

understanding MongoDB chunk split

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

The smallest range a chunk can represent is a single unique shard key value. A chunk that only contains documents with a single shard key value cannot be split.

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

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

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

一段时间后,这些帐户中的每一个都继续发推文,并且该块的大小增长到分裂成两个块的程度:[175, 183][184,200]

更进一步,假设在这个范围内有一个非常多产的用户(比如说 account_id: 180)不停地发推文。最终,块分裂将发生到这个帐户完全独立在一个块中的地步,例如[180,180]。随着越来越多的推文被添加到集合中,这个块的大小将继续增长,但是这个块不能被拆分,因为分片键处于其最精细的粒度,即单个 account_id。这个chunk对应的文档可能有很多,但是只在account_id上过滤是没法分割这个chunk的。

这种特殊情况就是为什么这可能是一个不可取的分片键。

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