首页 > 其他分享 >一致性哈希的设计理念

一致性哈希的设计理念

时间:2023-06-27 21:33:25浏览次数:40  
标签:key hash 理念 simple 哈希 一致性 Hash 节点


首先看一个最简单的hash函数

#define HASH_RANGE  5
int simple_hash(int key)
{
     return key%HASH_RANGE
}

通过调用simple_hash对5、8、9三个值进行哈希,结果如下:

simple_hash(5) = 0
simple_hash(8) = 3
simple_hash(9) = 4

在实际应用中,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_FACTOR = 6
simple_hash(5) = 5 
simple_hash(8) = 2 
simple_hash(9) = 3

在教科书上,HASH_RANGE被称作哈希因子。

 

如何才能保证机器台数的增加的情况下还等读到正确的数据呢?最简单的方法是不用机器台数作为哈希因子

 

先通过下图看看一致性哈希的基本思想:

 

一致性哈希的设计理念_hash函数

机器数(node)不再作为哈希因子,而是通过一个通用的hash函数哈希到[0, 2^32)的范围上,所有的key也被哈希到这个范围上,然后顺着数轴环“往前”找node,首先找到的那个就是key要存放到的机器。

 

Consistency Hash并不完美。当系统中有新机器加入的时候,部分key还是需要重新分布,如下图。但是,通用的hash函数还是用原来那个。从效果上看,Consistency Hash比普通hash的影响要小得多。

 

一致性哈希的设计理念_memcached_02

 

 

更多一致性哈希的内容,感兴趣的朋友可以到维基百科上阅读

 

在普通hash函数中,哈希和存储是紧耦合的,而在Consistency Hash中,哈希和存储被分离,首先通过hash来确定大致范围,再通过向前寻址的方式找到最近的节点以存储。

 

Hash函数存在的本质问题并没有解决,Consistency Hash只是弱化了Hash函数在算法中的地位,引入一些新思路来解决问题而已。

 

 

Remarks:

1. 文中图片截自:Memcached全面剖析   p28

2. 为了避免数据都hash到很近的地方,Consistency Hash还使用了虚拟节点的概念。即一个物理节点可能被虚拟成200个虚拟节点,并且均匀分布在环上。这种思路也很巧妙,值得学习。

 

标签:key,hash,理念,simple,哈希,一致性,Hash,节点
From: https://blog.51cto.com/maray/6566277

相关文章

  • BASE和最终一致性
     四种性质:基本可用性,软状态,强一致性,弱一致性更据更新数据后各进程访问到数据的时间和方式不同:如何实现各种类型的一致性:对于HBase数据库来讲: ......
  • 局部敏感哈希LSH(SimHash与MinHash)
    SimHash1.算法思想假设我们有海量的文本数据,我们需要根据文本内容将它们进行去重。对于文本去重而言,目前有很多NLP相关的算法可以在很高精度上来解决,但是我们现在处理的是大数据维度上的文本去重,这就对算法的效率有着很高的要求。而局部敏感hash算法可以将原始的文本内容映射为......
  • 缓存与DB数据一致性问题解决的几个思路
    使用缓存必然会碰到缓存跟真实数据不一致的问题,虽然我们会在数据发生变化时通知缓存,但是这个延迟时间内必然会导致数据不一致,如何解决一般有下面几个思路:首先,当这个延迟如果在业务上时可以接受的,比如文章阅读、评论次数这样的缓存数据,这样的问题这里不考虑。 类似数据库分布式事务......
  • RESTful API(Representational State Transfer API)是一种设计和构建网络应用程序的软件
    RESTfulAPI(RepresentationalStateTransferAPI)是一种设计和构建网络应用程序的软件架构风格。它是一种基于HTTP协议的API设计理念,旨在实现系统的可伸缩性、简洁性、可靠性和可扩展性。RESTfulAPI的设计原则可以概括为以下几点:资源(Resource):将系统中的数据和功能抽象为资源,每......
  • 浅谈字符串哈希
    哈希HASH哈希是对于字符串的一种操作。在日常的百度搜索什么的都是根据关键字来查找,我们可以利用hash来加速这个过程。哈希的思想哈希其实是所有字符串操作中,最简单的操作了。哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能高概率重复,通过这种方式......
  • BASE最终一致性
    BASE(BasicallyAvailable,SoftState,EventuallyConsistent)是一种分布式系统设计原则,它与传统的ACID(Atomicity,Consistency,Isolation,Durability)模型相对应。在构建大规模、高可用性的分布式系统时,BASE的设计原则被广泛采用。BASE所强调的最终一致性,是指系统中的数据最终......
  • 缓存一致性如何保障
    缓存在现代应用程序中被广泛使用,用于提高性能和降低对后端数据存储系统的负载。然而,使用缓存也带来了一个重要问题:缓存一致性。在分布式系统中,缓存一致性成为了一个挑战,因为我们需要确保缓存中的数据与后端数据存储系统的数据保持同步,以避免数据不一致的情况发生。CacheAsidePa......
  • Windows NT和Linux,采用了混合内核的设计模式 混合内核(Hybrid Kernel)是一种操作系统内
    混合内核(HybridKernel)是一种操作系统内核设计模式,它结合了微内核和宏内核两种设计理念的特点。混合内核旨在提供高性能和灵活性,同时保持较强的安全性和稳定性。混合内核在内核设计中将一些关键的服务和功能放在内核空间中,同时将其他非关键的服务和功能封装成独立的用户空间进程......
  • 一致性哈希算法
    请求和后端ip地址计算hash值%2^32。把请求转给按顺时针找到的后端IP。如果后端IP挂了,原本转给其他后端IP的请求不变。为了增强均衡性,可以增加虚拟节点。参考资料nginx负载均衡/一致性哈希......
  • 数据质量的监测和管理:确保数据的准确性和一致性
    目录1.引言2.数据质量的概念3.数据质量的监测和管理3.1.数据质量度量3.2.数据质量监控工具3.3.数据质量分析和模型3.4.数据质量模型4.数据质量的监测与管理流程4.1.需求分析4.2.数据采集4.3.数据清洗4.4.数据质量度量4.5.数据分析4.6.数据质量评估4.7.数据质量治理......