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

领导者选举

Database Internals · Ch 10 · Alex Petrov · 2019

EN →

这一章讲什么?

一个小组要合作办事,如果每件小事都全组开会表决,那什么也办不成。于是大家推一个人拍板——有事找他,他说了算。你转账、发消息、存照片,背后那几十台机器每天都在干同一件事:推举一台机器当头儿。《Database Internals》第 10 章讲的就是这个动作,以及它为什么比听起来难得多。

先说个怪事:头儿没死,也会被换掉

最常见的换头儿,不是因为那台机器真坏了,而是它的硬盘忙了一下、回话慢了半秒。别人听不到它吭声,以为它没了,就张罗着重选——它自己毫不知情,还在正常上班。换头儿多半是被误会触发的,不是被故障触发的。

旧世界为什么难:两个头儿比没有头儿更糟

没有头儿,事情办不下去——但坏得很明显,喊一声就有人来修。真正的灾难是同时冒出两个头儿:老的没真死、只是没人听见,新的已经上任。两人同时在同一本账上记账,你那笔钱可能被算两遍,事后还没人知道该信哪一本——两份记录都言之有理。这是整章要防的头号事故。

核心的点子:几种推举法,和一枚更要紧的公章

这一章摊开了几种老办法,一层层递进——

但全章最该记住的不是上面任何一种推举法,而是那枚公章:给每一任头儿刻一枚带届数的章,所有文件只认届数最新的那一枚。于是老头儿睡醒了照样发号施令也没关系——他手里那枚是上一届的,盖出来一律作废。

该怎么选

真正的取舍不是「哪种推举法更聪明」,而是两件事:别老换(换一次全场都要停下来等交接),以及换了之后老头儿必须真的失效。前者靠「没真出事就别动」,后者靠那枚带届数的公章。

诚实的代价是:没有一种推举法能保证「全场永远只有一个头儿」——能做到的只是「乱一阵之后最终只剩一个」。安全网从来不在推举那一步,而在盖章那一步。

一句话记住

推举头儿不难,难的是让上一任彻底作废。所以别指望选举本身选得又快又准——要让每一任都带上届数,让所有人只认最新的那一届;这样即使误会了、一时冒出两个头儿,账也不会被写坏。

想看具体算法、消息开销与示意图? → 切到精读版