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

What happens when adding a new shard in the cluster using hashed shard?

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

问题:mongodb是否可以自动处理这个过程?

提前致谢。

是的。天真地,您会想象一个实现采用关键字段的哈希码,对集群中的节点数进行模运算,然后将值放在该节点上。添加一个 node/shard 到集群会改变你的模值,所有数据都会被打乱,所以添加一个节点是不可能的。

为了解决这个问题,分布式系统的做法略有不同。哈希码不是映射到物理机器,而是映射到 mongodb 中称为 "chunk." 的内容。在 apache spark 中,这将是一个分区。块比节点多,但是很多行数据映射到一个 "chunk."

举个例子,您可以想象如果您有 1000 万行和 5 个主机,您可以采用 hashcode modulo 100 这样一千万行就有 100 个唯一键可以确定性地 select集群中的一个节点,然后您管理一个映射,该映射为键 1-20 选择节点 1,键 21-40 为节点 2,等等。当您添加第五个节点时,重新平衡过程可以将 "chunks" 从一个节点移动到另一个,并更新映射 table。由于映射 table 仅记录一百个块的节点位置,而不是每一行,因此这是可管理的。

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

"Chunks" 在 mongodb 中: https://docs.mongodb.com/v3.2/core/sharding-data-partitioning/

重新平衡: https://docs.mongodb.com/v3.2/core/sharding-balancer-administration/