前提准备
什么是哈希算法?
以我自己的理解,哈希算法就是运用哈希函数(即反映变量关系的数学公式)来解决事物之间对应关系的方法。
哈希算法产生的背景原因?
举个例子来说。想象一下我们现在有100亿本书(分别标记为book0~book10^10-1),却只有1亿个柜子(分别标记为cupboard0~cupboard10^8-1)。现在要将这些书摆放到这些柜子上,很显然的是,如果每个柜子上只放一本书的话,就会有剩下的99亿本书还没摆放。因此,必然有一些柜子上摆放的书超过了一本,即一个柜子上有多本书,这就产生了在哈希算法中称为“冲突”的现象。显然,在这种书多柜少的情况下,冲突是不可避免的。我们要做的就是,将这些书合理的分配到各个柜子上,即规划好书本和柜子的对应关系(哪本书对应哪个柜子)。而这种规划就是所谓的哈希算法,找出书本和柜子的对应关系(用哈希函数来表示)。在这个例子中,我们比较容易想到的哈希算法就是:每个柜子放100本书,将book0~book99放到cupboard0中,将book100~book199放到cupboard1中,依次类推,刚好这100亿本书可以放到这1亿个柜子中。而这种对应关系用哈希函数来表示就是:柜子序号=书本序号/100 (求整运算),运用这种关系,我们很容易就能知道哪本书放在哪个柜子中,方便快速。
评价哈希算法的好坏
当然上面这个例子的哈希函数看起来还是挺不错的,因为书本能比较均衡地放在各个柜子上。但将这个哈希函数改为:柜子序号=书本序号/10000,这样的话1个柜子上就摆放了10000本书,这样就只需要10^6个柜子就够了,还有10^8-10^6个柜子没有用到(相当于只用到了柜子资源的10^6/10^8=1%),这大大的浪费了柜子资源,使得书本资源过于集中在少数柜子资源上,增加了单个柜子的负载。因此一个良好的哈希函数要做到负载均衡。
一致性哈希
经过上面的准备,下面就可以进入正题了。
什么是一致性哈希?
其实也就是一种哈希算法,只是它着重考虑到了容错性和扩展性的一些问题。下面从它产生的背景来分析就会容易理解了。
一致性哈希产生的背景原因?
就如上面举的关于书本和柜子的例子。互联网世界也存在类似的现象。只需将书本换为客户端(可以看作是我们的电脑或手机打开的网页浏览器),将柜子换为服务器(可以看作是web服务器)。数量和上面的例子一样,客户端是100亿,服务器端是1亿。实际上,客户端和服务器也是有标记的,那就是带有唯一性的IP号(类似于我们的身份证号码)。同样的,由于客户端多、服务器少,有的单个服务器肯定要服务于多个客户端。那么我们就需要一个哈希函数来分配他们之间的对应关系(哪个客户端去访问哪个服务器)。如果按照像上面例子一样的哈希函数(当然IPV4协议的IP号是由4个字节组成的,最多表示2^32个IP地址,对IP地址的使用也有相应的限制,不同于上面的例子,但这里只是用来帮助理解,所以也无妨),IP号为0的服务器对应于IP号为0~99的客户端,IP号为1的服务器对应于IP号为100~199的客户端,依次类推。
现在容错性的问题来了。那么多服务器,总会有部分服务器由于各种原因崩溃掉,假设崩溃的是IP号为1的服务器,那么IP号为100~199的客户端将无法访问该服务器。更何况一亿台服务器,挂掉的肯定不止这么一两个,那么将会有许多用户将不能通过客户端访问到服务器。因此,怎样处理这些挂掉的服务器,怎样让这些不能连接上服务器的客户端能重新连上服务器就成了要解决的问题。这也就一致性哈希所强调的单调性。网上很多资料提到同一种方法,我也就简单的介绍一下这种方法。通过将客户端的IP号和服务器的IP号映射到同一个环形hash空间中,然后顺时针将客户端对应到相邻的服务器,如图所示:
客户端5将连接到顺时针与其相邻的服务器0,客户端155连接到服务器1,客户端370,350连接到服务器4。如果此时服务器0挂掉了,那么客户端将连接到下一个存活的服务器1。这样保证了整个系统的容错性。
同样的,为了减轻单个服务器的负载或为了服务更多的客户端,需要添加服务器,假如添加一个服务器X,那么如图所示:
由于服务器的key值在服务器1和服务器4的key值之间,因此客户端350将连接到服务器X,其他的连接将保持不变。这保证了系统的扩展性。
推荐几个链接,写得图文并茂,容易理解:
相关推荐
在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希算法通过特殊的设计,使得节点的增减对整个系统的影响降到最低。在C#环境下实现一致性哈希,可以应用于如分布式缓存、负载均衡...
在C语言实现一致性哈希时,我们需要理解以下几个核心概念: 1. **哈希函数**:一致性哈希首先依赖于哈希函数,将数据或服务器的标识映射到一个固定大小的环形空间上。通常使用模运算来实现这个过程,使得哈希值可以...
了解一致性哈希及其虚拟节点的原理和实现,对于理解和设计高可用、高性能的分布式系统具有重要意义。在实际开发中,可以参考开源工具如Java的Jedis库、Python的pylibmc等,它们都内置了一致性哈希的实现。同时,深入...
该项目可以帮助我们理解一致性哈希的工作原理,通过观察不同情况下(如添加或移除节点)数据项如何在各节点间分布,来直观感受一致性哈希的特性。 具体实现中,C#代码可能包括以下几个关键部分: 1. 哈希函数:用于...
希望本文能够帮助读者更好地理解和应用一致性哈希,解决分布式系统中的数据分布问题。 本文详细介绍了一致性哈希的工作原理和在分布式系统中的应用,包括概念解释、实现代码示例和优势分析。希望这能帮助读者深入...
而一致性哈希算法则通过特殊的哈希计算方式,使得节点的增删只会影响少量键值对的映射,从而大大降低了系统动荡的风险。 Ketama算法的核心思想是在哈希空间中分配更多的虚拟节点。每个实际的服务器节点被映射到多个...
本文将深入探讨Mycat的一致性哈希分片算法,帮助读者理解其工作原理、优势及应用场景。 一、一致性哈希简介 一致性哈希是一种分布式哈希算法,旨在解决在分布式环境中,当节点增减时,尽量减少数据迁移的问题。...
一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式...在设计和实现分布式系统时,理解并有效利用一致性哈希算法,能够极大地优化系统的架构,降低运维成本。
一致性哈希算法(Consistent Hashing)是一种在分布式系统中实现负载均衡的算法...在理解和应用一致性哈希时,需要考虑如何合理设置虚拟节点数量、选择合适的哈希函数以及优化数据分布策略,以适应不同应用场景的需求。
分布式数据插入数据库是一个复杂而关键的任务,特别是在大数据和云计算环境下。一致性哈希算法(Consistent...通过对这些资源的深入学习和实践,可以更好地理解和掌握一致性哈希算法在实际应用中的具体操作和性能考量。
一致性哈希算法的基本概念其实是一致性哈希算法也是使用取模的方法,只是刚才描述的取模法是对服务器的数量进行取模,而一致性哈希算法是对2^32取模。我们慢慢聊。 首先,我们把二的三十次方想象成一个圆,就像钟表...
通过对这些源代码的研究和分析,我们可以深入理解Netty如何利用NIO和一致性哈希算法来构建高效的端口映射服务。 总的来说,这个项目展示了Netty在构建复杂网络应用中的强大能力,同时也揭示了一致性哈希在分布式...
《基于一致性哈希的WebSocket分布式扩展与自动化持续部署实践》 在现代的互联网应用中,WebSocket作为一种双向通信协议,已经成为实时交互系统的重要组成部分。然而,随着业务量的增长,单个WebSocket服务器往往...
Ketama一致性哈希算法由Last.fm的工程师开发,其设计目标是优化分布式哈希表的性能,特别是在处理大量小键值对时。它通过引入虚拟节点的概念,提高了哈希空间的分布均匀性,减少了因节点变动导致的数据迁移。 1. **...
一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT)的算法,它主要应用于分布式缓存、负载均衡等场景,旨在解决在动态扩展或...Java项目中的实现将具体展示这一概念,帮助我们更好地理解和应用一致性哈希。
C++实现的一致性哈希库可以为开发人员提供方便的接口,直接编译成静态库或动态库,并包含示例程序帮助理解其用法。 在一致性哈希中,传统哈希函数将数据映射到固定数量的桶(例如0到2^32-1)上,但这种方法在增加或...
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可...在C/C++中实现一致性哈希,需要深入理解算法原理,并结合语言特性来优化实现。
哈希算法的选择对一致性哈希的性能和分布均匀性有直接影响。在实例中,`Flexihash_Hasher` 是一个接口或者抽象类,实际的哈希计算由继承这个类的实现类完成。 `_targetCount` 是一个内部计数器,记录当前系统的节点...