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

故障检测

Database Internals · Ch 9 · Alex Petrov · 2019

EN →

这一章讲什么?

你给同事发了条消息,十分钟没回。他在开会?手机没电?还是出事了?你分不清。一堆机器合作干活时,每台机器每秒都在替彼此回答同一个问题:那台机器是死了,还是只是慢?《Database Internals》第 9 章讲的就是这件事——怎么判断一个节点挂了,以及为什么这件事根本做不到「判得准」。

麻烦在于:「没消息」不是消息

人走了不会自己发讣告。机器崩溃时也不会留一句「我要没了」的告别——它就是不说话了。只能反着推:这么久没吭声,八成是没了。可「这么久」到底多久?没人知道。这就是整章的死结:沉默既可能是死亡,也可能只是堵车,从外面看一模一样。

旧世界为什么难:等多久都是错的

最朴素的办法是定个闹钟:3 秒不回就当他死了。等太短——对方只是网络抖了一下、或者正清理内存卡了两秒,你就把一个活人宣判死亡。这叫误杀,代价很贵:系统以为头儿没了、重新选一个,结果两个头同时下令;或者把几百 GB 数据往别处搬,把本来只是抖了一下的网络彻底压垮——检测器亲手制造了它要检测的那场故障。等太长——真死的机器,请求还在往它身上发,用户干等三十秒。短了误杀,长了迟钝,中间不存在「刚刚好」的数字。

核心的点子:从「死没死」改成「有多可疑」

这一章最好用的想法是:别再逼系统回答是非题。四个办法层层递进——

该怎么选

真正的取舍不是「怎么判得更准」,而是「判错了,哪个方向更亏」:银行转账宁可慢也不能误杀——冒出两个头会把账写坏;聊天软件的小绿点判错无所谓,要的是快。

诚实的代价是:这些办法一个都不保证正确——只要消息可以任意迟到,「慢」和「死」就分不开,所有检测器都在赌概率。

一句话记住

你永远无法确定另一台机器是死了还是只是慢。所以别追求「判得对」,而要把「死 / 活」的是非题换成「有多可疑」的分数,让不同的动作按自己的代价各自定线——同时承认:你迟早会判错,系统必须扛得住那一次判错。

想看具体算法、阈值怎么定和示意图? → 切到精读版