English →
博客精读 · 14 · martin.kleppmann.com

Martin Kleppmann
骗你的不是代码,是描述系统的那些词

2007 年 7 月至今 · 126 篇 · 仍在更新但极慢(2008 年 31 篇,2023 年 0 篇,2025 年 1 篇,最新 2025 年 12 月 8 日;2026 年已排四场演讲)· 两次转折:2012 年前后从可用性/创业写作转向数据系统,2016 年前后从工业界转向学术与形式化验证 · 本页通读 16 篇,跨度 2008 年 6 月至 2025 年 12 月,选文以他自己首页的「Highlights」为准

把 martin.kleppmann.com 的归档页从头拉到尾:126 篇,跨十九年。前 70 篇里,只有一篇跟数据库沾边。

其余六十九篇写的是:燃气灶的可用性。英国和德国的火车售票机对比(上下两集,外加一篇「德国售票机的最新进展」)。《找到离我最近的厕所、咖喱,随便什么》。《「是/否/取消」让阿司匹林销量暴涨》。光 2008 年他就发了 31 篇。而 2023 年,一篇也没有。

写这些的人后来写了 Designing Data-Intensive Applications(《数据密集型应用系统设计》)——一代工程师用来思考数据库的那本书。看上去像转行,但他一次都没换过题目。

一台让你按错键的售票机,和一个把「repeatable read」(可重复读)在三个产品里指三件不同事情的数据库,是同一个 bug。这不是我的类比,是他 2014 年自己写下的,而他说的是 ACID 事务:

The levels basically have no intuitive meaning, because they are an incredibly leaky abstraction — they are defined by implementation detail, not because someone thought they'd make a great API.这些级别基本没有任何直觉含义,因为它们是一个漏得不能再漏的抽象——它们是由实现细节定义出来的,而不是因为有人觉得它们能构成一套好 API。Hermitage: Testing the “I” in ACID, 2014

他较劲的那件事

他为写书去查「隔离级别到底保证什么」,结果发现词本身是空的:PostgreSQL、MySQL、SQL Server 都有一个叫 repeatable read 的级别,三家含义各不相同;Oracle 那个写着 serializable 的级别根本不可串行化。更要命的是——差点让一家比特币交易所破产的那个并发漏洞,绝大多数号称 ACID 的数据库在默认配置下也防不住。

危险不在于你搞不清,而在于你以为自己是安全的。一个听起来像承诺、实际上只是在描述某人 1975 年那套实现的名字,会让你在错误的地方放心。此后十年他一次次回到同一个动作:不去解那道题,先把大家用来看这道题的眼镜摘下来检查镜片。

他最狠的那一下

2015 年,他回去读 CAP 定理的原始证明,发现里面的词全不是大家以为的意思:Consistency 特指线性一致性,跟 ACID 里那个 C 毫无关系;Availability 要求每一个没挂的节点都能应答;Partition tolerance 根本不是选项。而那个定理的系统模型是一个读写寄存器——跨对象的事务压根不在射程内,延迟更是一个字没提。

然后他一个一个去归类真实系统,一个都归不进去。单主复制的关系数据库:写不了所以不 CAP-available,读从库又不线性一致,两边都不是。ZooKeeper——所有教科书里「CP 系统」的标准例子——默认读不线性一致,写要多数派所以不 CAP-available,而 3.4.0 加的只读模式反倒是 CAP-available 的。

They are neither “CP” nor “AP”, they are just “P”, whatever that means. (Yes, the “two out of three” formulation does allow you to pick only one out of three, or even none out of three!)它们既不是「CP」也不是「AP」,它们就是「P」,不管那是什么意思。(是的,「三选二」这个说法确实允许你三个里只拿到一个,甚至一个都拿不到!)Please stop calling databases CP or AP, 2015

他要说的不止是「这标签不够准」,而是它会反转判断:ZooKeeper 那个「AP」只读模式仍然给你历史写入的全序,比 Cassandra 的「AP」强出好几个量级——「把它们扔进同一个桶里是荒谬的」。一比特装不下这些差别,而人们正在拿这一比特做架构决策。

然后他把这套做法推到了尽头

2016 年,他发现 Redis 官网推荐的分布式锁 Redlock 把「时钟大致准、进程不会长时间暂停」偷偷当成了公理——一次 GC 停顿就能让两个客户端同时以为自己持锁。修法是 fencing token:一个只增不减的数字,存储端必须拒绝编号倒退的写入。好的共识算法在时序崩坏时会变慢,但不会做出错误的决定;Redlock 会。

2015 年他盯着数据库的复制流看,发现那条 UPDATE 一进日志就变成了不可变的事实,而索引、缓存、物化视图其实是同一件事的三个名字——只不过索引是数据库的责任、缓存是你的责任,于是前者优雅后者灾难。提议:把那条一直被藏着的复制流翻到外面,让它成为唯一的写入口,所有数据库都只是它的物化视图。

2021 年他说 GPL 已经没用了——不是因为它坏,是因为敌人换了。今天把你的数据拿走的不是闭源,是云:一次无预警的封号就够了。而互联网档案馆让十万个历史程序在浏览器里跑起来,从来没拿到过源代码——可见保住软件自由的不是开源,是「你手里有一份拷贝」。于是有了 local-first software:数据在你自己的硬盘上,同时保留实时协作。技术押注是 CRDT,而 CRDT 恰恰是人脑推不清楚的那类东西,所以他去证明助手里把它证了一遍。

2025 年底他预测大模型会让形式化验证变成主流,理由很像他:「它胡说八道也没关系,因为证明检查器会拒绝任何无效的证明,逼那个 AI 代理重来。」

十九年是一条完整的升级路线:先要更准的词,再要更好的架构,再要机器检查的证明,最后给出一个想要这一切的政治理由。起点是一台德国售票机。