Byzantine Fault Tolerance(拜占庭容错)¶
起源¶
拜占庭将军问题是 Leslie Lamport(2013 年的图灵奖得主)用来为描述分布式系统一致性问题(Distributed Consensus)在论文中抽象出来一个著名的例子。
备注
拜占庭帝国想要进攻一个强大的敌人,为此派出了 10 支军队去包围这个敌人。这个敌人虽不比拜占庭帝国,但也足以抵御 5 支常规拜占庭军队的同时袭击。这 10 支军队在分开的包围状态下同时攻击。他们任一支军队单独进攻都毫无胜算,除非有至少 6 支军队(一半以上)同时袭击才能攻下敌国。他们分散在敌国的四周,依靠通信兵骑马相互通信来协商进攻意向及进攻时间。困扰这些将军的问题是,他们不确定他们中是否有叛徒,叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下,拜占庭将军们才能保证有多于 6 支军队在同一时间一起发起进攻,从而赢取战斗?
备注
注:“拜占庭将军问题中并不去考虑通信兵是否会被截获或无法传达信息等问题,即消息传递的信道绝无问题。Lamport 已经证明了在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。所以,在研究拜占庭将军问题的时候,已经假定了信道是没有问题的。”
备注
在有叛徒情况下,一个叛徒会向不同的将军发出不同的进攻提议(通知 A 明日下午 1 点进攻, 通知 B 明日下午 2 点进攻等等),一个叛徒也会可能同意多个进攻提议(即同意下午 1 点进攻又同意下午 2 点进攻)。叛徒发送前后不一致的进攻提议,被称为 “拜占庭错误”,而能够处理拜占庭错误的这种容错性称为「Byzantine Fault Tolerance」,简称为 BFT。
问题抽象¶
求解拜占庭将军问题,隐含要满足以下两个条件:
1. 每个忠诚的将军必须执行收到的命令值 vi(vi 是第 i 个将军的命令)。
2. 如果第 i 个将军是忠诚的,那么他发送的命令和每个忠诚将军收到的 vi 相同。
于是,拜占庭将军问题的可以描述为:
一个发送命令的将军要发送一个命令给其余 n-1 个将军,使得:
1. 所有忠诚的接收命令的将军遵守相同的命令;
2. 如果发送命令的将军是忠诚的,那么所有忠诚的接收命令的将军遵守所接收的命令
拜占庭将军问题:
1. 故障模型:非拜占庭故障/拜占庭故障。
2. 通信类型:同步/异步。
3. 通信网络连接:节点间直连数。
4. 信息发送者身份:实名/匿名。
5. 通信通道稳定性:通道可靠/不可靠。
6. 消息认证性:认证消息/非认证消息。
.