`
flychao88
  • 浏览: 753244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分布式哈希和一致性哈希

 
阅读更多

分布式哈希和一致性哈希

分布式哈希和一致性哈希是分布式存储和p2p网络中说的比较多的两个概念了。介绍的论文很多,这里做一个入门性质的介绍。

 

 

分布式哈希(DHT)

 

两个key point:每个节点只维护一部分路由;每个节点只存储一部分数据。从而实现整个网络中的寻址和存储。

 

 

DHT只是一个概念,提出了这样一种网络模型。并且说明它是对分布式存储很有好处的。但具体怎么实现,并不是DHT的范畴。

 

 

一致性哈希:

 

DHT的一种实现。本质还是一个哈希算法。回想平时我们做负载均衡,按querystring签名对后端节点取模是最简单也是最常用的算法,但节点的增删后所造成的问题显而易见,原有的请求几乎都落不到同一台机器上。优化一点的是carp算法(用机器ip和query一起做hash,选取hash值最小的一台),只让1/n的数据受到影响。

 

一致性哈希,似乎最早提出是在分布式缓存里面的,让节点震荡的时候,影响最小。不过现在已经应用在分布式存储和p2p系统里面。

 

一致性哈希也只是提出四个概念和原则,并没有提及具体实现:

 

1、balance:哈希结果尽可能的平均分散到各个节点上,使得每个节点都能得到充分利用。

 

2、Monotonicity:上面也说了,如果是用签名取模算法,节点变更会使得整个网络的映射关系更改。如果是carp,会使得1/n的映射关系更改。一致性哈希的目标,是节点变更,不会改变网络的映射关系。

 

3、spread:同一份数据,存储到不同的节点上,换言之就是系统冗余。一致性哈希致力于降低系统冗度。

 

4、load:负载分散,和balance其实是差不多的意思,不过这里更多是指数据存储的均衡,balance是指访的均衡。

 

 

Chord算法:

 

一致性哈希有多种实现算法,最关键的问题在于如何定义数据分割策略和节点快速查询。

 

chord算是最为经典的实现。cassandra中的DHT,基本是chord的简化版。

 

网络中每个节点分配一个唯一id,可以通过机器的mac地址做sha1,是网络发现的基础。

 

假设整个网络有N 个节点,并且网络是呈环状。两个节点间的距离定义为每个节点会存储一张路由表(finger表),表内顺时针按照离本节点2、4、8、16、32.……2i的距离选定log2N个其他节点的ip信息来记录。

 

存储方面:数据被按一定规则切割,每一份数据也有一个独立id(查询key),并且和节点id的值域是一样的。然后查找节点,如果存在和数据id一样的节点id,则将这份数据存在该节点上;如果不存在,则存储到离该数据id距离最近的节点上。同时,为了保证数 据的可靠性,会顺时针往下找K个冗余节点,存储这份数据。一般认为K=3是必须的。

 

查询方面:先从自己的路由表中,找一个和数据id距离最近、并且存活在网络中的节点next。如果该节点的 id巧合和数据id相等,那么恭喜你。如果不相等,则到next进行递归查找。一般或需要经过多次查询才能找到数据所在的节点,而这个次数是可以被证明小 于等于log2N的。

 

在这个查询的过程中就体现了路由表的选取优势了,其实是实现了一个二分查找,从每个节点来观察网络,都是将网络分成了log2N块,最大一块里面有N/2个节点。路由表里面其实是记录了每一块的第一个节点。这样每一次查询,最少排除了一半的节点。保证在 log2N次内找到目标节点。

 

新增一个节点i,需要预先知道网络中已经存活的一个节点j,然后通过和节点j交互,更新自己和其他节点的路由表。并且,需要将离自己距离最近的节点中的数据copy过来,以提供数据服务。

 

损失一个节点,路由算法会自动跳过这个节点,并且依靠数据的冗余来持续提供服务。

 

 

KAD算法(Kademlia)

 

kad算法其实是在chord上做的优化。主要是两个点:

 

1、用二进制(32/64/128)表示一个节点的id,两节点的id异或运算得到节点间的距离。

 

2、 每个节点保持的路由信息更丰富,同样是将整个网络按照划分成log2N份,在chord中,是保持log2N个路由节点,但在kad里面,是保存了 log2N个队列。每个队列长度为配置值K,记录网络中对应节点区域的多个节点,并且根据活跃时间对这些节点进行换入换出。

 

第一点是方便进行网络划分,节点按照二进制中每一bit的0或1建成一棵二叉树。

 

第二点是使得节点查询更迅速。从分割情况我们就可以得知,最坏情况不会差于chord,但保存更多的节点使得命中概率更高。另外队列中根据活跃时间进行换入换出,更有利于在p2p这种节点变更频繁的网络中快速找到有效的节点。

分享到:
评论

相关推荐

    分布式哈希表和一致性哈希

    分布式哈希表(Distributed Hash Table,简称DHT)是一种在分布式系统中用以实现大规模数据存储和快速定位的算法。DHT通过分布式的方式将数据以键值对的形式存储在各个节点上,从而实现无需中心服务器的高效数据管理...

    分布式哈希表 Pastry.zip

    分布式哈希表(Distributed Hash Table,DHT)是一种用于分布式系统中的数据存储技术,它将数据分散存储在多台独立的设备...Pastry 的设计和实现对于理解分布式系统、一致性哈希以及 Go 语言的应用有着重要的学习价值。

    分布式哈希表(Distributed Hash Table DHT)1

    DHT通常采用Chord、Pastry、Kademlia等一致性哈希算法来实现这种映射关系。 ### 2. 环的原子管理算法 #### 2.1 环管理中存在的问题 在分布式系统中,节点的加入、离开以及网络的动态变化会导致环的不稳定性。这些...

    哈希表-使用C++实现的分布式哈希表.zip

    5. 考虑一致性问题,如CAP定理(一致性、可用性和分区容错性),并选择适合的模型,如最终一致性或强一致性。 6. 优化通信效率,例如通过批量传输减少网络开销,或者使用异步I/O模型提高并发性能。 在实际项目中,...

    FastDHT-分布式哈希系统

    每个节点都可以接收和处理来自客户端的请求,然后根据一致性哈希算法将数据分发到适当的节点。当节点发生故障时,其他节点可以接管其责任,保持服务的连续性。同时,FastDHT可能会采用副本机制,将数据在多个节点间...

    哈希表-使用Go实现的用于IB-Trust的分布式哈希表.zip

    在给定的压缩包文件中,“哈希表_使用Go实现的用于IB-Trust的分布式哈希表”可能是实现上述概念的一个具体项目。这个项目可能包含了DHT的实现代码,包括节点管理、路由算法、数据存储和一致性策略等部分。通过对该...

    基于一致性哈希算法的分布式数据库高效扩展方法.pdf

    一致性哈希算法最初由麻省理工学院的K等人提出,并被广泛应用于分布式系统中,以解决节点动态变化时数据一致性问题。其核心思想是通过引入哈希环,将数据对象均匀分布在哈希环上的不同节点中,以此降低节点变更对...

    分布式存储系统中改进的一致性哈希算法.pdf

    整体来看,文章介绍的改进一致性哈希算法,通过在分布式存储系统中对节点进行逻辑划分、引入主从模式以及分析不同读写策略的数据一致性,旨在提升系统的性能和可靠性。这对于推动分布式存储系统的进一步发展具有重要...

    基于分布式哈希表的分布式子空间聚类算法.pdf

    分布式表决作为一种数据汇总的手段,在多个节点上独立计算后汇总信息,以实现一致性决策或结果。 文章最后提到了对等网络(Peer-to-Peer,P2P)的概念,这是一种网络结构,其中每个节点既是客户端又是服务器,节点...

    基于一致性哈希算法的分布式数据库高效扩展方法研究.pdf

    在P2P环境中,一致性哈希还利用分布式哈希表(DHT)的优势,进一步优化了数据的分布和检索效率。 分布式数据库的特点在于逻辑上的统一与物理上的分散。在实际应用中,随着业务需求的增加,数据库节点可能需要动态...

    一致性哈希算法在分布式系统中的应用.pdf

    一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式系统已经成为支撑大规模服务的关键技术之一。在分布式系统中,多个节点通过网络协同工作,提供高可用性...

    使用RabbitMQ+延迟队列实现分布式事务的最终一致性方案

    传统的ACID(原子性、一致性、隔离性和持久性)事务在分布式环境中难以实现,因为它们可能导致性能下降或者锁竞争问题。为了解决这一问题,我们可以采用“最终一致性”策略,即允许在一段时间内数据存在短暂不一致,...

    深入探讨一致性哈希:分布式系统中的应用与优势

    一致性哈希(Consistent Hashing)是一种特殊的哈希算法,它在分布式缓存和负载均衡等场景中被广泛应用。它通过将数据和服务器节点映射到一个哈希环上,提供了一种在节点增减时能够最小化数据重新分配的机制。本文将...

    基于C# 实现的一致性哈希算法

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它解决了在分布式环境中数据分片和负载均衡的问题。在传统的哈希算法中,如果增加或减少服务器节点,会导致大量数据重新分配,而一致性哈希...

    分布式存储系统中一致性哈希算法的研究.pdf

    分布式存储系统是一类将数据分布存储于多个物理节点上的系统,其设计目的是为了实现数据的可靠存储、高效访问和动态扩展...尽管存在一些需要改进的地方,但一致性哈希算法已经成为分布式系统领域研究和实践的重要基础。

    解决分布式数据插入数据库~一致性hash算法

    在文件名为“distribute-mysql”的压缩包中,可能包含了关于如何在Java环境中利用一致性哈希实现在MySQL分布式环境中的数据插入、查询以及优化等方面的代码示例和指南。通过对这些资源的深入学习和实践,可以更好地...

    一致性哈希算法及其在分布式系统中的应用

    ### 一致性哈希算法及其在分布式系统中的应用 #### 摘要 一致性哈希算法是一种用于解决分布式系统中节点动态变化导致的数据重新分布...在现代分布式系统的设计和实践中,一致性哈希算法已成为不可或缺的核心技术之一。

    带虚拟节点的一致性哈希

    一致性哈希(Consistent Hashing)是一种分布式哈希算法,主要应用于分布式缓存、负载均衡等领域,例如Memcached和Redis等系统。它解决了在分布式环境中数据分片与节点动态增减时,尽量减少数据迁移的问题。带虚拟...

    一致性哈希与Chord1

    【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入虚拟节点来优化一致性哈希的分布问题。 1. **普通哈希算法**: - Java中的`HashMap`类是一个典型...

Global site tag (gtag.js) - Google Analytics