知识卡片

拜占庭容错的适用边界为何多数服务端系统不需要它

普通读书笔记卡

内容

本书讨论的绝大多数场景默认节点是”不可靠但诚实”的——它们可能很慢、可能干脆不响应、 状态可能因GC暂停或网络延迟而过期,但只要它真的回应了,说的就是它所知的实情,会按 协议规则老实扮演自己的角色。拜占庭故障描述的是更极端的情况:节点可能主动”撒谎”, 发送任意错误或伪造的响应(比如谎称自己没收到某条消息),这时候的分布式共识问题 叫拜占庭将军问题——n个将军里混有叛徒,忠诚的将军要在不知道谁是叛徒的前提下达成 一致行动方案。能在部分节点故障、不遵守协议甚至恶意攻击的情况下依然正确工作的系统, 称为拜占庭容错。拜占庭容错在几类场景里确实有意义:航空航天领域(辐射可能随机破坏 内存或寄存器数据,而系统故障代价极高,如飞机坠毁);由多个互不信任的组织共同参与的 系统(比特币等区块链本质是让互不信任的参与方在没有中心机构的情况下就交易是否发生 达成一致)。但对本书讨论的典型服务端数据系统,通常可以安全假设不存在拜占庭故障: 数据中心里所有节点都由同一个组织掌控(可以信任),辐射水平低到内存损坏不成问题, 而拜占庭容错协议本身相当复杂、部署成本让它在多数场景下不划算。还有一个容易被忽视 的限制:软件bug理论上也可以算一种拜占庭式错误,但如果所有节点跑的是同一套软件, 拜占庭容错算法对此无能为力——大多数拜占庭容错算法要求超过三分之二节点正常,若要 靠这条路对付bug,你需要四份独立的不同实现,指望一个bug只出现在其中一份里,这在 现实中几乎不可行;同理,如果攻击者能渗透一个节点,往往也能渗透跑同一套软件的其他 节点,所以传统的认证、访问控制、加密、防火墙依然是抵御攻击的主力手段,而不是拜占庭 协议。

参考来源

- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"拜占庭故障""拜占庭 将军问题"(源文件:_epub-src/ch8_split_004.html) - 结论依据:原文说明本书默认节点不可靠但诚实,拜占庭故障描述节点主动撒谎的场景, 举航空航天和区块链两个真正需要拜占庭容错的例子,并说明数据中心节点可信、拜占庭 容错协议复杂且对同质软件的bug/渗透无能为力,因此多数服务端系统不需要它,直接 支撑本卡片结论。 - 原始内容:我们假设节点是不可靠但诚实的……如果存在节点可能"撒谎"……这种行为被 称为拜占庭故障……然而,在本书讨论的那些系统中,我们通常可以安全地假设没有拜占庭 式的错误……大多数拜占庭式容错算法要求超过三分之二的节点能够正常工作。