memcached一致性hash算法

Memcached属于分布式key-value缓存系统。对于给定key值,计算其hash值,根据确定规则定位memcache服务器,进行数据查询、更新。

对于常规hash算法,计算h = hash(key)后,根据h mod n 确定n台服务器中的某一台服务器,这一算法存在的问题是:当n发生变化时,如增加服务器、服务器宕机时,几乎所有key对应的服务器都将发生变化,整个缓存系统需要数据重建,缓存未命中爆发式增长,所有负载都将落到数据库上。

Memcached的做法是一致性hash算法。

假设我们有五台服务器,ABCDE,根据某些规则(ip,编号等等)计算它们的hash值,hash值分布在0-232的圆环上。如下图:

 

对于任意key值,计算其哈希值h = hash(key),h落在该圆环上,从h处顺时针沿哈希环遇到的第一个服务器节点就是目标服务器。如h落在E~A之间,那么目标服务器为A。

当需要增加一个服务器F时,假设F的hash值落在C~D之间,如下图:

 

原本hash值落在C~F间的key值目标服务器为C,现在变为F,其他key值保持不变,对整个缓存系统的数据影响最小。

在服务器数量较少时,新加入一个服务器节点容易导致负载的不均衡,如上图,原本属于D的负载分摊到DF两个节点上,为解决这一问题,memcached使用多个虚拟节点替代物理节点。

 

如图展示了物理服务器数(y轴)与虚拟节点数(x轴)的关系,当服务器数量为5时,建议虚拟节点数为500,hash环上有2500个服务器节点,对任意key值,定位服务器的过程不变。新增服务器F会在hash环上新增500个虚拟节点,可以保证新增后各服务器负载仍然大致相当。

 

posted @ 2015-11-29 14:20  农夫与花园  阅读(274)  评论(0)    收藏  举报