常青笔记

  • 在不可靠信道,传递消息达到一致性是不可能的。即不会有传递错误消息的情况。
  • Paxos等算法
  • 签名约束了叛徒的作恶行为
  • 拜占庭容错算法(适用消息存在篡改和伪造的场景)
  • 故障容错算法(适用消息不存在篡改和伪造的场景)

概述

拜占庭将军问题是由 Paxos 算法作者莱斯利·兰伯特(Leslie Lamport)提出的点对点通信中的基本问题。该问题要说明的含义是,在不可靠信道上试图通过消息传递的方式达到一致性 是不可能的。所以,Paxos 算法的前提是不存在拜占庭将军问题,即信道是安全的、可靠的, 集群节点间传递的消息是不会被篡改的。 在实际工程实践中,可靠信道是存在的。 一般情况下,分布式系统中各个节点间采用两种通讯模型:

  • 共享内存(Shared Memory)。星网模型,弊端:中心化问题。单点故障
  • 消息传递(Messages Passing)。而 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 协议

Paxos

Raft

ZAB

资料

拜占庭将军问题:有叛徒的情况下,如何才能达成共识?