详细介绍: https://blog.csdn.net/feng_zi0yhv/article/details/124693764
先来简单理解下 Hash 是解决什么问题。假设一个分布式任务调度系统,执行任务的节点有 n 台机器,现有 m 个 job 在这 n 台机器上运行,这 m 个 Job 需要逐一映射到 n 个节点中一个,这时候可以选择一种简单的 Hash 算法来让 m 个 Job 可以均匀分布到 n 个节点中,比如 hash (Job)% n ,看上去很完美,但考虑如下两种情形:
n 个节点中有一个宕掉了,这时候节点数量变更为 n-1,此时的映射公式变成 hash (Job)%(n-1)
由于 Job 数量增加,需要新增机器,此时的映射公式变成 hash (Job)%(n+1)
1、2 两种情形可以看到,基本上所有的 Job 会被重新分配到跟节点变动前不同的节点上,意味着需要迁移几乎所有正在运行的 Job,想想这样会给系统带来多大的复杂性和性能损耗。
另外还有一种情况,假设节点的硬件处理性能不完全一致,想让性能高的节点多被分配一些 Job, 这时候上述简单的 Hash 映射算法更是很难做到。
如何解决这种节点变动带来的大量数据迁移和数据不均匀分配问题呢?一致性哈希算法就很巧妙的解决了这些问题。
Consistent Hashing 是一种 Hashing 算法,典型的特征是:在减少或者添加节点时,可以尽可能地保证已经存在 Key 映射关系不变,尽可能地减少 Key 的迁移。