IT 论文精读 · PAPER 24

Spanner — Google 的全球分布式数据库

Corbett 等 · Google · OSDI 2012

EN →

这篇论文干了什么?

2012 年,Google 造出了 Spanner——一个把数据摊在横跨几个大洲的机房里、却依然像一本人人都认同顺序的账本一样工作的数据库。它撑起了 Google 广告这类最核心的业务,也是后来 Google Cloud Spanner、CockroachDB、TiDB 这些「全球数据库」的思想源头。它最出名的一招,是一个叫 TrueTime 的「诚实时钟」。

先说旧世界的痛

数据库想又快又不丢,就得把数据复制好几份、分散到不同城市的机房。可一旦散开,就冒出一个头疼问题:到底谁先谁后? 你在北京下的单,和同事在纽约改的价,哪个先生效?靠各机房自己的钟来判断吗——可每台机器的钟都走得略有快慢,谁也不敢拍胸脯说自己的时间绝对准。于是当时的全球数据库只能二选一:要么挤在一个地区、换来「顺序清楚」,要么摊向全球、换来「偶尔读到过期数据、顺序错乱」。Spanner 偏要两个都拿。

那个点子:让时钟「诚实」

普通时钟的毛病是假装精确——它告诉你「现在是 3 点整」,可它自己其实心里没底。Spanner 反其道而行:让每台机器的钟老实交代自己的误差,不报一个点、而报一小段区间——「现在大概在 3 点整前后那几毫秒之间,反正真时间一定落在这段里」。这个「带着诚实误差的时间」,就是 TrueTime。

它怎么把顺序理清?

光有诚实区间还不够,关键在成交时「多等一拍」。每当一笔改动要落定,Spanner 先给它盖一个时间戳,然后故意等上那么几毫秒——等到连最「糊涂」的钟都承认「这个时间戳已经是过去时了」,才把改动对外公开。这一等,就保证了:任何在它之后才开始的改动,拿到的时间戳一定更大。 于是全球所有机房,哪怕彼此从没商量,也会对「谁先谁后」给出完全一致的答案——那本账本的顺序,人人都认。至于容错,Spanner 把每份数据在几个机房各存一份、靠一轮「投票」保证副本一致,坏掉一两台也照常跑。

它带来了什么

Spanner 第一次证明:「全球铺开」和「强一致的事务」可以兼得,不必二选一。你能在横跨大洲的数据上,像用一台单机数据库那样放心地转账、下单、改库存,系统替你保证顺序不乱、读到的永远是说得通的最新状态。诚实地说,这份「多等一拍」给每次写都添了几毫秒延迟,而且它靠的是每个机房里真装了 GPS 天线和原子钟——这套家当不是随便谁都搭得起。

一句话记住

别再假装全球的钟都分毫不差——让每台钟诚实报出「时间在这一小段区间里」,再在每次成交时多等一小拍、等到误差被「等」了过去,全世界就能对「谁先谁后」给出同一个答案。于是一个铺满地球的数据库,用起来却像一本顺序人人认同的单机账本。

想看 TrueTime 的区间与 commit-wait 时序、Paxos 组 + 两阶段提交的结构图和实验数字? → 切到精读版