分布式算法3 -- 一致性hash算法
来源:互联网 发布:淘宝库存不足 编辑:程序博客网 时间:2024/06/05 01:18
http://blog.csdn.net/cywosp/article/details/23397179/
解决的问题
为每个客户端映射到服务器,当服务器挂掉或者增加时,尽量少的改变客户端的映射。问题描述
用hash算法来分布数据,当数据节点增加或者减少时,需要调整hash算法的模,导致所有的数据都要重新按照最新的模分布到多个节点。如果数据量比较庞大是,这个工作量是很大的。
eg:HashMap:就是利用key的hash来计算这个key落在哪个区间中,计算规则就是根据当前有区间的总数量,位运算计算出结果。当数量量增大时,这就要扩大区间,这时候就要全部重新对所有的key进行重新的区间定位。
一致性hash算法就是基于优化hash算法,通过映射关系解决。场景
如果你有n个cache服务器,那么如何将Object映射到n个服务器上,这时就会计算Object的hash值,然后均匀映射到n个服务器上。hash(object) % N
那么问题来了:
1)一个服务器m挂掉了,这时所有映射到m的所有对象将失效,这时要移除m,cache服务器总是就是N-1.映射公式就是hash(object) % (N-1)
2) 由于访问过重,添加服务器,这时就是n+1,映射公式就是hash(object) % (N+1).
3) 添加新的服务器时,想让更多的Object映射到这个服务器,显然hash算法做不到。单调性
已经有一些通过hash分配到相应的缓存区,现在有新的缓存区,hash的结果保证原有已经分配的可以映射到新的缓存中,而不会映射到旧的缓存集中的其他缓存区。原理
在添加、移除一个cache服务器时,尽可能少的改变已经存在key的映射关系。
环形hash空间hash(Object1) = CacheA
hash(Object2) = CacheB
hash(Object3) = CacheChash值落在哪个区间就映射到那台服务器上。在这个环形空间中,沿着顺时针房间从对象key值进行出发,那么第一个Cache服务器就是的
1) Cache移除时
当CacheB挂掉时,顺时针,落到下一个Cache上(CacheC)2)CacheB添加时
添加CacheD,原来Object1落在CacheC,现在落在CacheD平衡性
CacheB -》object1、Object2、Object3
CacheA -》object5
CacheC -》object4
指向CacheB有3个客户端,而 cacheA、CacheA才有1个。这对于Cache分布很不平衡
这时候引入虚拟节点:增加节点Cache的复制品.
CacheA1、CahceA2 (虚拟节点)都是代表CahceA
CacheB1、CahceB2 (虚拟节点) 都是代表CahceB
映射关系由对象-》节点 ,转换到对象-》虚拟节点虚拟节点
hash计算可以采用对应节点的ip地址加数字后缀的模式。
eg:
CacheA的ip为202.168.14.241.引入“虚拟节点”前,计算 h1 的 hash 值:
Hash(“202.168.14.241”);
引入“虚拟节点”后,计算“虚拟节”点v1和v的hash值:
Hash(“202.168.14.241#1”); // v1
Hash(“202.168.14.241#2”); // v2
- 分布式算法3 -- 一致性hash算法
- 一致性Hash算法(分布式算法)
- 分布式一致性Hash算法实现
- memcached的分布式算法–一致性hash
- 分布式一致性Hash算法实现java版
- 分布式缓存的一致性hash算法
- 分布式缓存的一致性hash算法
- 一致性Hash算法(分布式哈希)
- 分布式缓存的一致性Hash算法
- memcached的分布式算法–一致性hash
- 5. 分布式缓存中的一致性Hash 算法
- php之一致性hash分布式算法
- memcached的分布式算法–一致性hash
- Memcached客户端分布式计算算法--一致性hash算法
- 《分布式》:paxos算法和一致性Hash算法相关记录
- 一致性Hash算法介绍(分布式环境算法)
- 一致性 Hash 算法学习(分布式或均衡算法)
- 一致性Hash算法
- 关于mysql.xml文件中 #{_parameter}的说明
- jfinal问题整理(转载自开源中国RunnerOSC文章 )
- Sql Server_加外键时值矛盾引起的问题
- 二维码
- mysql异常
- 分布式算法3 -- 一致性hash算法
- python自定义库文件路径
- android中xml tools属性部分介绍
- 无法登陆ubuntu问题的一个解决方法
- 关于真机调试的问题
- && 右值引用
- underscore.js
- 第十二条: Comparable和Comparator
- Installing and Configuring a MySQL Database