我不能真正理解mongodb sharded集群中的shard key概念,因为我刚刚开始学习mongodb。
引用MongoDB文档:
块是分配给
特别的碎片。当它们超过配置的块大小时,
蒙古人把这块分成两块。
似乎查克大小与特定的碎片有关,而不是与集群本身有关。我说得对吗?
说到切分键的基数:
考虑使用状态字段作为分片键:
状态键的值
持有给定地址文件的美国州。这个字段的值很低
与状态中具有相同值的所有文档的基数
字段必须位于同一个碎片上,即使特定状态
区块超过最大区块大小。
由于状态字段的可能值数量有限,MongoDB可能会在少量固定块之间不均匀地分布数据。
我的问题是分片键如何与块大小相关。
在我看来,只有两个shard服务器,就不可能分发数据,因为状态字段中的相同值必须驻留在同一个shard上。有了亚利桑那州、印第安纳州和缅因州等三个州的三个文档,数据如何分布在两个碎片之间?
最佳答案
为了理解问题的答案,您需要了解基于范围的分区。如果您有n个文档,它们将被分割成块-分割点的确定方式基于您的shard键。
由于shard key是文档中的某个字段,因此将考虑shard key的所有可能值,并且根据每个文档的shard key的值,将所有文档(逻辑上)拆分为块/范围。
在您的示例中,“state”有50个可能的值(好的,可能更像52个),所以最多只能有52个块。默认块大小为64MB。现在假设您正在共享一个集合,其中包含1000万个文档,每个文档1 K。每个块不应包含超过65K个文档。一千万个文档应该被分割成150多个块,但是我们只有52个不同的分片键值!所以你的块头会很大。为什么有问题?嗯,为了自动平衡碎片之间的块,系统需要在碎片之间迁移块,如果块太大,就不能移动。因为它不能被分割,你会陷入不平衡的集群中。