25 | 数据分布方式之哈希与一致性哈希:“掐指一算”与“掐指两算”的事
聂鹏程
该思维导图由 AI 生成,仅供参考
你好!我是聂鹏程。今天,我来继续带你打卡分布式核心技术。
在上一篇文章中,我带你了解了分布式存储系统的三个要素:顾客、导购和货架。其中,导购实现了分布式数据存储系统中数据索引的功能,包括存储数据时确定存储位置,以及获取数据时确定数据所在位置。
那么,在分布式系统中,具体是如何实现数据索引或数据分布的呢?目前最常用的方法就是哈希和一致性哈希。
接下来,我们就一起打卡数据分布式方式中的哈希与一致性哈希吧。
首先,我们来看一下数据分布设计的原则。数据分布设计原则是分布式存储系统设计的基本原则,指导了哈希和一致性哈希方法的选择和应用。
数据分布设计原则
其实,这里的数据分布,主要就是数据分片。相信你还记得,我在第 24 篇文章中与你分享分布式存储系统的导购时,已经和你提到数据分片技术,它解决了确定数据位置的问题,并着重与你讲述了按照数据特征进行划分的分片方法。今天,我主要与你讲解按照数据范围,采用哈希、一致性哈希等对数据划分的方法。
假设,现在有上百 G 数据需要进行分布式存储,也就是要存储到不同的节点上。提到这个问题,你可能立刻就会想到很多种方法,比如随机分布、范围分布、映射分布等。那么,我们应该如何选择到底要使用哪种方法呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了分布式系统中常用的数据分布方法——哈希和一致性哈希。哈希方法通过哈希函数将数据映射到存储节点,保证数据均匀性,但在节点变动时稳定性较差。而一致性哈希通过两步哈希计算找到数据应存储的节点,解决了节点变动时大规模数据迁移的问题。文章还介绍了数据分布设计原则和哈希与一致性哈希的原理和应用场景。此外,还介绍了带有限负载的一致性哈希和带虚拟节点的一致性哈希方法,分别解决了数据不均匀和节点异构性的问题。总的来说,本文为读者提供了哈希与一致性哈希的基本原理和适用情况,为分布式系统的数据分布提供了重要参考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式技术原理与算法解析》,新⼈⾸单¥59
《分布式技术原理与算法解析》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(18)
- 最新
- 精选
- LovRNA带有限负载的一致性hash,在查询数据时,怎么确定数据存储在哪个节点上呢?
作者回复: 带有限负载的一致性hash在存储时实际是分两步走,第一步通过一致性哈希计算出一个命中节点,如果命中节点有足够的空间,则存储在命中节点上,否则按顺时针方向,依次遍历下一个节点,直到找到下一个节点为止。 查询的时候如果按照存储的方式去计算命中节点,然后再去顺时针依次遍历下一个节点,这时你就会发现问题来了。 因为,如果查询数据不存在的话,需要遍历完整个哈希环上的所有节点。这种遍历的开销就太大了,因为这是网络上的遍历,可不是单机内存内的遍历。 一种思路是,在哈希命中节点上额外添加一个索引表,用以记录命中到该节点上的数据存储在哈希环上的位置。这样在通过一致性哈希计算出命中的节点后,只需要再查询这个节点上的索引表就可以找到实际的存储节点了。 其实这个本质上就是一个解决哈希冲突的过程,你可以再回想一下我们在数据结构中的哈希表解决冲突的方法,通过对比学习,可以更进一步加深你的理解。
2019-12-21433 - Eternal本节课是分布式相关的知识点中最熟悉的一节,但是之前都是零碎的信息,没有把这四种数据分布方式进行细致的对比,这次老师的对比 让我豁然开朗。下面总结一下我的思考: 提到hash的时候,学后端的小伙伴一定会回想到数据结构课程中的hash,会想到Java的经典面试题:HashMap的原理,其实我想说的是 分布式的数据分布其实就是从基本的hash演化来的。 数据的最基本的存储组织方式:数组,所有的数据按照地址顺序放在一个列表 数组通过游标查询快,修改数据快,删除数据和插入数据需要移动数据就慢了,分配内存需要连续的内存空间,内存使用的效率低 于是链表诞生--->>> 链表修改数据快,删除数据,插入数据快,分配的内存空间不需要连续,内存使用的效率高,但是链表的查询需要遍历很慢 于是hash表诞生--->>> hash散列表存储键值对数据,key通过hash函数计算出一个hash值,这个hash值再和数据的地址做一个映射就找到数据了,hash解决 了链表的查询慢的问题;但是hash又引入了新的问题:hash函数性能损耗,hash散列不均衡,hash冲突等 这里再想想Java中的HashMap怎么优化这个问题--->>> hash函数性能损耗:通过取模(CPU的原生指令)提高效率 hash散列冲突:数组+链表 、数组+红黑树的方式解决冲突 从上面对比我想到,需求的本质就像想做数据映射,通过key和value做映射,value可能是内存地址,可能是hash值, 可能一次映射不够就做两次。 然后想想数据库的索引也就是为了做数据映射,更快更高效的对数据进行增删该查。 在分布式的场景下,我们可以迁移这些思想, 一个数如何据映射到具体节点上,这和一个值映射到具体哪个内存地址有共享。 最后--->>> 老师讲到的hash,一致性hash,有限负载的一致性hash,虚列节点的一致性hash以及它们各种特性比较。 老师总结的非常好,自己对对于这个块知识不是很清楚的地方这次也明白了: 均衡性:也就hash的分散性,老师讲的从两个维度理解。第一:每个节点的数据量要均衡分配,第二:用户访问的请求要均衡的落在每个节点 ,第二个维度可以理解为系统的热点数据访问怎么处理,不能让热点数据成为系统访问的压力,要分散它。 节点异构:我们组的系统刚好做过通过虚拟节点的一致性hash方式实现数据分布,当时一直理解的是虚拟节点再多了一次映射就是为了数据分散 更均衡,老师讲的是因为节点以后的原因,然后通过虚拟节点来实现数据分散,这个本质的今天才get到。 我有2个疑问: 1.如果相同的数据被映射到了不同的节点,空间不是就浪费了? 2.做数据分布映射的时候我们是不是需要考虑有key是单调递增的场景呢? 最后说说老师的课后问题:寻找其它数据分布的方式 散列:老师讲的hash三个都是属于这一类 范围:按照id划分,按照地区,国家,民族等自定义的维度 循环:按照一个步长循环 组合:以上三种方式按照特定场景的组合 个人认为:数据分布,数据分片,索引,hash,负载均衡实现的方式中有共性 疑问:如果我们能把数据按照页的级别分布在不同的节点上,我们是不是可以通过一个可棵 B+树 来组织分布式的数据???2019-11-23211
- 随心而至范围分区:通过确定分区键是否在一定范围内来选择分区。比如按照年龄范围分区。 列表分区:为分区分配值列表。比如按照所属国家对用户分区。 循环分区:对于n个分区,将插入顺序中的第i个元组分配给i%n分区 散列函数:将数据的某些字段通过散列函数计算得到分区号。比如Redis。 组合分区:允许上述划分方案的某些组合 参见: https://en.wikipedia.org/wiki/Partition_(database) https://dev.mysql.com/doc/refman/8.0/en/partitioning-types.html2019-11-223
- Victor老师,redis用的不是带有虚拟节点的一致性hash算法么?2020-01-0642
- 乔良qiaoliang推荐一个实现 https://github.com/golang/groupcache/blob/master/consistenthash/consistenthash.go2020-07-271
- 王爷Consistent Hash 在 Dynamo: Amazon’s Highly Available Key-value Store 一文里介绍的比较详细:最初的版本是一个节点(机器)分配一个 token;为了解决可能出现的负载不均衡, 出现了几个变种: 1. T random tokens per node and partition by token value 每个节点分配多个 token (引入 virtual node 虚拟节点概念); Cassandra 参考的 Dynamo,用的是策略一 2. T random tokens per node and equal sized partitions 在每个节点分配多个 token 的同时,将 hashing ring 分割成同等大小的分区 3. Q/S tokens per node, equal-sized partitions: 其中 Q 是分区数,S 是节点数 Redis Cluster 中将 key space 分成 16384 个 slot,之后每个节点分配一部分 slot;和上面的策略 2, 3 比较接近,都是二阶段映射(key 到分区,分区到节点)2020-04-011
- 钱很棒,哈希算法、一致性哈希算法、带虚拟节点的哈希算法之前学习过,带负载的哈希算法第一次接触,老师的对比图做的很好。 哈希算法的核心是哈希函数的选择,而且使用哈希算法必然会出现哈希碰撞的问题,解决哈希碰撞问题也有一下非常经典的方式。老师讲的带负载的哈希算法如果负载值是1就是一种解决哈希冲突的方式。 还有什么分区的方式呢?其他同学的评论也提到了一些,散列+范围(数值大小、地理区域、民族、国家)+自定义类别+组合,其他我也不知道,不过哈希算法确实非常经典。 想一想全球有几十亿人,每个人代表一条数据的话,我们被存储在地球上,通过性别、年龄、肤色、国籍、工种、文化程度、社会角色、生死、健康或疾病等等各种各样的维度划分。不过最快的获取一个人的信息的方式就是她的身份证、护照、驾照等方式,唯一标识感觉就是一个主键。如果要找具体的人,就需要时间+空间这两个维度来去定位了,这是否也是一种分区的方式呢?2020-02-191
- leslie哈希这块一直学过可是原理不清楚,为此还去学习算法了解其本源;可是像老师这样清楚的梳理还是没有明白。知其然知其所以然:明白清楚了在数据系统中的使用就更加从容了。2019-11-221
- Jackey之前这些方法也都知道,但就是说不清楚,有些也不知道叫什么名。这回终于能说明白了,感觉以后面试又可以吹一波了。至于今天的思考题…能力有限,坐等课代表科普2019-11-2211
- xingoo按照范围进行分片,典型的代表hbase。 因为它需要根据rowkey范围锁定数据存储的位置,相邻的rowkey数据会按照顺序存储在磁盘,因此在执行rowkey的单位查询时,性能非常快。为了避免单位的热点不均衡,伴随着也有很多差分和合并的机制。2019-11-221
收起评论