天天看点

Redis缓存负载均衡使用的一致性哈希算法操作优点:存在的问题:解决方案

原文链接

由于普通哈希算法实现的缓存负载均衡存在扩展能力和容错能力差问题,所以我们引入一致性哈希算法。

一句话概括一致性哈希:就是普通取模哈希算法的改良版,哈希函数计算方法不变,只不过是通过构建环状的 Hash 空间代替普通的线性 Hash 空间。

操作

  • 选择一个足够大的Hash空间(一般是 0 ~ 2^32)构成一个哈希环。
  • 对于缓存集群内的每个存储服务器节点计算 Hash 值,就是服务节点在 Hash 环上的位置。
  • 对每个需要存储的数据 key 同样也计算一次哈希值,计算之后的哈希也映射到环上

优点:

  • 扩展能力提升

    当需要增加节点时,受影响的只有下一个节点的部分数据,将数据迁移到新节点即可。

  • 容错能力提升

    节点失效时,受影响的只有当前节点,不会对其他节点数据造成影响,只需要将该节点数据存到按顺时钟方向的下一个节点即可。

存在的问题:

  • 数据倾斜

    节点经过哈希算法后分布不均匀,导致数据大量存储在某一个节点上

  • 节点雪崩

    1,由于数据倾斜导致节点请求压力过大挂掉

    2,由于某些原因节点宕机,导致该节点的数据全部打到下一节点上,下一节点由于请求过大挂掉

    3,基于以上原因节点挂掉后,数据又打到下一节点,下一节点同样由于压力过大挂掉。。。导致全部节点挂掉,造成节点雪崩

解决方案

如何解决数据倾斜和节点雪崩呢?

  • 虚拟节点

    就是对原来单一的物理节点在哈希环上虚拟出几个它的分身节点,这些分身节点称为「虚拟节点」。打到分身节点上的数据实际上也是映射到分身对应的物理节点上,这样一个物理节点可以通过虚拟节点的方式均匀分散在哈希环的各个部分,解决了数据倾斜问题。

继续阅读