首先看一个最简单的hash函数
通过调用simple_hash对5、8、9三个值进行哈希,结果如下:
在实际应用中,HASH_RANGE是代表着一定的实际意义的,比如机器的台数,本文就以机器台数为例。当HASH_RANGE=5的时候,机器节点编号为0 ~ 4,simple_hash(5) = 0 表示key为5的数据将被放置到0号机器节点中。查询的时候,只需要将key 5进行hash得到节点号0,则可以找到节点,从而读出数据。
就这样,系统运行了一段时间,数据来来去去,天下太平。
有一天,系统中增加了一台新机器,这个时候HASH_RANGE = 6,我们会发现,5、8、9三个值的哈希值已经改变了!这意味着什么呢?在新的函数看来,原来5、8、9三个值被分配到了错误的机器上。如果有人用key=5来查询,则返回的节点此时变成了5,而不是0,显然,这次查询会失败。因为数据还在0号节点上呢!
在教科书上,HASH_RANGE被称作哈希因子。
如何才能保证机器台数的增加的情况下还等读到正确的数据呢?最简单的方法是不用机器台数作为哈希因子
,而是选取一些不变量为哈希因子。Consistency Hash就是在这种指导思想下产生的。
先通过下图看看一致性哈希的基本思想:
机器数(node)不再作为哈希因子,而是通过一个通用的hash函数哈希到[0, 2^32)的范围上,所有的key也被哈希到这个范围上,然后顺着数轴环“往前”找node,首先找到的那个就是key要存放到的机器。
Consistency Hash并不完美。当系统中有新机器加入的时候,部分key还是需要重新分布,如下图。但是,通用的hash函数还是用原来那个。从效果上看,Consistency Hash比普通hash的影响要小得多。
更多一致性哈希的内容,感兴趣的朋友可以到维基百科上阅读
。
在普通hash函数中,哈希和存储是紧耦合的,而在Consistency Hash中,哈希和存储被分离,首先通过hash来确定大致范围,再通过向前寻址的方式找到最近的节点以存储。
Hash函数存在的本质问题并没有解决,Consistency Hash只是弱化了Hash函数在算法中的地位,引入一些新思路来解决问题而已。
Remarks:
1. 文中图片截自:Memcached全面剖析
p28
2. 为了避免数据都hash到很近的地方,Consistency Hash还使用了虚拟节点的概念。即一个物理节点可能被虚拟成200个虚拟节点,并且均匀分布在环上。这种思路也很巧妙,值得学习。
分享到:
相关推荐
同时,FastDHT利用一致性哈希算法解决节点加入或离开时的数据迁移问题,保证了系统的稳定性。 FastDFS是一个开源的、高性能的文件服务器系统,常用于中小规模的企业级应用。它主要解决大容量存储和负载均衡的问题,...
它整合了API网关、服务发现、请求限流、一致性哈希路由和服务调度等多种功能,旨在简化中小团队在微服务开发过程中的复杂性,提高开发效率,并确保系统稳定性和性能。 首先,让我们深入了解API网关。API网关是...
总的来说,Dynamo的设计理念是牺牲强一致性以换取高可用性和扩展性,它的许多特性,如一致性哈希、复制协议、向量时钟和Gossip协议,都在后续的分布式键值系统如Tair中得到了应用和发展。Tair在Dynamo的基础上,将...
为了实现高可扩展性,Dynamo使用了一致性哈希来分发数据,这允许动态地添加或删除节点而不影响整体的哈希分布,降低了重新平衡数据的成本。数据被分割成多个分区(partitions),每个分区都有多个副本,分布在不同...
- **一致性哈希(Consistent Hashing)**:Dynamo采用了动态哈希表(DHTs)和一致性哈希技术,以实现数据的均匀分布和最小化的重新分布。一致性哈希对于分布式系统来说是一种有效的解决方案,可以降低节点增减或失败...
**memcached** 是一个分布式内存对象缓存系统,它用于临时存储(缓存)网络应用的...通过对源码的学习,可以更深入理解其数据结构、一致性哈希实现方式以及与其他语言的接口设计,提升你在分布式缓存领域的专业技能。
首先,Dynamo 应用了改进的一致性哈希策略,以应对节点动态增删带来的挑战。一致性哈希允许节点的加入或离开只影响到哈希环中的相邻节点,而不波及整个系统。为了平衡节点间的负载,Dynamo 引入了虚拟节点的概念,每...
2. **一致性哈希**:Dynamo使用一致性哈希算法来分发数据,这允许在添加或移除节点时,只影响少数的数据分区,减少了整个系统的中断时间。 3. **环形分区**:系统中的所有键都被映射到一个逻辑环上,每个节点负责环...
- **更好的缓存命中率:** 当服务器集群发生变化时,一致性哈希算法可以最小化缓存数据失效的数量,从而保持较高的缓存命中率。 - **动态扩展:** 支持动态地添加或移除服务器,而不会对现有的缓存数据造成太大影响...
1. **分布式键值存储**:Dynamo是一种无中心节点的分布式键值存储系统,通过一致性哈希实现数据的分布,确保负载均衡和故障容错。 2. **可扩展性**:Dynamo设计的核心目标之一是能够线性扩展,随着硬件的增加,系统...
- **一致性哈希**:在集群环境中,通过一致性哈希算法,确保数据分布均匀,即使有节点故障,影响最小。 2. **分布式集群实现**: - **程序端实现**:通过一致性哈希算法,将key映射到多台Memcached服务器上。 - ...
文档中提到的关键技术包括NWR策略、Merkle树、一致性哈希分布、数据迁移、版本合并和版本冲突处理机制。NWR是一种在分布式数据存储中常用的策略,它指的是系统必须确认写操作的N个副本、读取R个副本,并且需要W个...
一致性哈希的主要优点是,当添加或删除服务器时,只需要重新分配一小部分键,而不是全部,从而减少了对缓存的影响。此外,还可以通过设置虚拟节点(virtual nodes)来平衡哈希空间,进一步优化分布均匀性。 在实际...
Dynamo的设计理念强调高可用性、可扩展性和一致性,这些都是现代大规模分布式系统的基石。 在复习Amazon Dynamo设计时,我们首先需要理解其核心特性: 1. **全局分布式**:Dynamo将数据分布在多个数据中心,通过...
一致性哈希(Consistent Hashing)是一种特殊的哈希算法,用于解决分布式环境下的数据分布问题。它通过减少节点变化时需要重新分配的数据量来提高系统的稳定性。 ##### 2. Quorum/NRW机制 Quorum机制允许在分布式...
此外,数据分布策略(如一致性哈希)也对扩展性有直接影响。 除此之外,系统还需要具备容错能力,能够检测和恢复错误。这包括节点故障、网络分区、数据损坏等。为了保证数据安全,通常会进行定期备份,并且在出现...
使用一致性哈希算法来分配和定位数据,保证负载均衡和扩展性。 2. 版本控制:每个数据项都有一个版本号,这使得在并发更新时能够识别并解决冲突。当多个客户端同时修改同一数据时,系统可以基于版本号选择合适的...
Chord模型使用分布式哈希表来定位数据和索引,它通过一致性哈希技术将键映射到节点,从而提高了索引操作的效率。Master-Slave模型则通过主从复制的方式,来保证数据的一致性和可靠性。Hindex提出了分层索引的概念,...
在数据分布和复制方面,Cassandra使用一致性哈希和虚拟节点(Virtual Nodes)来实现数据的均匀分布和高效复制。一致性哈希有助于减少节点增加或移除时的数据迁移量。而虚拟节点则进一步优化了数据存储的均匀性,提升了...