我对拜占庭将军问题的理解

309 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

定义

拜占庭将军问题是由莱斯利.兰伯特(Leslie Lamport)提出,分布式系统中分布式共识问题现实世界的模型化描述。

关联概念

分布式系统

分布式系统 由多个分布在网络上的应用节点共同组成的系统。

分布式共识

分布式共识是指,分布式系统多个应用节点在某一项决策上达成共识并通过决策,将决策执行在每一个应用节点上。

拜占庭问题概述

拜占庭帝国将率领军队围攻一座城市,军队有多支军队组成,每支军队由一个将军统帅指挥。将军们只能通过信使相互传递消息。在观察敌情后,他们必须制定一个共同行动计划,是进攻(Attack)还是撤退(Retreat),只有当半数以上的将军共同发起进攻时才能获得胜利。然而其中一些将军可能是叛徒,试图阻止忠诚的将军达成一致的行动计划。负责消息传递的信使也可能是叛徒,他们可能篡改或伪造消息,信使也可能被敌军抓获截杀,导致消息丢失。

在计算机分布式系统中可以描述为以下情形。 在分布式系统中,存在多个节点,这些节点中存在运行良好的节点,有些节点可能被非法控制或者故障宕机,节点间通过网络相互连接发送消息,在网络通信中,消息可能因为故障丢失,或者被非法攻击导致消息被篡改或伪造。考虑到这些异常情况下,如何让分布式系统中节点达成共识让各个节点保持一致且正确(运行良好的节点都能够让别的接受接收到自己的真实消息,并最终一致行动)。

一致性和正确性

一致性是指所有忠诚的将军行动都是一致的,要么都进攻,要么都撤退. 但是仅仅是一致性并不能完全解决问题,如果 万事俱备客观上每个忠诚将军只要进攻了就能取得胜利,但应为叛徒的存在他们都一致的没有进攻,反之条件不利,将军本不应该进攻,但因为叛徒的存在所有人都一致的进攻了。 正确性:每个忠诚的将军都正确的表达了自己的意思,不会因为叛徒让别的将军认为忠诚的将军是叛徒而不采用他传达的消息

注意: 拜占庭将军问题并不考虑信使是否会被截获或者无法传达消息等问题,即消息传递的信道绝无问题。Lamport已经证明在消息可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的,所以在研究拜占庭将军问题时,我们已经假定了信道是没有问题的。

内涵

在缺少可信任的中央节点和可信任的通道情况下,由于硬件错误、网络阻塞或断开以及遭到恶意攻击,计算机和网络出现不可预料的行为,分布在网络中的各个节点如何达成共识。

上文主要描述了拜占庭将军问题的一些概念,拜占庭将军问题是分布式系统中比较复杂的分布式一致性模型。分布式系统即存在系统、网络故障,也存在对节点、通信恶意攻击。但是有些场景下,只存在系统或网络故障,并不存在恶意攻击的场景,因此分布式一致性协议和算法也可分为两类

  • 一类是 故障容错算法(Crash Fault Tolerance ,CFT),即非拜占庭容错算法,解决的是分布式系统中存在故障,但不存在恶意攻击的场景下的共识问题。在该场景下可能存在,节点宕机、网络分区、消息丢失,消息重复,但不存在消息被篡改或伪造的场景。一般用于局域网场景下的分布式系统,如分布式数据库。常见算法有Paxos算法,Raft算法,ZAB协议等
  • 一类是 拜占庭容错算法,可以解决分布式系统中既存在故障,有存在恶意攻击场景下的共识问题。一般用于互联网场景下的分布式系统,如数字货币的区块链技术中,常见算法有PBFT,POW算法。

下几节将继续介绍以下内容

  • 拜占庭问题的解决方法理解
  • pow 理解
  • PBFT理解
  • Paxos 理解
  • Raft 理解
  • ZAB 理解