IT 论文精读 · PAPER 57

Chord(分布式哈希表 / DHT)

Stoica, Morris, Karger, Kaashoek, Balakrishnan · MIT · SIGCOMM 2001

EN →

这篇论文干了什么?

2001 年,MIT 一队人提出了 Chord,回答一个 P2P(点对点,就是没有中央服务器、大家平等互联)系统里最要命的问题:几百万台随时开机关机的电脑,我要的那个文件到底在谁手上?Chord 给出的答案优雅得出奇——不需要任何中央目录,任意一台机器几步之内就能算出「谁负责这个东西」。今天 BitTorrent 的去中心网络、Amazon 的分布式数据库、区块链的节点发现,用的都是它这一套的思路。

旧世界的两个笨办法

当年找文件只有两条路,都不好走。一条是 Napster 式:搞一台中央服务器记着「谁有什么」——查得快,但这台机器一被关,整个网络就瘫了(后来它真被告到关停)。另一条是 Gnutella 式:没有中央,那就挨个问——把「谁有这文件」喊给所有邻居,邻居再喊给邻居……人一多,网络里全是这种喊话,又慢又不保证能问到。要么怕单点垮、要么怕人海战术,得有个第三条路。

那个点子:把所有人排成一个圈

Chord 的想法特别干净。想象一条环形的街道,门牌号从 0 一直排到很大很大,再绕回 0。每台电脑按自己的编号站到圈上某个位置;每个文件也按它名字算出一个编号、落在圈上某处。规矩只有一条:一个文件,交给从它那个位置开始、顺时针走遇到的第一台电脑保管。于是「谁负责这个文件」不用问任何人——算一下编号、顺时针找最近的邻居就是了。

怎么几步就找到?一本「翻倍地址簿」

光有圈还不够快:要是只认识圈上紧挨着的下一位,找个对面的文件得沿圈一位一位地传,太慢。Chord 的妙招是给每台电脑一本特别的地址簿:里面记着圈上离自己 1 步、2 步、4 步、8 步、16 步……(每次翻倍)远处的那些邻居。找东西时,就朝「不越过目标、又离目标最近」的那位一跳——每跳都能把到目标的剩余距离砍掉一半,像猜数字游戏里每次猜中间、或翻字典每次翻一半。这样一来,哪怕圈上有一百万台机器,也只要二十来跳就找到;而每台机器只需记住二十来个邻居,不用认识所有人。

没人指挥,还能自己长好

P2P 最烦的是人来人往:随时有机器上线下线。Chord 不搞「全网停下来重排」,而是让每台机器时不时问一句后邻「你前面那位是谁」——发现中间新来了一位,就悄悄把指针改对。谁进谁出,只影响圈上它左右那一小段,其余人照常。整个网络没有指挥中心,却能自己不断修补、长成一张能用的图。诚实说一句代价:动荡特别剧烈(大量机器同时进出)时,指针一时没修好,可能短暂找不到或找错;而且它只会「精确地找某个名字」,不会像搜索引擎那样模糊搜。

一句话记住

把所有机器和所有文件按编号摆到一个大圆环上,文件归「顺时针最近的那台机器」;再给每台机器一本「1、2、4、8…翻倍」的地址簿,找东西时一跳砍一半距离——于是没有中央服务器,百万台机器也二十来跳就定位,谁进谁出只惊动身边一小段。这套「一致性哈希 + 环」如今是无数去中心系统的地基。

想看 Chord 环的结构图、指针表和 O(log N) 的道理? → 切到精读版