hash取模一致性哈希
来源:互联网 发布:美工钢笔 编辑:程序博客网 时间:2024/04/28 07:27
取模
最简单的hash算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(计算key的hash值的方法可以自由选择,比如算法CRC32、MD5,甚至本地hash系统,如java的hashcode)模上server总数来定位目标server。这种算法不仅简单,而且具有不错的随机分布特性。
但是问题也很明显,server总数不能轻易变化。因为如果增加/减少memcached server的数量,对原先存储的所有key的后续查询都将定位到别的server上,导致所有的cache都不能被命中而失效。
一致性hash
为了解决这个问题,需要采用一致性hash算法(consistent hash)
相对于取模的算法,一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。
为了方便理解,可以把这个有限值域理解成一个环,值顺时针递增。
如上图所示,集群中一共有5个memcached server,已通过server的hash值分布到环中。
如果现在有一个写入cache的请求,首先计算x=hash(key),映射到环中,然后从x顺时针查找,把找到的第一个server作为目标server来存储cache,如果超过了2^32仍然找不到,则命中第一个server。比如x的值介于A~B之间,那么命中的server节点应该是B节点
可以看到,通过这种算法,对于同一个key,存储和后续的查询都会定位到同一个memcached server上。
那么它是怎么解决增/删server导致的cache不能命中的问题呢?
假设,现在增加一个server F,如下图
此时,cache不能命中的问题仍然存在,但是只存在于B~F之间的位置(由C变成了F),其他位置(包括F~C)的cache的命中不受影响(删除server的情况类似)。尽管仍然有cache不能命中的存在,但是相对于取模的方式已经大幅减少了不能命中的cache数量。
虚拟节点
但是,这种算法相对于取模方式也有一个缺陷:当server数量很少时,很可能他们在环中的分布不是特别均匀,进而导致cache不能均匀分布到所有的server上。
- hash取模一致性哈希
- Hash取模与一致性Hash
- 哈希Hash算法:一致性哈希Hash
- 一致性哈希(Consistent Hash)
- Consistent Hash 一致性哈希
- memcahe 取模 一致性哈希算法
- 【算法学习】Consistent Hash 一致性哈希
- 一致性哈希(consistent hash)
- Consistent Hash Ring【一致性哈希】
- 一致性Hash算法(分布式哈希)
- 一致性哈希(consistent hash)
- 一致性HASH算法和取余算法详解
- [杂]一致性哈希(consistent hash )之我见
- Consistent-Hash 一致性哈希算法 分布式存储
- Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
- Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
- Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
- 2016 -Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
- wordpress 必备插件
- 时间同步(linux)
- js实现web套打功能,支持拖动布局,支持按键移动支持打印预览,结果可保存至数据库中
- 关于C++中的静态成员
- 继承中参数传递及调用顺序
- hash取模一致性哈希
- HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )
- [LeetCode]Wildcard Matching 通配符匹配(贪心)
- 大话设计模式C++实现-第1章-简单工厂模式
- java.lang.Exception: No runnable methods
- lnk1104和lnk1181 编译错误解决办法
- 关于Linux系统清理/tmp/文件夹的原理
- 设置开机启动(linux)
- win server 2008 r2虚拟机从外网ping不通