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: