一致性hash算法

一致性hash算法(数据均匀分布到各个节点上)

  • 普通hash算法的缺点:普通的hash算法将key的hash值对redis实例的个数进行取模,来定位到redis,这样会有一些问题,比如redis实例增加,这个计算公式就会变,于是要将之前存储的key重新hash一遍,这样代价是比较高的。

  • 一致性hash算法也是使用取模的方法,不过不是对服务器数量取模,而是对2的32次方取模,hash函数的值空间为0~2的32次方-1,将整个hash值空间看成一个虚拟的圆环。将每台服务器(ip地址)都hash到hash环的一个位置上。要添加key时,将key对2的32次方取模,确定在环上的位置,沿着环顺时针查找,遇到的第一个服务器就是要定位到的服务器。假如有一台服务器宕机了,只会影响这台服务器和它前面一台服务器中之间的数据,将这些数据重新进行定位即可。如果新增一台服务器,也只需要重新定位一小部分数据,一致性hash算法具有很好的扩展性和容错性。

  • 一致性hash算法的问题:数据倾斜问题。假设服务器在hash环上分布不均匀,就会导致大部分的数据定位到一台服务器上。

  • 解决:为了解决数据倾斜问题,引入了虚拟节点机制,对每一个服务器节点计算多个hash,每个计算结果的位置都放置一个此服务节点,称为虚拟节点。这样在服务器节点很少的情况下,也能做到数据的平均分布。

你可能感兴趣的:(08,redis,11,架构)