了解MongoDB块拆分

时间:2018-07-24 21:35:56

标签: mongodb sharding chunks

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

  

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

这是文档的链接:data partitioning。给定文档提供的示例,其中minKey = 0和maxKey = 200,谁能给我一个可以拆分的块和不能拆分的块的示例?尤其是不可拆分的块中的文档的外观如何?我认为,如果x是分片键,而相对于范围175-200的块是最小的,则无法拆分,则x = 180的文档将插入到该不可拆分的块中。我错了?其他类型的钥匙会怎样?

1 个答案:

答案 0 :(得分:1)

让我们假设您有一组经过分片的推文。为简单起见,我将使用“ account_id”作为分片键(例如,您问题中的x)。请注意,对于这种用例,这是一个不好的分片键,原因将很快出现。

该集合被分片,并且accounts_id的范围被分成多个大块,这些大块将分布在各个小块中。一小块将引用175-200之间的account_id。

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

进一步,假设在此范围内有一个用户多产(不言而喻account_id: 180),它会不停地鸣叫。最终,大块拆分将发生到该帐户本身全部是大块的情况,例如[180,180]。随着越来越多的推文添加到集合中,该块的大小将继续增长,但由于分片键处于其最精细的粒度(即单个account_id),因此无法拆分该块。可能有大量与该块相对应的文档,但是无法通过仅对account_id进行过滤来拆分该块。

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

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