知识卡片

心跳超时无法正确实现领头人选举

普通读书笔记卡 · 1625

内容

两组互为主备的文件服务器靠心跳互相监控,一旦检测不到对方心跳就发STONITH命令强制关闭对方并 自己转正——这是常规做法,但理论上是错误的。网络只是变慢或丢包(而非真宕机)时,双方都会因 超时判定对方已死,同时发关闭命令并自升为主:结果要么两边同时为主致数据损坏,要么同时被误杀 致服务不可用。根源在于,领头人选举本质是分布式异步共识问题,简单心跳无法正确解决,必须换成 经过正式证明的共识算法。

参考来源

- 位置:《SRE:Google运维解密》第23章《管理关键状态:利用分布式共识来提高可靠性》(源文件:_epub-src/OEBPS/Text/0009_0014.xhtml) - 结论依据:原文"案例1:脑裂问题"描述两组文件服务器用心跳监控、以STONITH命令抢占主服务器身份,并说明网络变慢或丢包时双方都会因超时触发STONITH导致数据损坏或不可用;原文明确指出这是在用简单超时机制实现领头人选举,而领头人选举是分布式异步共识问题,无法靠简单心跳正确解决。 - 原始内容:如果某个文件服务器无法联系到另外一个服务器,它会发送一个STONITH(当头一枪)命令来强制关闭另外一个服务器,同时成为文件的主服务者……当网络变慢,或者开始丢包的时候……这两个文件服务器可能会存在同时为主的状态,也可能……都被关闭了……该系统正在尝试使用简单超时机制来实现领头人选举。领头人选举是分布式异步共识问题的另一种表现形式,它不能够通过简单心跳来正确实现。