一致性hash算法

摘要:
一致性哈希算法能尽可能减少了服务器数量变化所导致的缓存迁移。比如第三方的spymemcached客户端就基于一致性哈希算法实现了其分布式缓存的功能。这也是一致性哈希算法比取余映射算法出色的地方。
一致性哈希算法的应用

一致性哈希算法在分布式缓存领域的 MemCached,负载均衡领域的 Nginx 以及各类 RPC 框架中都有广泛的应用

一致性哈希算法解决的问题

普通的哈希表算法一般都是计算出哈希值后,通过取余操作将 key 值映射到不同的服务器上
但是当服务器数量发生变化时,取余操作的除数就会发生变化,所有 key 所映射的服务器几乎都会改变,这对分布式缓存系统来说是不可以接受的。
一致性哈希算法能尽可能减少了服务器数量变化所导致的缓存迁移。

memcached

Memcached 是一个高性能的分布式缓存系统,然而服务端没有分布式功能,各个服务器不会相互通信。
它的分布式实现依赖于客户端的程序库,这也是 Memcached 的一大特点。
比如第三方的 spymemcached客户端就基于一致性哈希算法实现了其分布式缓存的功能。
1、向 Memcached 添加数据,首先客户端的算法根据 key 值计算出该 key 对应的服务器。
2、向选出的服务器保存缓存数据。
3、获取数据时,对于相同的 key ,客户端的算法还可以选出相同的服务器,从而获取数据

在这个过程中,客户端的算法首先要保证缓存的数据尽量均匀地分布在各个服务器上,
其次是当个别服务器下线或者上线时,会出现数据迁移,应该尽量减少需要迁移的数据量。

客户端算法是客户端分布式缓存性能优劣的关键。

以分布式缓存场景为例,分析一下一致性哈希算法环的原理

首先将缓存服务器( ip + 端口号)进行哈希,映射成环上的一个节点
(取到ip+端口的hash值,以此值作为key,ip+端口作为value,放入TreeMap<Long, MemcachedNode>)

需要缓存数据时,计算出缓存数据 key 值的 hash key,同样映射到环上
(假如最终计算出的的hash key为5)

顺时针选取最近的一个服务器节点作为该缓存应该存储的服务器
(从TreeMap中查找第一个大于等于5的key所对应的服务器,如果没有找到,则取TreeMap中的第一个服务器)

一致性hash算法第1张

服务器 B 宕机下线,服务器 B 中存储的缓存数据要进行迁移,但由于一致性哈希环的存在,只需要迁移key 值为1的数据,
其他的数据的存储服务器不会发生变化。这也是一致性哈希算法比取余映射算法出色的地方。

由于服务器 B 下线,key 值为1的数据顺时针最近的服务器是 C ,所以数据存迁移到服务器 C 上。

现实情况下,服务器在一致性哈希环上的位置不可能分布的这么均匀,导致了每个节点实际占据环上的区间大小不一。
这种情况下,可以增加虚节点来解决。通过增加虚节点,使得每个节点在环上所“管辖”的区域更加均匀。
这样就既保证了在节点变化时,尽可能小的影响数据分布的变化,而同时又保证了数据分布的均匀。

几款比较常见的哈希算法

MD5 算法
CRC 算法
MurmurHash 算法
FNV 算法
Ketama 算法

免责声明:文章转载自《一致性hash算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网络安全等级保护测评机构管理办法(全文)kudu安装部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

验证码识别,发票编号识别

update:排版 这个demo的初衷不是去识别验证码,是把验证的图像处理方式用到其他方面,车票,票据等。 这里最后做了一个发票编号识别的的案例: 地址:http://v.youku.com/v_show/id_XMTI1MzUxNDY3Ng==.html 源代码:https://github.com/ccccccmd/ReCapcha demo中包含一个...

面试题:HashSet、TreeSet 和HashMap 的实现与原理

说下 TreeSet 和 HashSet 什么区别呢? 它们的区别点主要在他们的底层数据结构不同,HashSet 使用的是 HashMap 来实现,而 TreeSet 使用的是 TreeMap 来实现的。 哦?那你了解 HashMap 和 TreeMap 的区别吗? HashMap 是一个最常用的数据结构,它主要用于我们有通过固定值(key)获取内...

数据阵列Raid5磁盘阵列知识

题记:写这篇博客要主是加深自己对数据阵列的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。     盘磁阵列RAID5理原RAID5是用利奇偶验校算法对盘磁阵列数据行进冗余,许允在一块盘现出障故的情况下保障数据安全。即保障了阵列的读写效率,又可以勤俭企业本钱。奇偶验校算法理原:A值 B值 Xor结果 0 0 0 1 0 1 0 1 1 1...

粒子群算法(1)----粒子群算法简单介绍

   一、粒子群算法的历史    粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比方研究鸟群系统,每一个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其它的主体进行交流,而且依据交流的过程“学习”或“积累经验”改变自身结构与行为。整个系统的演变或进化包...

HashMap之原理及死锁

一、HashMap原理 1.HashMap的本质就是数组和链表。table是一个entry数组,每一个数组元素保存一个Entry节点,而Entry节点内部又连接着同样key的下一个Entry节点,就构成了链表。. 详情见 HashMap源码分析 2.HashMap死锁原因: HashMap会造成死锁,因为HashMap是线程非安全的,多并发的情况...

.NET 配置文件简单使用

.NET 配置文件简单使用   当我们开发系统的时候要把一部分设置提取到外部的时候,那么就要用到.NET的配置文件了。比如我的框架中使用哪个IOC容器需要可以灵活的选择,那我就需要把IOC容器的设置提取到配置文件中去配置。实现有几种方法。 1.使用appSettings 这个是最简单的可以设置和读取的用户设置 程序中可以用key去读取: string o...