先简单的说明下拜占庭问题:
拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文[1]中提出的分布式对等网络通信容错问题。维基百科
拜占庭将军们为了围攻一座城池,他们之间只能通过投票与信使的方式决定是同时“进攻”或“撤离”的方案。既时将军中有“叛徒将军”或者“被杀害的信使”,何如依然保证目标(决策:同时进攻或者撤离)的一致性?
将军们用这种方式决策,展示了分布式计算中资源的独立性,仅能通过网络进行通信。众所周知网络是不可靠的(数据丢失或者错误的数据)。
拜占庭算法(Practical Byzantine Fault Tolerance,PBFT)问题的数学逻辑:
量值定义:
V:投票数(物理节点数)
R:最小成功读(查)的物理节点数
W:最小成功写(增,删,改)的物理节点数
满足以下原则:
- 同一数据不能同时进行读写操作:R>V-W & W>V-R
- 同一数据不能同时写操作(写串行性): W>V/2
综上,解不等式可得:R+W>V且W>V/2
3.读写节点平衡原则:即:R=W=Q
所以上述R+W>V且W>V/2----->变为:Q>V/2
我们知道网络是不可靠的,所以加入物理节点宕机因子f(宕机节点数)。
定义:n:集群中物理总节点数,那么n,f,Q之间的关系又是怎样呢?
CFT(Crash Fault Tolerance)算法:保证集群系统中的活性与所有节点间的数据一致性
满足活性:Q<=n-f 及上述的不等式Q>V/2,即:Q>n/2 ,综合得:n>2f
BFT(Byzantine Fault Tolerance)算法:保证集群系统中的活性与可靠节点间数据一致性
满足可靠节点间容错性的情况下:上述的不等式R+W>V且W>V/2,即:(Q-f)+(Q-f)>n-f且(Q-f)>(n-f)/2,进一步变换得:Q>(n+f)/2
满足活性:Q<=n-f
BFT算法下综合得:n>3f
所以:在CFT算法下,能够容忍的宕机节点数最多为f<n/2;
BFT算法下,能够容忍的宕机节点数最多为f<n/3;
上述描述的就是Quorum机制,zookeeper中就使用到了这种机制。