星际文件系统:分布式哈希表与Kademlia算法详解
在数据存储和共享的领域中,分布式系统发挥着越来越重要的作用。本文将深入探讨分布式哈希表以及Kademlia算法在其中的应用,帮助大家理解如何在分布式环境中高效地存储和查找数据。
1. 文件版本控制与分布式哈希表基础
在使用Merkle DAG保存文件目录后,如果需要更改文件内容,使用版本控制系统是更高效的方法。可以为文件设置不同的版本,如版本1、版本2等,最简单的实现方式是使用链表。
在IPFS中,数据存储的关键在于哈希值。为了便于理解,我们先以简单的哈希表为例,如下表所示:
| Key | Value |
| — | — |
| 2 | Cat |
| 5 | Unicorn |
| 9 | Elephant |
| 11 | Horse |
| 4 | Rhino |
| 101 | Blue Parrot |
| 33 | Dragon |
在实际的IPFS中,键是哈希值,值是文件或目录的名称及内容。假设我们有四个节点,每个节点负责存储特定的键:
| Node | Keys |
| — | — |
| A | 2, 9, 11 |
| B | 5 |
| C | 4, 33 |
| D | 101 |
这种方式通过中央服务器来管理节点和键的对应关系。当需要访问键5时,请求者需先询问中央服务器,得知由节点B负责,再向节点B请求数据,节点B返回“Unicorn”。这种方法高效但存在中央服务器单点故障的问题,例如Napster就采用了这种方式,容易受到攻击。
另一种方式是向所有节点询问哪个节点持有特定键,如Gnutella的做法,这种方式虽然能抵御审查和攻击,但会给节点和数据请求者带来较大负担,被称为“洪泛”,适用于比特币但不适合IPFS。因此,分布式哈希表技术应运而生,Kademlia算法就是其中之一,它由Petar Maymounkov和David Mazières在2002年创建,后来被eDonkey文件共享平台使用。
2. 数据与节点的“接近性”概念
在分布式哈希表中,我们根据“接近性”将数据存储在特定节点,而不是每个节点都存储所有数据。这意味着我们不仅要考虑节点之间的距离,还要考虑数据与节点之间的距离。
假设每个节点在分布式哈希表中有一个1到1000之间的唯一ID,我们有以下10个节点:
| Node ID |
| — |
| 5 |
| 13 |
| 45 |
| 48 |
| 53 |
| 60 |
| 102 |
| 120 |
| 160 |
| 220 |
同时,我们有一些数据,为了便于演示,将其转换为1到1000之间的随机数:
| Key | Data |
| — | — |
| 54 | Unicorn |
| 2 | Pegasus |
| 100 | Cat |
| 900 | Donkey |
| 255 | Horse |
若要将“Unicorn”数据存储在最近的四个节点,首先查看键为54,然后找到节点ID列表中最接近54的四个节点,即45、48、53和60,将“Unicorn”数据存储在这些节点。同理,“Cat”数据的键为100,其最近的四个节点是53、60、102和120,将“Cat”数据存储在这些节点。在计算距离时,我们将数据视为节点,数据和节点共享同一空间。
3. XOR距离
在Kademlia中,使用XOR距离来衡量节点和数据之间的距离,而不是十进制减法。例如,3和6的XOR距离是5,计算过程如下:
3的二进制表示为011,6的二进制表示为110,进行XOR运算:
011
110
---xor
101
101的十进制是5。
XOR距离具有以下有用的属性:
-
自距离为0
:一个节点到自身的XOR距离为0。例如,节点ID为5的二进制是0101,与自身进行XOR运算:
0101
0101
----xor
0000
- 对称性 :不同节点之间的距离是对称的,如4和8的XOR距离与8和4的XOR距离相同。4的二进制是0100,8的二进制是1000,计算如下:
0100
1000
----xor
1100
1000
0100
----xor
1100
- 三角不等式 :节点X和节点Z之间的距离小于或等于节点X和节点Y的距离加上节点Y和节点Z的距离。这一属性使得节点在Kademlia分布式哈希表中可以通过中间节点找到其他节点。
在Python中,可以使用
^
运算符进行XOR运算,使用
bin
函数将十进制数转换为二进制,使用
int
函数将二进制数转换为十进制:
# XOR运算
print(5 ^ 11) # 输出14
# 十进制转二进制
print(bin(5)) # 输出'0b101'
# 二进制转十进制
print(int('0b101', 2)) # 输出5
4. 节点的桶结构
节点在分布式哈希表中不会保存所有其他节点的地址,其保存的节点数量取决于节点的位数和
k
配置数。
以二叉树为例,树的叶子节点数量呈2的幂次方增长,如2、4、8、16等,可表示为$2^1, 2^2, 2^3, 2^4, 2^5 … 2^n$。如果树有16个叶子节点,需要用4位二进制数表示叶子节点编号;如果有64个叶子节点,则需要6位二进制数。
节点的桶数量与分布式哈希表中使用的位数相同。例如,在有16个叶子节点的树中,节点有四个桶,每个桶对应一个位。
假设节点ID为3,
k
值为2,其桶的分配如下:
-
第一个桶
:对应树的另一半(节点不所在的那一半),有八个节点,但由于
k
值为2,选择节点11和14。
-
第二个桶
:将节点所在的半棵树再分割,第二个分支(节点ID为4 - 7)作为第二个桶,有四个节点,选择节点4和5。
-
第三个桶
:将节点所在的分支再分割,第一个小分支(节点ID为0 - 1)作为第三个桶,有两个节点,全部保存。
-
第四个桶
:将节点所在的小分支再分割,包含节点3的分支作为第四个桶,保存该节点。
下面是节点查找其他节点的示例:假设
k
配置数为1,源节点ID为3,在有16个叶子节点的树中,第一个桶保存了节点ID为10。当节点3要查找节点ID为13时,会向节点10请求帮助,节点10将节点14提供给节点3,节点3再向节点14请求,节点14将节点12提供给节点3,最后节点12将节点13提供给节点3。
在计算机科学中,到达目标节点所需的最坏情况下的跳转次数为$2 log n + c$,其中
n
是树的叶子节点数量,
c
是常数。
在实际情况中,树会存在空分支和空叶子。例如,有1024($2^{10}$)个叶子节点的树,
k
值为3,当添加新节点时,如果桶已满,会先检查最不常用的节点是否存活,若不存活则替换,若都存活则拒绝新节点,以避免新节点淹没系统。
以上就是Kademlia算法的基本原理和工作方式,它还有其他重要方面,如节点每小时需要重新发布键和值,以及加速查找算法等。
星际文件系统:分布式哈希表与Kademlia算法详解
5. Kademlia算法的其他重要方面
除了前面介绍的路由算法,Kademlia算法还有一些其他重要的特性和操作。
5.1 节点插入与信息同步
当一个新节点插入到Kademlia网络中时,它需要告知老节点自己的存在,同时从老节点获取联系人信息。具体步骤如下:
1.
节点宣告
:新节点向网络中的已知节点发送消息,宣告自己的加入。
2.
信息交换
:老节点收到宣告后,会将自己的部分联系人信息发送给新节点,新节点也会将自己的信息发送给老节点。
3.
桶更新
:新节点根据收到的联系人信息更新自己的桶结构,老节点也会更新自己的桶结构以包含新节点。
在某些情况下,即使源节点不位于某个分支,当该分支的有效节点数量达到
k
时,也会进行分支分割。这是为了确保节点能够保存所有有效的节点信息。
5.2 数据重发布
为了应对老节点离开和新节点加入的情况,节点需要每小时重新发布键和值(数据)。这样可以保证数据始终存储在距离较近、更适合保存数据的节点上。具体流程如下:
1.
定时触发
:节点内部设置定时器,每小时触发一次数据重发布操作。
2.
数据检索
:节点从本地存储中检索需要重发布的键和值。
3.
重新存储
:根据当前的网络拓扑和节点距离,将数据重新存储到合适的节点上。
5.3 加速查找算法
为了减少节点查找其他节点时的步骤,Kademlia算法采用了加速查找算法。其基本思想是利用节点之间的距离信息,优先查询距离目标节点较近的节点。具体操作如下:
1.
初始查询
:源节点向自己桶中距离目标节点最近的节点发送查询请求。
2.
邻居反馈
:被查询的节点返回自己桶中距离目标节点更近的节点信息。
3.
迭代查询
:源节点根据反馈信息,继续向更近的节点发送查询请求,直到找到目标节点或达到查询上限。
6. 总结与应用场景
Kademlia算法作为分布式哈希表的一种实现,具有高效、可扩展和容错等优点,在许多领域都有广泛的应用。
6.1 优点总结
- 高效查找 :通过XOR距离和桶结构,节点可以快速定位到目标节点,减少查找时间。
- 可扩展性 :随着节点数量的增加,算法的性能不会显著下降,能够适应大规模网络。
- 容错性 :即使部分节点失效,节点仍然可以通过中间节点找到目标节点,保证网络的连通性。
6.2 应用场景
- 文件共享 :如eDonkey等文件共享平台,利用Kademlia算法实现文件的分布式存储和查找。
- 区块链 :在一些区块链网络中,Kademlia算法用于节点发现和数据同步,确保节点之间的高效通信。
- 分布式计算 :在分布式计算系统中,节点可以通过Kademlia算法快速找到其他计算节点,实现任务的分配和协作。
7. 流程图总结
下面是Kademlia算法中节点查找过程的mermaid流程图:
graph TD;
A[源节点] -->|查询目标节点| B[最近节点1];
B -->|返回更近节点| A;
A -->|查询更近节点| C[更近节点2];
C -->|返回更近节点| A;
A -->|查询更近节点| D[目标节点];
D -->|返回数据| A;
通过本文的介绍,我们对分布式哈希表和Kademlia算法有了更深入的理解。Kademlia算法通过巧妙的设计,解决了分布式系统中节点查找和数据存储的难题,为各种分布式应用提供了坚实的基础。在实际应用中,我们可以根据具体需求对算法进行优化和调整,以满足不同场景的要求。
8. 相关操作总结列表
-
XOR距离计算
:
- 将十进制数转换为二进制数。
- 对二进制数进行XOR运算。
- 将结果转换回十进制数。
-
节点桶结构分配
:
- 根据树的叶子节点数量确定所需的二进制位数。
- 确定节点的桶数量(与二进制位数相同)。
-
按照
k配置数选择每个桶中的节点。
-
节点查找过程
:
- 源节点向自己桶中距离目标节点最近的节点发送查询请求。
- 接收节点返回自己桶中距离目标节点更近的节点信息。
- 源节点根据反馈信息继续查询更近的节点,直到找到目标节点。
-
数据重发布
:
- 每小时定时触发数据重发布操作。
- 从本地存储中检索需要重发布的键和值。
- 根据当前网络拓扑和节点距离,将数据重新存储到合适的节点上。
Kademlia算法与分布式哈希表解析
超级会员免费看
78

被折叠的 条评论
为什么被折叠?



