相关链接:https://www.zhihu.com/search?type=content&q=PBFT%20%E4%B8%8E%20RAft(共识算法系列之一:raft和pbft算法,美团技术团队),介绍了两者基本流程,点到了两者的核心区别,但没有细致分析(当 raft 节点拜占庭时,raft 导致的失败——不一致场景,换用 pbft 如何避免这种情况)
raft 算法和 pbft 算法是私链和联盟链中经典的共识算法,本文主要介绍了 raft 和 pbft 算法的流程和区别。 raft 和 pbft 算法有两点根本区别:
- raft 算法从节点不会拒绝主节点的请求,而 pbft 算法从节点在某些情况下会拒绝主节点的请求 ;
- raft 算法只能容错故障节点,并且最大容错节点数为 (n-1)/2 ,而 pbft 算法能容错故障节点和作恶节点,最大容错节点数为 (n-1)/3 。
本文没有涉及算法正确性和收敛性的证明,从算法设计的角度来讲,是需要做这两方面工作的
流程的对比上,对于 leader 选举这块, raft 算法本质是谁快谁当选,而 pbft 算法是按编号依次轮流做主节点。对于共识过程和重选 leader 机制这块,为了更形象的描述这两个算法,接下来会把 raft 和 pbft 的共识过程比喻成一个团队是如何执行命令的过程,从这个角度去理解 raft 算法和 pbft 的区别。
一个团队一定会有一个老大和普通成员。对于 raft 算法,共识过程就是:只要老大还没挂,老大说什么,我们(团队普通成员)就做什么,坚决执行。那什么时候重新老大呢?只有当老大挂了才重选老大,不然生是老大的人,死是老大的鬼。
对于 pbft 算法,共识过程就是:老大向我发送命令时,当我认为老大的命令是有问题时,我会拒绝执行。就算我认为老大的命令是对的,我还会问下团队的其它成员老大的命令是否是对的,只有大多数人 (2f+1) 都认为老大的命令是对的时候,我才会去执行命令。那什么时候重选老大呢?老大挂了当然要重选,如果大多数人都认为老大不称职或者有问题时,我们也会重新选择老大。
作者:美图技术团队
链接:https://zhuanlan.zhihu.com/p/35847127
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Raft 安全性子约束(括号内描述拜占庭节点如何破坏各个自约束)
safety : 即在任何情况下,系统都不能出现不可逆的错误,也不能向客户端返回错误的内容 。 Raft 通过保证如下属性来保证安全性。- Election Safety:在一个任期内最多只能选出一位*。(拜占庭节点会向多个候选者投票,使得多个候选者都以为得到了超半数投票)
- Leader Append-Only:Leader从不覆盖或删除日志中的条目;它只添加新entry (*)
- Log Matching:如果两个节点上的某个log entry的log index相同且term相同,则它们所存储的命令是相同的,且在该index之前的所有log entry应该都是相同的。依赖于:
-
Leader Completeness:如果一个log entry在某个任期被提交(committed),那么这条日志一定会出现在所有更高term的leader的日志里面。即保证leader包含最新的已提交的日志。