memcache主要由:路由模块、通信模块、接口等等够成。
一、普通hash映射的应用
人称通常称这种算法为“余数hash”、或者“取模hash”。只考虑hash的应用,不考虑具体hash算法的实现。具体hash算法实现,参考http://baike.baidu.com/view/273836.htm
应用场景:
比如你有 3 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 3 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 3 个 cache ;
服务器编号=hash(object)%3
一切都运行正常,再考虑如下的情况;
1、由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1);
假如:当向原有的cache服务器中再添加cache时,此时映射结果会有如下变化
key的hash尾数 |
3台时的映射对象cache |
4台时的映射对象cache |
5台时的映射对象cache |
... |
00000 |
0 |
0 |
0 |
|
00001 |
1 |
1 |
1 |
|
00002 |
2 |
2 |
2 |
|
00003 |
0 |
3 |
3 |
|
00004 |
1 |
0 |
4 |
|
00005 |
2 |
1 |
0 |
|
... |
... |
... |
... |
|
根据上表依次类推会发现:
当3变成4时有25%的命中,不命中率为75%;
当4变成5时有20%的命中,不命中率为80%;
当5变成6时有16.7的命中,不命中率为83.3%;
当N变成N+1时有N/N与N+1的最小公倍数,不命中率为1-N/N与N+1的最小公倍数
当减少基数时仍然会发生上述情况,当基数变大时,不命中率如此之高。在实际应该中,对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务……
二、一致性hash的应用
1.将整个哈希值空间组织成一个虚拟圆环,假设某哈希函数H的值空间为0-(2^32-1),即32位无符号整数;
2.将各节点用H函数哈希,可以将服务器的IP或主机名作为关键字哈希,这样每个节点就能确定其在哈希环上的位置;
3.将id用H函数映射到哈希空间的一个值,沿该值向后,将遇到的第一个节点做为处理节点。
当向原有的cache服务器中再添加cache时,此时映射结果会有如下变化
|
3->4 |
4->5 |
5->6 |
… |
不命中率 |
1/6 |
1/8 |
1/10 |
1/N*2 |
随着cache服务器的个数增加,在添加会减少服务器个数时,影响范围越来越小,基本上可以解决洪水般的访问都会直接冲向后台服务了。但是,当4变5时,node4和node5的实际利用率和压力大小仅为其它服务的一半。负载不能达到均衡了……
三、虚拟节点应用
考量 Hash 算法的另一个指标是平衡性 (Balance) ,定义如下:
平衡性
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。
hash 算法并不是保证绝对的平衡,如果 cache 较少的话,对象并不能被均匀的映射到 cache 上,比如在上面的例子中,仅部署 cache A 和 cache C 的情况下,在 4 个对象中, cache A 仅存储了 object1 ,而 cache C 则存储了 object2 、 object3 和 object4 ;分布是很不均衡的。
为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。
仍以仅部署 cache A 和 cache C 的情况为例,在图 4 中我们已经看到, cache 分布并不均匀。现在我们引入虚拟节点,并设置“复制个数”为 2 ,这就意味着一共会存在 4 个“虚拟节点”, cache A1, cache A2 代表了 cache A ; cache C1, cache C2 代表了 cache C ;假设一种比较理想的情况,参见图 6 。
图 引入“虚拟节点”后的映射关系
此时,对象到“虚拟节点”的映射关系为:
objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;
因此对象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache C 上;平衡性有了很大提高。
引入“虚拟节点”后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所在 cache 时的映射关系如图 7 所示。
通常一个节点可分为150个虚拟节点。通过使用虚拟节点后,增加或减少cache 服务器对于节点的不命中率大大降低,平衡性也有大的改善。
参考:
相关推荐
分布式一致性哈希是一种解决在分布式缓存系统中如何高效、稳定地分配数据的算法,尤其在Memcache等缓存服务中广泛应用。它旨在确保当缓存集群中的节点增减时,对现有数据的映射影响最小,从而降低数据迁移和系统压力...
一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT)的算法,它主要应用于分布式缓存、负载均衡等场景,旨在解决在动态扩展或收缩系统规模时,尽量减少数据迁移的问题。在这个简单的实现中,我们将探讨如何...
一致性Hash算法通过巧妙的设计,不仅解决了传统哈希方法在动态环境中存在的问题,还为分布式系统的稳定性、可扩展性和性能提供了有力支持。通过理解其核心原理和应用,我们可以更好地应对分布式环境下的挑战,并构建...
一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,旨在解决在分布式环境中数据分布不均匀的问题。Ketama算法是基于一致性哈希的一种优化实现,由Last.fm公司的Simon Willison提出,其目标是在...
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可扩展性。在C/C++编程中,一致性哈希通常用于构建分布式系统,如负载均衡、缓存...
一致性哈希(Consistent Hashing)是一种分布式哈希算法,主要应用于分布式缓存、负载均衡等领域,以解决在分布式环境中动态添加或删除节点时,尽可能少地改变已有的哈希映射关系。在这个Java实现中,我们看到的是...
它整合了API网关、服务发现、请求限流、一致性哈希路由和服务调度等多种功能,旨在简化中小团队在微服务开发过程中的复杂性,提高开发效率,并确保系统稳定性和性能。 首先,让我们深入了解API网关。API网关是...
分布式数据插入数据库是一个复杂而关键的任务,特别是在大数据和云计算环境下。一致性哈希算法(Consistent...通过对这些资源的深入学习和实践,可以更好地理解和掌握一致性哈希算法在实际应用中的具体操作和性能考量。
一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。它的核心思想是通过哈希函数将对象映射到一个固定大小的环形空间中,然后将服务器也映射到这个...
js单页hash路由原理与应用实战详解.docx
这篇文章讲述的是一种基于历史信息的一致性Hash(哈希)集群重复数据删除路由策略。在这篇文章中,作者们首先提出随着全球数据量的爆炸性增长,单节点的重复数据删除系统已经不能满足性能要求,比如吞吐能力。因此,...
在本文的模型中,一致性Hash被用来确保每个分子都能被正确且高效地映射到特定的存储节点上,从而避免了数据迁移和平衡负载的复杂性。 模型的工作流程大致如下:首先,连续的折射率数据通过等宽算法被转换为离散的...
在实际应用中,一致性哈希常用于分布式缓存(如Memcached、Redis集群)、分布式数据库分片、负载均衡器等场景,帮助构建可扩展、高可用的分布式系统。 总之,`libconhash`是一个方便的C语言实现的一致性哈希库,...
利用一致性hash把不同分类的数据存储到redis集群,_把不同的分类作为一致性hash的key_hashConsistent-redis
### 分布式Session解决方案与一致性Hash详解 #### 一、问题背景及提出 ...同时,一致性Hash算法作为一种优化数据分布的技术,也在分布式环境中发挥着重要作用。开发者应根据实际场景和技术栈的特点选择最适合的方案。