我想知道MongoDB
是否支持以下功能。
将新分片添加到当前使用hashed sharding
的现有分片集群时,旧分片中的某些文档应迁移到新分片。
问题:mongodb可以自动处理此过程吗?
提前谢谢。
答案 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/