常青笔记
- 在不可靠信道,传递消息达到一致性是不可能的。即不会有传递错误消息的情况。
- Paxos等算法
- 签名约束了叛徒的作恶行为
- 拜占庭容错算法(适用消息存在篡改和伪造的场景)
- 故障容错算法(适用消息不存在篡改和伪造的场景)
概述
拜占庭将军问题是由 Paxos 算法作者莱斯利·兰伯特(Leslie Lamport)提出的点对点通信中的基本问题。该问题要说明的含义是,在不可靠信道上试图通过消息传递的方式达到一致性 是不可能的。所以,Paxos 算法的前提是不存在拜占庭将军问题,即信道是安全的、可靠的, 集群节点间传递的消息是不会被篡改的。 在实际工程实践中,可靠信道是存在的。 一般情况下,分布式系统中各个节点间采用两种通讯模型:
算法
拜占庭容错算法(适用消息存在篡改和伪造的场景)
拜占庭将军问题描述的是最困难的,也是最复杂的一种分布式故障场景,除了存在故障行为,还存在恶意行为的一个场景。你要注意,在存在恶意节点行为的场景中(比如在数字货币的区块链技术中),必须使用拜占庭容错算法(Byzantine Fault Tolerance,BFT)。常用的拜占庭容错算法还有:PBFT 算法,PoW 算法
解决的是一致性协商问题,并不是解决错误消息的传递。
口信消息型拜占庭问题之解
这个算法虽然能解决拜占庭将军问题,但它有一个限制:如果叛将人数为 m,那么将军总人数必须不小于 3m + 1。
签名消息型拜占庭问题之解
签名约束了叛徒的作恶行为 签名消息指的就是带有数字签名的消息。
1. 任何一个人进行消息篡改,会被人知道。
2. 任何一个人修改时,要带上之前别人给的信息的基础上进行加签。
这个本质在于,防止了消息篡改。因为有验签功能。比如2忠1叛的模型
如果叛变将军楚先发送误导的作战信息,那么齐和燕将发现楚发送的作战信息是不一致的,知道楚已经叛变。这个时候,他们可以先处理叛将,然后再重新协商作战计划。
齐和秦都没修改签名,但是数据不一样。说明是楚是叛徒。
2忠2叛 在经历过所有信息后,进行去重排序即可。即所有不同的差异,都会汇聚到所有节点上。
PBFT
签名消息、拜占庭将军问题的签名消息之解是非常经典的基础知识,影响和启发了后来的众多拜占庭容错算法。在 PBFT 中,基于性能的考虑,大部分场景的消息采用消息认证码(MAC),只有在视图变更(View Change)等少数场景中采用了数字签名
POW
故障容错算法(适用消息不存在篡改和伪造的场景)
在计算机分布式系统中,最常用的是非拜占庭容错算法,即故障容错算法(Crash Fault Tolerance,CFT)。CFT 解决的是分布式的系统中存在故障,但不存在恶意节点的场景下的共识问题。 也就是说,这个场景可能会丢失消息,或者有消息重复,但不存在错误消息,或者伪造消息的情况。
- 常见的算法有 Paxos 算法、Raft 算法、ZAB 协议