专业书籍精读 · DDIA · 第 5 章

复制:同一份数据,放好几台机器

Designing Data-Intensive Applications · Ch 5 · Martin Kleppmann · 2017

EN →

这一章讲什么?

你刷微信、下淘宝单,背后那份数据其实不止一台机器在存——它被抄了好几份,分放在不同机房、不同城市。DDIA 第 5 章讲的就是这件事:为什么要抄、怎么抄、抄的过程中会踩哪些坑。抄这个动作有个专业名字叫「复制」。

为什么要抄好几份?

三个朴素的理由:一是怕坏——只存一份,那台机器一宕机,整个网站就打不开;抄了三份,坏一台还有两台顶着。二是嫌远——数据放美国,中国用户每次访问都要绕半个地球,慢;在中国也放一份就近;三是嫌挤——一亿人同时来读,一台机器扛不住,抄成十份、大家分着读。

难的不是抄,是「改了以后怎么让每份都跟上」

抄一份静态文件谁都会。真正的麻烦是:数据时时在变。你刚改了昵称,这份改动得挨个通知到每一份抄本。抄写要花时间,于是就有了那个最经典的坑——你改完了,别人看到的抄本可能还是旧的(就像信刚寄出、还没送到)。这段时间差,就叫「复制滞后」。

三种「谁能改」的管法

数据能被改,就得规定谁说了算,否则乱套。这一章给了三种管法,全书后面全靠它们打底:

① 一个人说了算(单主):指定一份抄本当「主账本」,所有修改先写它,再由它照着抄给其他副本。清楚、不打架,但主账本那台一倒,得赶紧临时推举一个顶上,这一下最容易出乱子。

② 几个人都能改,事后对账(多主):每个机房都有个能改的账本,各改各的、互相同步。好处是哪个机房都能就近写,坏处是两个人同时改同一格就冲突了——像两个人同时编辑同一份在线文档,得想办法合并。

③ 没人主管,靠人多问准(无主):改的时候同时告诉好几台,读的时候也同时问好几台。只要「写过的」和「问到的」这两拨机器有重叠,你总能碰上一台知道最新消息的。像一条重要通知同时发给 3 个同事,你事后随便问其中 2 个,总能问到知情的那个。

那到底该用哪种?

没有免费的午餐:越想「每台抄本时刻一模一样」,就越慢、越不抗故障;越想快、越抗故障,就越得容忍「有人读到旧数据」。单主简单、用得最广(大多数数据库默认就是它);多主适合跨机房和离线协作;无主主打「挂几台也照转」。选哪种,本质是在「快」「稳」「每次都读到最新」这三者里挑你最要的那个。

一句话记住

复制 = 把同一份数据抄到多台机器,为的是抗故障、就近、分摊读。难点不在抄,在改动怎么同步、以及同步没跟上时读到旧数据怎么办。管法有三种:一个人说了算、几个人对账、靠人多问准——三者都在「快 / 稳 / 读到最新」之间做取舍。

想进到具体机制、quorum 记号和示意图? → 切到精读版