分布式哈希一致性

问题

  • 分布式哈希一致性的动机是什么?
  • 相比其他有什么好处

概述

我们谈论的分布式哈希一致性常常使用在负载均衡,权衡一个策略的好坏,我们常常谈到扩展性容错性。我们可以从以下两个方面来考量

  • 扩展性 :水平扩展和垂直扩展,加减一台cluster 是否对整个集群有影响。
  • 容错性 :假如一台cluster 是否会影响到其他的 cluster,是否可以用比较小的代价进行恢复。

负载均衡

负载均衡使用的策略 :

  • 随机访问策略。系统随机访问,服务器负载压力不均衡,所以有可能分配的不合理。
  • 轮询策略。请求均匀分配,如果服务器有性能差异,则无法实现性能好的服务器能够多承担一部分。
  • 权重轮询策略。权值需要静态配置,无法自动调节,不适合对长连接和命中率有要求的场景。
  • Hash取模策略。不稳定,如果列表中某台服务器宕机,则会导致路由算法产生变化,由此导致命中率的急剧下降。 一致性哈希策略。

Hash取模策略

hash取模可以定义为 “ key % n = 目标cluster ”,key可以相当于 java 中的hashcode ,n 则为当前所有集群机器的数量。 但是它的缺点很明显,假如使用hash取模策略,若增加台cluster,(图片来自参考资料)

分布式哈希一致性_第1张图片

减少台机器

分布式哈希一致性_第2张图片

可以看到增加台机器,会导致key 重新映射,那么迁移工作将是巨大的,而减少一台也是同样的道理,最重要的原因是该策略是依赖机器的数量进行分配目标机器。

分布式一致性hash算法

直接上图(来源见参考资料)

分布式哈希一致性_第3张图片

上面是hash环,cluster 分布在hash环上,请求经过hash 等到的key沿着顺时针,第一个到达的节点就是目标cluster .

扩展性和容错性

假如增加/减少了一台机器,对其他的cluster并没有什么影响,而某台cluster发生故障后,恢复的时候只需要将故障节点的keys 放在沿着hash环下一台节点就可以了。

虚拟节点

但是我们将节点分布在hash 环上的时候有可能分布不均,例如

分布式哈希一致性_第4张图片

上图,服务器1接受的请求在平等条件下肯定比其他的多,我们可以通过增设虚拟节点的方式来解决这个问题,虚拟节点并不是真实的物理节点,是虚构出来的,这样可以解决节点在hash 环中不平衡的问题,同时也是根据权重不同可以分配多几个虚拟节点。

运用

  • rocketmq 集群消费端
  • redis 集群

总结

通过本文了解了分布式哈希一致性相对与其他的负载均衡策略的优势。

参考资料

  • https://www.acodersjourney.com/system-design-interview-consistent-hashing/
  • https://www.cnblogs.com/jajian/p/10896624.html

你可能感兴趣的:(分布式哈希一致性)