一致性哈希算法

Cassandra,memcached,redis等分布式系统中,使用一致性哈希算法来保证数据的一致性。

在redis中,为了在server node增加或减少时,尽量均匀的将缓存分布到多个server node上,同时尽可能少的移动数据,提高缓存命中率,可以使用一致性哈希算法。

数据定位过程:

将整个Hash值空间视作一个虚拟圆环,整个空间按顺时针方向组织。

使用hash函数对server node进行hash,确定各node在圆环上的位置。

使用同样的hash函数对data进行hash,确定data在圆环上的位置。从data所在位置沿环顺时针“行走”,遇到的第一个server node就是其应该定位到的server node,即为存储该data的server。

容错性和可扩展性:

在一致性哈希算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器。

在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

解决数据倾斜问题:

一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。

为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

Refs:

https://www.cnblogs.com/lpfuture/p/5796398.html

原文地址:https://www.cnblogs.com/cnsec/p/13547567.html