23、星际文件系统:Kademlia算法深度解析

星际文件系统:Kademlia算法深度解析

1. 文件版本管理与分布式网络基础

在保存文件目录时,若要更改文件内容,使用版本管理系统是更高效的解决办法。文件可以有版本1、版本2、版本3等,实现版本管理最简单的方式是使用链表。

在IPFS中,保存文件的关键是哈希,值是文件或目录的名称以及内容。如果构建的是集中式系统,只需添加一些其他功能,就能创建一个基于哈希保存和搜索文件的软件,类似SQLite或LevelDB这样的数据库。但IPFS是一种点对点的文件系统,类似于数据库却分布在各处,即分布式哈希表。

IPFS使用Kademlia的扩展版本S/Kademlia作为分布式哈希表。为了更好地理解Kademlia,我们先看看它的前身。

假设有一个类似Python字典的哈希表,如下所示:
| 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. 数据与节点的接近性概念

在分布式哈希表中,不会将数据放在每个节点,而是根据接近性概念将数据放在特定节点,即数据和节点之间有距离的概念。

假设分布式哈希表中每个节点的ID在1到1000之间,且每个节点ID唯一,最多有1000个节点。这里假设有10个节点:
| Node ID |
| — |
| 5 |
| 13 |
| 45 |
| 48 |
| 53 |
| 60 |
| 102 |
| 120 |
| 160 |
| 220 |

还有一些数据,这里简化为字符串:
| Data |
| — |
| Unicorn |
| Pegasus |
| Cat |
| Donkey |
| Horse |

为了判断数据与节点的距离,需将数据转换为1到1000之间的数字。实际中可对数据进行哈希,这里为了演示,随机分配数字:
| Key | Data |
| — | — |
| 54 | Unicorn |
| 2 | Pegasus |
| 100 | Cat |
| 900 | Donkey |
| 255 | Horse |

若要将“Unicorn”数据存储在四个最近的节点,首先查看键54,从节点ID列表中找到最近的四个节点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是异或操作,1 XOR 0是1,1 XOR 1是0,0 XOR 0是0,0 XOR 1是1。

011
110
---xor
101

101的二进制对应十进制的5。

XOR距离有几个有用的属性:
- 节点到自身的XOR距离为0。例如,ID为5的节点,其自身的XOR距离为0,因为5的二进制0101与自身异或结果为0000。

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分布式哈希表中的节点不会保存所有其他节点的地址,只会保存部分节点地址,但可以通过中间节点到达其他节点。

当考虑使用XOR距离时,两个数字共享的前缀越多,它们之间的距离越短。例如,5和4共享三个公共前缀,距离为1:

0101
0100
----xor
0001

14和15的距离也为1:

1110
1111
----xor
0001

但如果位差异在左侧,如5和13,距离可能较大,为8:

0101
1101
----xor
1000

在Python中,可以使用 ^ 运算符进行异或运算:

>>> 5 ^ 11
14

可以使用 bin 函数将十进制数转换为二进制:

>>> bin(5)
'0b101'

使用 int 函数将二进制数转换回十进制:

>>> int('0b101', 2)
5
4. 桶的概念

了解XOR距离后,来看节点如何保存其他节点的地址。节点不会保存分布式哈希表中的所有其他节点,能保存的节点数量取决于节点的位数和k配置数。

以树的结构为例,从最小的有2个叶子的树开始,每次翻倍,叶子数依次为2、4、8、16……可以写成$2^1$、$2^2$、$2^3$、$2^4$、$2^5$ …… $2^n$。

以有16个叶子的树为例,表示叶子编号需用4位二进制数,如0001或0101。有64个叶子的树,需用6位二进制数。位数越大,节点需在地址簿中保存的节点数量越多。

k配置数决定了节点在一个桶中最多能保存的节点数量,桶的数量与分布式哈希表中使用的位数相同。在有16个叶子的树中,桶的数量是4。

假设节点ID为3,k值为2。第一个桶对应最左边的位,对应节点所在树的另一半,有8个节点,但只能保存2个,选择节点11和14。然后将节点所在的半棵树再划分,第二个桶是包含节点4到7的分支,选择节点4和5。接着将节点3所在的分支再划分,第三个桶是包含节点0和1的小分支,保存这两个节点。最后,第四个桶是包含节点3的微小分支,保存这一个节点。

下面是节点查找另一个不在其地址簿中的节点的示例:假设k配置数为1,源节点是ID为3的节点,在有16个叶子的树中。第一个桶(ID 8到15的节点所在的最大分支)中,节点3保存了节点10。节点3想找到节点13,它向节点10请求帮助,节点10将节点14给节点3,节点3再向节点14请求,节点14将节点12给节点3,节点3再向节点12请求,最终节点12将节点13给节点3。

在这个过程中,节点3重复请求了4次,因为树有16个叶子,即$2^4$。在计算机科学中,到达目的地所需的最坏情况跳数是$2 log n + c$,n是树的叶子数,c是常数。

在现实世界中,树会有很多空分支和空叶子。例如,有1024($2^{10}$)个叶子的树,k值为3,先启动ID为0的节点作为源节点,再启动ID为800的节点,树会分裂成两个桶。接着启动ID为900和ID为754的节点。若再启动ID为1011的节点,节点0会ping最近最少使用的节点800,检查其是否存活。若存活,再检查其他节点,若节点754不存活,则用节点1011替换它;若所有节点都存活,则拒绝节点1011加入桶,以避免新节点淹没系统。

每次在源节点所在的分支添加节点,桶会分裂成两个,直到达到最低级别;在源节点不在的其他分支添加节点,直到达到k值。

Kademlia的工作原理还有其他重要方面,如节点插入时需告知旧节点其存在,并从旧节点获取联系人信息;节点需要每小时重新发布键和值(数据),以适应旧节点离开和新节点加入系统;还有加速查找算法,可减少节点查找其他节点的步骤。

5. Kademlia算法的整体流程与应用要点

为了更清晰地理解Kademlia算法的工作流程,我们可以通过一个mermaid流程图来展示节点查找的大致过程:

graph TD;
    A[源节点发起查找请求] --> B{目标节点是否在地址簿};
    B -- 是 --> C[直接获取目标节点信息];
    B -- 否 --> D[向地址簿中最接近的节点询问];
    D --> E{询问节点是否有目标节点信息};
    E -- 是 --> F[获取目标节点信息];
    E -- 否 --> G[询问节点提供更接近的节点];
    G --> D;

在实际应用中,Kademlia算法有着诸多优势,但也需要注意一些要点:
- 节点插入与通知机制 :当一个新节点插入到系统中时,它需要主动告知一些旧节点自己的存在。这一过程通常是通过向旧节点发送特定的消息来实现的。同时,新节点也会从旧节点那里获取一些联系人信息,以便快速融入网络。
- 数据的定期重发布 :为了应对旧节点离开和新节点加入的情况,节点需要每小时重新发布其保存的键和值(数据)。这样可以确保数据始终存储在距离其最近且更稳定的节点上,提高数据的可用性和访问效率。
- 加速查找算法的使用 :Kademlia算法中包含加速查找算法,其目的是减少节点查找其他节点时所需的步骤。在实际操作中,节点可以利用这一算法,根据已有的节点信息和XOR距离,更快速地定位到目标节点。

6. 总结与实际应用场景

Kademlia算法作为一种分布式哈希表算法,在分布式系统中有着广泛的应用。它通过独特的XOR距离和桶的概念,有效地解决了分布式环境下节点查找和数据存储的问题。

以下是Kademlia算法的一些实际应用场景总结:
| 应用场景 | 说明 |
| — | — |
| 文件共享系统 | 如eDonkey等文件共享平台,利用Kademlia算法实现文件的分布式存储和快速查找,使得用户可以高效地获取所需文件。 |
| 点对点网络 | 在各种点对点网络中,Kademlia算法帮助节点快速发现和连接其他节点,构建稳定的网络拓扑结构。 |
| 分布式数据库 | 分布式数据库可以借助Kademlia算法来管理数据的存储位置,确保数据在多个节点之间合理分布,提高数据的读写性能和可靠性。 |

在实际使用Kademlia算法时,需要根据具体的应用场景和需求,合理配置节点的参数,如k值、节点ID范围等。同时,要注意网络环境的稳定性和安全性,以充分发挥Kademlia算法的优势。

总之,Kademlia算法为分布式系统的发展提供了强大的支持,通过其独特的设计和机制,使得分布式系统能够更加高效、稳定地运行。无论是在文件共享、点对点通信还是分布式数据存储等领域,Kademlia算法都展现出了巨大的潜力和价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值