Hash一致性算法

Hash一致性算法

一、Hash一致性算法
  通过hash一致性算法,将对应的key哈希到一个具有2^32 次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。固定的key就会落在固定服务器上。
  在采用一致性哈希算法的分布式集群中将新的机器加入,其原理是通过使用与对象存储一样的Hash算法将机器也映射到环中(一般情况下对机器的hash计算是采用机器的IP或者机器唯一的别名作为输入值),然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中。
  问题:引起数据命中失效。当新增或减少服务器节点,会引起部分hash值命中的节点偏移,而造成数据命中失效。例如:原来指向3节点的,加入1台服务器后,可能有部分就被分配到新的4节点上,而分配过去的用户在查询时,新服务器上没有数据,造成缓存命中失败,而对服务器数据库形成压力。同时,这部分信息仍然会在3节点中占用内存,可已经变成僵尸数据,无人问津。虽然redis会根据清除算法,默认LRU,慢慢的会把它们干掉,但总是不好的。
  这个问题无法完美的解决,但可以让这个命中率不会很大的损失。于是引入虚拟节点(virtual node)的概念。类似权限管理:传统是将用户和权限直接挂钩,但这样用户修改权限就非常频繁,引入一个中间层角色。用户和角色绑定,角色和权限绑定。这样当用户权限发生变更,只调整少量的角色即可。虚拟节点正应用此原理。用户的hash和虚拟节点绑定,虚拟节点再和真实服务器绑定。这样当新增服务器时,只需改变虚拟节点即可,即调整真实服务器对应虚拟节点的范围,这样一台真实服务器对应虚拟节点上的范围小了一点,之前用户访问当前服务器的缓存命中率降低,但这已经比较理想的解决上述问题了。
  虽然虚拟并不能百分百的解决缓存命中失效的问题,但把问题缩小化,这样影响面小,即使缓存失效,数据库也能承受起用户的负载,从而稳定过渡。
  Hash一致性算法_第1张图片
  计算:2^32=4 294 967 296

你可能感兴趣的:(Java)