分布式一致性算法07:OM

一、概述
前面讲的几种一致性算法,比较适合封闭式网络,各节点都是可信的,也就是没有节点故意作恶。
但对于开放式网络,可以允许任意节点加入的时候,我们无法判定这些节点是否有恶意,也就是无法判定这些节点是否可信。
此时,我们就需要一种新的思路了:
当存在少数节点作恶( 消息可能被伪造) 场景下,其余节点如何达成一致性呢?
对于此种场景,最出名的就是拜占庭算法,而为了更快的理解拜占庭算法,我们要先解释一下拜占庭问题。

二、拜占庭将军问题(The Byzantine Generals Problem)
拜占庭问题又叫拜占庭将军问题,是Leslie Lamport在1982年提出用来解释一致性问题的一个虚构模型。
拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统节点) 需要通过信使来传递消息,达成某些一致的决定。
但由于将军中可能存在叛徒(恶意节点),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。
拜占庭问题即为在此情况下,如何让忠诚的将军们能达成行动的一致。
(其实,还有一个隐含的限定,就是节点无法伪装为其他节点,实际中可以通过签名算法来达到这个目的)。

这样说可能有些抽象,我们举个例子:
比如一共有3个将军G1~G3,3个将军约定,少数服从多数。
G1、G2为忠诚的将军,G3是个叛徒
此时,G3有多种破坏方案,让G1和G2无法取得共识:

1、破坏方案A、否认提案内容,消息重放
比如:G1发起提案,G1要求明天进攻A城市,要把消息发给G2~G3

但G3先收到了消息,然后通过小道(比如更快的路由)向G2发送了“撤退”的提案
G2先收到了撤退的消息,后收到进攻的消息
G3向G1反馈进攻

结果:(G1被欺骗,G2被劫持)
由于只有G1发起了进攻,兵力不足,吃了败仗。
G3一口咬定,收到了G1要撤退的消息。

2、破坏方案B、故意发起错误提案
比如:G3发起提案,要把消息发给G1~G2。
但G3给G1的提案是进攻,给G2的提案时撤退

结果:(G1和G2不一致,但G1和G2认为彼此一致)
由于只有G1发起了进攻,兵力不足,吃了败仗。
G3一口咬定,发送了撤退的消息。

3、破坏方案C、故意传播相反的消息,操纵投票结果
比如:G1发起提案,G1要求明天进攻A城市,要把消息发给G2~G3。

此时:
G1希望进攻
G2希望撤退(比如节点有问题,无法接收事务提交)
G3是个叛徒,他给G1答复“进攻”,给G2答复“撤退”

结果:(G1和G2不一致,但G1和G2认为彼此一致)
G1收到了2票进攻,1票撤退,于是进攻
G2收到了1票进攻,2票撤退,于是撤退
G3是个叛徒,撤退
由于只有G1发起了进攻,兵力不足,吃了败仗。

三、Byzantine Fault Tolerant (BFT) 算法
对于上述问题,作者提出了一种BFT算法(OM算法),并证明了:
当叛变者为m,将军总人数不小于3m+1时,存在有效的算法,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。
或者,当将军总人数为n,当叛变者不大于(n-1)/3时(向下取整),存在有效的算法,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。

当恶意节点为m,节点总数必须不小于3m+1,可以这样证明:
在极端情况下:
a、m个正常节点下线。
b、m个恶意节点给出同一的恶意结论F。
c、此时必须至少有m+1个正常节点,给出正确结论T,才能保证系统得到结论T
因此节点总数,必须不小于3m+1

可见,能确保达成一致的拜占庭系统节点数至少为 4,允许出现1个坏的节点。如果叛变者过多,则无法保证能达到一致性。

四、OM算法过程
OM算法(Oral Message Algorithm)的核心思想是通过递归的方式,将命令从指挥官传递给下属,确保所有忠诚的下属最终都能接收到相同的命令。
OM算法复杂度为O(n^(m+1)),就是当有m个叛变者时,进行m+1轮递归通讯。
算法复杂度太大,在实际工程中无法应用。

1、初始化:
指挥官(通常是忠诚的将军)发送其命令给所有其他将军。
如果某个将军没有收到命令,则默认执行撤退命令。

2、递归传递:
每个将军在接收到命令后,会将该命令传递给其他未收到命令的将军。
如果某个将军接收到多个不同的命令,它会选择一个多数命令作为最终命令。

3、递归终止:
当所有将军都接收到相同的命令时,递归终止。
最终,所有忠诚的将军都会执行相同的命令。

具体步骤如下:
1、OM(0):(递归终止条件)
指挥官发送其命令给所有其他将军。
每个将军使用接收到的命令来做出决策。如果没有接收到命令,则使用默认命令(撤退)。

2、OM(x):(递归步骤:x=m、m-1、…、2、1):
指挥官发送其命令给所有其他n位将军。
对于每个将军i,如果它接收到命令,则将军i作为新的指挥官,执行OM(x-1),并将其收到的多数命令,传递给其他n-2位将军。

3、重复上述过程,所有忠诚的将军都会执行相同的命令。

Leave a Reply

Your email address will not be published. Required fields are marked *

*