前言
一致性哈希算法在分布式系统的应用中是十分广泛的。常见的应用场景是分布式缓存。它主要解决了哈希取模算法在分布式系统中存在的动态伸缩等问题。
哈希取模算法的局限性
在分布式缓存集群中,当新增加缓存服务器或其中一台挂掉后,由路由算法发生改变,导致大量的缓存数据不能命中。从而造成数据库面临巨大压力而崩溃,可能导致整个系统崩溃。
一致性哈希算法原理
一致性哈希算法通过一个叫作一致性哈希环的数据结构实现。这个环的起点是
,终点是
,并且起点和终点相连接,故这个环的整数分布范围是
。
将服务器节点和key放到哈希环上
我们将服务器节点和key的hash值放置到哈希环上,如下图:
服务器节点分别是NODE0、NODE1、NODE2。key分别代表key1 ~ key8。
将key和服务器节点都放置到同一个哈希环后,在哈希环上顺时针查找距离这个 key 的 hash 值最近的机器,即是这个key所属的机器。
key1、key8在节点NODE0上;key2、key5在节点NODE1上;key3、key4、key6在节点NODE2上。
增加服务器(扩容)
由于业务需要,如缓存集群压力过大,我们需要增加一台服务器(NODE3)。经过hash函数计算,NODE3节点落在NODE1和NODE2之间。如下图:
对上述情况,只有NODE1和NODE2节点之间的key需要重新分配。key4没有变,还在NODE2节点。只是key3、key6重新分配新的节点NODE3上。我们发现,一致性哈希算法只需要很少部分key需要重新分配。而哈希取模方式则大部分缓存会失效。
减少服务器(缩容)
由于某个服务器出现故障导致下线,如NODE3下线,这时原本key3、key6存储在NODE3上,需要重新被分配至NODE2节点上,其