分布式算法学习---拜占庭将军问题

拜占庭将军问题很好的抽象了分布式系统面临的共识问题。
以六国与秦国作战作为类比,先做以下的假设:
忠诚的将军,你可以理解为正常运行的计算机节点;
叛变的将军,你可以理解为出现故障并会发送误导信息的计算机节点;
信使被杀,可以理解为通讯故障、信息丢失;
信使被间谍替换,可以理解为通讯被中间人攻击,攻击者在恶意伪造信息和劫持通讯。

以三个国家攻打秦国为例,假设秦国很强大,需要半数以上的国家同时进攻才能打败秦国。统帅为苏秦。
那么苏秦面临着怎么统一作战的问题。
二忠一叛的难题
按照少数服从多数的原则,只要大多数的意见一致就可以了。
比如:
1 齐根据侦查情况决定撤退;
2 楚和燕根据侦查信息,决定进攻。
按照原则,齐也会进攻。最终,3 支军队同时进攻,大败秦军
分布式算法学习---拜占庭将军问题_第1张图片
问题出现了:
楚这个叛徒在暗中配合秦国,让信使向齐发送了“撤退”,向燕发送了“进攻”,就会出现作战计划不一致的问题。
燕看到的是,撤退:进攻 =1:2;
齐看到的是,撤退:进攻 =2:1。
分布式算法学习---拜占庭将军问题_第2张图片
解决办法之一:口信消息型拜占庭问题之解
第一步,加多一个将军,三位将军都分拨一部分军队,由苏秦率领。变成两轮协商。
第一论:
假设苏秦先发起进攻的指令:
分布式算法学习---拜占庭将军问题_第3张图片
第二轮:
齐、楚、燕分别作为指挥官,向另外 2 位发送作战信息“进攻”,楚是叛变的,所以发送的是撤退:
分布式算法学习---拜占庭将军问题_第4张图片
最后呢,齐和燕收到的作战信息都是“进攻、进攻、撤退”,按照原则,齐和燕与苏秦一起执行作战指令“进攻”,实现了作战计划的一致性,保证了作战的胜利。
假设是楚先发送作战信息呢:
在第一轮作战信息协商中,楚向苏秦发送作战指令“进攻”,向齐、燕发送作战指令“撤退”。
分布式算法学习---拜占庭将军问题_第5张图片
第二轮作战信息协商中,苏秦、齐、燕分别作为指挥官,向另外两位发送作战信息。
分布式算法学习---拜占庭将军问题_第6张图片
最后,苏秦、齐和燕收到的作战信息都是“撤退、撤退、进攻”,按照原则,苏秦、齐和燕一起执行作战指令“撤退”,实现了作战计划的一致性。
兰伯特在论文《The Byzantine Generals Problem》中提到的口信消息型拜占庭问题之解:如果叛将人数为 m,将军人数不能少于 3m + 1 ,那么拜占庭将军问题就能解决了。
其中,首先要知道叛将的人数m,m决定了要递归循环多少次(要进行多少次协商,m+1轮)。n 位将军,最多能容忍 (n - 1) / 3 位叛将。
解决办法二:签名消息型拜占庭问题之解
通过签名的方式,实现在不增加将军的情况下,解决拜占庭将军问题。
必须要实现:
1 忠诚将军的签名无法伪造,而且对他签名消息的内容进行任何更改都会被发现;
2 任何人都能验证将军签名的真伪。
对于收到伪造的信息,将会忽略。
比如:
分布式算法学习---拜占庭将军问题_第7张图片
叛将先发送消息的情况下,齐和燕会根据一定的规则,在接受到的所有消息进行排序后,选择一个进行执行,达到一致的作战计划。
分布式算法学习---拜占庭将军问题_第8张图片
通过签名机制约束叛将的叛变行为,任何叛变行为都会被发现,也就会实现无论有多少忠诚的将军和多少叛将,忠诚的将军们总能达成一致的作战计划。
拜占庭容错算法(BFT):在区块链或者存在恶意节点的情况下必须使用拜占庭容错,常见的有POW算法,PBFT算法。
非拜占庭容错算法,即故障容错算法(CRT): 解决的是分布式的系统中存在故障,但不存在恶意节点的场景下的共识问题
常见的算法有 Paxos 算法、Raft 算法、ZAB 协议。

你可能感兴趣的:(分布式算法学习笔记)