IT 论文精读 · PAPER 21

Percolator — 大规模增量处理

Peng & Dabek · Google · OSDI 2010

EN →

这篇论文干了什么?

2010 年,谷歌两位工程师(Peng 和 Dabek)造了一个叫 Percolator 的系统,用它重建了谷歌搜索的索引。作用一句话说清:让一个新网页从被爬到、到能在搜索结果里被搜到,从「等一整批重算」变成「来一篇、更新一篇」。上线后,搜索结果里文档的平均「年龄」降了一半——网页更新得更快了。

先说旧世界的痛

在此之前,谷歌用的是上一代神器 MapReduce:把全网上百亿网页当成一大锅,整锅一起算,算完产出一版新索引。问题是——你只改了一个网页,也得把整锅重炒一遍。全网重算一轮要好几天,于是你今天发的文章,可能过好几天才被搜到。想让它更新快,唯一的办法是更频繁地整锅重炒,可那太贵了,炒不起。

新点子:别整锅重炒,只补那一勺

Percolator 的想法是:当一个网页变了,只去更新「跟它有关」的那一小部分,别碰其余几十亿个没变的。这就是「增量处理」——像往一锅汤里补一勺料,而不是倒掉重熬。

可这事以前做不了,卡在两个坎上,Percolator 正好补上两样东西:

第一样:让「一次改动」要么全成、要么全不成

更新一个网页往往要同时改好几处记录(这个词指向那篇文、那篇文的排名、反向链接……)。要是改到一半机器崩了,索引就成了「一半新一半旧」的烂账。Percolator 给这些散落各处的改动套上一个「事务」:要么全部生效,要么当作啥也没发生,绝不留半拉子。

它怎么保证「全成或全不成」?打个比方:搬家时你给每个箱子贴张便利贴锁住,其中指定一个「主箱子」当总开关——只有主箱子那张便利贴一翻面,整场搬家才算「正式完成」;翻面之前谁来看都是「还没搬」。这样哪怕搬到一半停电,别人一看主箱子没翻面,就知道这趟不算数,安全。一个原子的小动作,锁定了一大堆改动的命运。

第二样:某处一变,自动通知该跟着变的下游

索引是一环扣一环的:网页内容变了 → 得重算它的关键词 → 关键词变了 → 得更新倒排表……Percolator 加了一套「触发器」:你盯着某类数据,只要它一被改动,系统就自动叫醒一段你写好的处理逻辑去跟进,跟进又可能触发下一环——像 Excel 里改一个单元格,依赖它的公式格自动重算、连锁刷新一整片。一小撮改动就这样自己「渗」遍了整个索引——系统的名字 Percolator(渗滤器)正是这意思。

带来了什么

谷歌用它替掉了老的 MapReduce 索引流水线(这套新系统对外叫 Caffeine)。处理同样多的网页,搜索结果的平均新鲜度提升了一倍——你刚发的内容能更快被搜到。诚实说一句代价:这份「随时更新」不是白来的——比起 MapReduce 顺畅地整锅扫,Percolator 每更新一篇文档要东一下西一下地读写几十次,更费机器;谷歌是拿资源换新鲜度,觉得划算才这么干。

一句话记住

Percolator 让谷歌搜索索引从「整批重算、慢好几天」变成「来一篇更新一篇」。它靠两样东西做到:给散落各处的改动套上「要么全成要么全不成」的事务(用一个「主锁」当总开关),再加一套「某处一变、自动通知下游跟进」的触发器。新鲜度翻倍,代价是更费机器。

想看它怎么在 Bigtable 上用时间戳和「主锁」做出事务、观察者怎么级联? → 切到精读版