专业书籍精读 · Database Internals · 第 12 章

反熵与传播

Database Internals · Ch 12 · Alex Petrov · 2019

EN →

这一章讲什么?

你在群里发了条消息:多数人秒收,有人过了十分钟才刷出来,还有个人手机关机一整天——开机后消息照样补上了。《Database Internals》(《数据库系统内幕》)第 12 章讲的就是「照样补上」这件事是怎么做到的。上一章说「几份数据终究会一样」,这一章问:究竟靠什么让它一样?

先说个怪事

你删掉的一条数据,过几天自己回来了。听着像灵异事件,原理却很朴素:你删的时候有台机器正好离线,它手上那份还是「有」。等它回来,它发现同伴手上没有这条,就热心地把「自己有的」补给了同伴——删除被撤销了。所以真正要设计的不是「怎么把数据送到」,而是「没送到的那部分,事后怎么把账补对」。

旧世界为什么难

最直觉的办法是「发的时候确保每个人都收到」。可那意味着每次写入都要等最慢的那台机器,有一台关机就谁也别想写——这正是上一章算过的账:太贵。于是真实系统选择先写完再说,欠的账另立机制还。麻烦在于,这笔账不会自己消失:漏掉一条写和漏掉一百万条写,对系统来说是同一种状态——不一样,而且没人知道差在哪。

三个还账的时机

这一章的骨架,就是三条互补的还账通道:

消息怎么扩散:像传闲话

还有一类信息(谁活着、谁加入了集群)要让所有机器都知道。挨个通知太慢,指定一个「广播员」又会因它一挂全断。这一章用的办法是传闲话:每台机器每秒随便挑一个同伴,把自己知道的都说一遍。没有中心、断几条线也无所谓,而且扩散极快——知道的人数每轮翻几倍,机器数翻倍也只多一两轮。代价是:谁都说不准到底几秒钟传完,它只给「很快」,不给承诺。

一句话记住

「终究会一样」不是等来的,是花钱买来的。系统要专门养三条补账通道——写时代收、读时顺手校、闲时对账,再加一种像传闲话一样的扩散方式。谁都不跑,那几份数据就会永远不一样,而且删掉的东西还会自己爬回来。

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