假设有N个缓存服务器,需要根据用户的IP hash到各个服务器,最简单的做法就是IP%N,但是当有个服务器节点down了,或者新增一个服务器,就需要IP%(N-1)或者IP%(N+1),这时所有的缓存都失效,所有的请求都将冲向后台服务器,这将是毁灭性的。
一致性hash算法
1.单调性
如图所示,如果有一个写入缓存的请求,计算器hash值Hash(IP), Hash(IP) 对应于图环中的某一个点,如果该点对应没有映射到具体的某一个机器节点,那么顺时针查找,直到第一次找到有映射机器的节点,该节点就是确定的目标节点
当有一个节点失效时,下一个节点即为它所请求的目标节点,而其它节点将不受影响
当新增一个节点时,新增节点的下一个节点的缓存需要转移到新的节点,其它节点不受影响
2.均衡性
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。为了解决分配不均的问题,一致性hash引入了“虚拟结点”这个概念。“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。这样就能达到更好的平衡性。