P2P系统,一致性哈希和DHT

摘要:
数据网格产品经常会使用P2P进行通信,借此机会系统地学习一下P2P网络和其资源搜索策略。常见的P2P系统主要有UnstructuredNetwork和StructuredNetwork两种架构。常见的结构化P2P网络通常实现一致性哈希或者其变种分布式哈希表DHT分配文件的所有权到特定的结点。3一致性哈希3.1构造将结点和数据映射到同一个线性地址空间,结点负责保存前一结点到本结点之间的数据。DHT使用一致性哈希的思想来最小化拓扑结构变化带来的影响,并构造overlay网络实现高效地搜索。

数据网格产品经常会使用P2P进行通信,借此机会系统地学习一下P2P网络和其资源搜索策略。

1 P2P网络架构

谈到P2P就涉及到一个概念:Overlay Network(覆盖网络)。所谓覆盖网络是应用层网络,几乎不考虑网络层和物理层,它具体指的就是建立在另一个网络上的网络。例如P2P网络就是覆盖网络,因为它运行在互联网之前,但允许对未知IP主机的访问。通过DHT等算法,可以在事先不知道IP地址的情况下,访问到存储某个文件的结点。

P2P系统,一致性哈希和DHT第1张

常见的P2P系统主要有Unstructured NetworkStructured Network两种架构。

1.1 Unstructured Network

非结构化的P2P网络并不给覆盖网络强加某种特定架构,而是结点间随机形成链接。最流行的P2P网络,像BittorrenteMuleGnutellaKazaa等都是非结构化的P2P协议。因为缺少结构,所以网络面对频繁的动态添加和删除结点时,依然能够健壮地运行。但也正因为缺少结构,所以当某个结点想要搜索某些数据或文件时,查询必须flood整个网络(详见1.3搜索策略)

P2P系统,一致性哈希和DHT第2张

1.2 Structured Network

结构化P2P网络将覆盖网络组织成某种特定的拓扑结构,并且它的协议能够保证:任何结点都能高效地搜索网络中的资源,即使资源是非常冷门的。常见的结构化P2P网络通常实现一致性哈希或者其变种分布式哈希表DHT分配文件的所有权到特定的结点。

P2P系统,一致性哈希和DHT第3张

1.3搜索策略

两种P2P网络可以使用不同的检索策略:中央索引、本地索引和分布式索引。分布式索引策略是对其他两种策略的权衡。

P2P系统,一致性哈希和DHT第4张

中央索引(中央服务器)

由一个中央服务器统一保存资源与结点的关系。这种方式搜索效率比较高,因为可以通过中央索引直接定位到目标结点,然而这种方式有时并不可行,特别是集群规模特别大时。

P2P系统,一致性哈希和DHT第5张

本地索引(flooding搜索)

每个结点保存自己的资源信息,当寻找不属于自己的资源时,会flooding整个网络进行寻找。这种flooding的方式会在网络中引起大量的traffic,并使每个结点都要处理查询请求而导致高CPU和内存使用率。并且flooding不保证通信质量,所以flooding也无法保证一定能够找到保存指定数据的那个结点。因为热数据在多个结点上存在,所以比较容易搜索成功。反之,冷数据只在很少的结点上存在,所以搜索很可能会以失败告终。并且搜索效率也很低,也容易导致安全问题。

P2P系统,一致性哈希和DHT第6张

分布式索引

为了高效地在网络中搜索,结点需要保存满足特定条件的邻居的列表,这使得整个网络在高频率的添加删除结点时,没有非结构化网络那样健壮。使用DHT路由的结构化P2P网络的著名软件有BitTorrentKad Network,以及各种研究项目Chord等。基于DHT的网络在网络计算系统中也有广泛的应用,它帮助实现高效的资源发现和应用程序调度等

典型的P2P网络使用的架构和搜索策略如下:

P2P系统,一致性哈希和DHT第7张

2基本的分区算法

经典的分区算法有直接取模和哈希取模。假设有K台服务器,我们可以这样确定数据X所在的服务器i

Ø直接取模i = X mod k:问题是数据分布不均匀。

Ø哈希取模i = hash(X) mod k:问题是1)根据集群和数据规模,散列冲突可能会比较严重(只能通过替换更好的哈希算法来平衡)2)扩容添加结点或故障删除结点时(k->k±1),所有数据都要重新映射到新的结点上(通过后面介绍的两种分布式哈希可以解决)

P2P系统,一致性哈希和DHT第8张

3一致性哈希

3.1构造

将结点和数据映射到同一个线性地址空间,结点负责保存前一结点到本结点之间的数据。

P2P系统,一致性哈希和DHT第9张

3.2 Lookup过程

首先,蓝色结点确定红色结点负责保存key1。然后,蓝色结点将lookupinsert请求发送给红色结点。所以lookup过程的算法复杂度是O(1)

P2P系统,一致性哈希和DHT第10张

3.3添加删除结点

当添加删除结点时,影响的只是很小的一部分数据。

P2P系统,一致性哈希和DHT第11张

4分布式哈希表

分布式哈希表DHT是一种概念模型或者说思想,其主要思路是:将每条文件索引K文件名或其他属性的哈希值-V存储文件的结点IP地址,组成一张巨大的文件索引哈希表。然后,再将这张大表按照一定规则分割成许多小块,并分布到各个结点上,每个结点负责维护其中一块。DHT使用一致性哈希的思想来最小化拓扑结构变化带来的影响,并构造overlay网络实现高效地搜索

首先,将结点和数据映射到同一个线性地址空间,每个结点只负责地址空间中的一部分数据,但结点负责的信息通常是有重叠和冗余的。通常我们将这个线性地址空间看成一个环:

P2P系统,一致性哈希和DHT第12张

逻辑上地址空间形成的环对应着底层的物理拓扑结构,要注意的是真正的(underlay)的拓扑结构和逻辑的(overlay)拓扑结构通常是无关联的:

P2P系统,一致性哈希和DHT第13张

根据不同的DHT实现,查找过程会有不同。但不同的算法实现都类似于下图所示的过程,在地址空间中利用各种算法高效地找到负责保存数据的结点。注意,最后找到的数据分为两种:

Øvalue就是我们要找的数据,它直接存储在结点上,这对于数据量不大的情况来说比较合适。

Øvalue不是我们要找的数据,而是数据存储在另一台机器的地址信息(如下图所示)。这种间接的存储方式多了一步数据的获取,但是对于大文件的存储来说更加合适。

P2P系统,一致性哈希和DHT第14张

5 Chord实现

接下来要介绍的是最常见的MITChordDHT实现。

4.1 Chord环和Finger

首先,Chord使用SHA-1哈希函数(生成160位的id)和取模:

ØNode-id = SHA1(IP/mac)

ØKey-id = SHA1(key)

Øid-space modP2P系统,一致性哈希和DHT第15张

4.2 Lookup过程

对于Chord版的DHT实现来说,这种Lookup过程是通过一张叫做Finger表的路由表来完成的,它根据计算数据id指数级增长时对应的各个结点,形成表中的信息:

P2P系统,一致性哈希和DHT第16张

在没有finger表的情况下,需要不断访问后继结点继续lookup,即O(n)跳才能找到目标结点:

P2P系统,一致性哈希和DHT第17张

有了finger表,就可以实现O(logN)的高效lookup

P2P系统,一致性哈希和DHT第18张

5算法复杂度对比

除了搜索/路由外,其他几项都是DHT占优:

P2P系统,一致性哈希和DHT第19张

参考资料

1 Princeton -P2P Systems and Distributed Hash Tables

2 Overlay Networkhttp://en.wikipedia.org/wiki/Overlay_network

3 Peer-to-Peerhttp://en.wikipedia.org/wiki/Peer-to-peer

4 Structured Homogenous P2P Overlay Networks

5memcached全面剖析--4. memcached的分布式算法

免责声明:文章转载自《P2P系统,一致性哈希和DHT》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Eclipse中SVN的安装步骤(两种)和使用方法linux高编信号-------令牌桶实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决单点问题,方法就是堆机器,堆应用吗?---一致性哈希算法的计算思想

转载面试官常问的“一致性哈希”  大家好,好久不见啦。最近快年底了,公司、部门事情太多:冲刺 KPI、做部门预算……所以忙东忙西的,写文章就被耽搁了。再加上这篇文章比较硬,我想给大家讲得通俗易懂,着实花了很多时间琢磨怎么写。 话不多说,小故事开始。 前言 当架构师大刘看到实习生小李提交的记账流水乱序的问题的时候,他知道没错了:这一次,大刘又要用一致性哈希...

MongoDB地理空间(2d)索引创建与查询

LBS(Location Based Services)定位服务,即根据用户位置查询用户附近相关信息,这一功能在很多应用上都有所使用。基于用户位置进行查询时,需要提供用户位置的经纬度。为了提高查询速度,MongoDB为坐标平面查询提供了专门的索引,称作地理空间(2d)索引。 1. 创建地理空间索引 地理空间索引又称为2d索引。创建其它形式的索引,我们会按升...

创建索引之代码开发

【创建索引库】 使用indexwriter对象创建索引。 【实现步骤】 (1)创建一个java工程,并导入jar包。 (2)创建一个indexwriter对象。         1)指定索引库的存放位置Directory对象。         2)指定一个分析器,对文档内容进行分析。 (3)创建Document对象 (4)创建filed对象,将field添...

ES数据架构与关系数据库Mysql

ES数据架构的主要概念(与关系数据库Mysql对比)     MySQL     ElasticSearch Database Index Table Type Row Document Column Field Schema Mapping Index Everything is indexed SQL Query DSL...

mysql explain中key_len的计算

ken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断是否所有的索引字段都被查询用到。 key_len显示了条件检索子句需要的索引长度,但 ORDER BY、GROUP BY 子句用到的索引则不计入 key_len 统计值; 关于 key_len 的计算规则: • 当索引字段为定长数据类型,比如:char,in...

(十三)MySQL锁机制

1.常见问题 MySQL支持的锁有哪些?有哪些使用场景? 什么是读写锁?什么是排他锁? 行锁是什么?有哪些分类,原理是什么? 死锁是如何产生的? 如何解决死锁? 2.锁的分类 从锁的粒度上分MySQL支持的锁 表级锁 行级锁(InnoDB) 页级锁(BDB) 从锁的操作上可以分为 读锁 写锁 从实现方式上分 乐观锁 悲观锁 使...