分布式系统–拜占庭将军问题(The Byzantine Generals Problem)
本文档作为分布式系统的学习基础,通过拜占庭问题取尝试先了解分布式系统里面可能存在的基础问题。拜占庭将军问题,主要为了解决在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议的问题。
拜占庭错误是莱斯利·兰伯特在《拜占庭将军问题》中提出的一个错误模型,描述了一个完全不可信的场景,除了存在故障行为,还存在恶意行为。顾名思义,拜占庭容错(Byzantine Fault Tolerance,BFT),就是指能容忍拜占庭错误了。莱斯利·兰伯特( Leslie Lamport )通过这个比喻,表达了计算机网络中所存在的一致性问题。
非拜占庭容错,又叫故障容错(Crash Fault Tolerance,CFT),解决的是分布式系统中存在故障,但不存在恶意节点的共识问题,比如进程奔溃,服务器硬件故障等等。
共识问题
共识难题,也就是如何在可能有误导信息的情况下,采用合适的通讯机制,让多个将军达成共识,制定一致性的作战计划?
李牧作为合纵长,燕,齐,韩三国合纵想要攻打秦国,但是只有3国出半数以上的将军才能打赢秦国。
共识在这里表示的就是三国将军都收到准确的消息,达成一致性决定在某个时间攻打。一般情况下,每国投票,最后少数服从多数即可达成一致决定,例如:
燕,齐将军决定要打秦国
韩国将军想撤退
按照少数服从多数的原则,韩国将军也会出兵攻打秦国。
两忠一叛
可以看到,在正常情况下,信息一致,是能够形成共识的。但是,只要一旦燕,齐国将军有其中一国通秦,就会形成作战计划不一致的问题。例如燕国将军通秦,燕国将军向韩国将军发攻打,给齐国将军发送撤退:
韩国将军收到的信息就是,2攻打:1撤退
齐国将军看到的信息就是,1攻打:2撤退
按照少数服从多数的原则,最终就是韩国将军自己面对秦国,最后败于秦国。这里的问题就出在,其中里面有一国出了叛徒,导致发送了错误的信息。
解决方案
口信消息型拜占庭问题之解
首先,3位将军都分拨一部分军队,由李牧率领,李牧参与作战计划讨论并执行作战指令。这样,3 位将军的作战讨论,就变为了 4位将军的作战讨论,这能够增加讨论中忠诚国家的数量。
然后,4 位将军还约定了,如果没有收到命令,就执行预设的默认命令,比如“撤退”。除此之外,还约定一些流程来发送作战信息、执行作战指令
原创不易,完成人机校验,阅读全文