使用散列碎片在群集中添加新分片时会发生什么?

时间:2017-01-19 02:52:09

标签: mongodb sharding

我想知道MongoDB是否支持以下功能。 将新分片添加到当前使用hashed sharding的现有分片集群时,旧分片中的某些文档应迁移到新分片。

问题:mongodb可以自动处理此过程吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

是。天真地,你会想象一个实现采用关键字段的哈希码,做一个集群中节点数量的模数,并将值放在该节点上。将节点/分片添加到群集将改变您的模数值,并且所有数据都将被加扰,因此无法添加节点。

要解决此问题,分布式系统的执行方式略有不同。哈希代码不是映射到物理机器,而是映射到mongodb中称为“块”的内容。在apache spark中,这将是一个分区。存在比节点更多的块,但是许多行数据映射到一个“块”。

作为一个例子,您可以想象如果您有一千万行和五个主机,您可以使用hashcode modulo 100以便您的一千万行有100个唯一键,用于确定性地选择群集中的节点,然后你管理一个映射,选择node1作为密钥1-20,node2选择密钥21-40等。当你添加第五个节点时,重新平衡过程可以将“块”从一个节点移动到另一个节点,并更新映射表。由于映射表仅记录一百个块的节点位置,而不是每一行,因此这是可管理的。

Mongodb使用后台进程监视节点上有多少块,并根据需要移动它们。

mongodb中的“Chunks”: https://docs.mongodb.com/v3.2/core/sharding-data-partitioning/

Reblanacing: https://docs.mongodb.com/v3.2/core/sharding-balancer-administration/