一些共识协议与算法
学习笔记,不一定正确。均有参考学习他人博客。
一、分布式系统相关概念
1、分布式系统错误类型:
-
非拜占庭错误(节点无恶意):节点崩溃、网络故障丢包导致消息丢失或重复
-
拜占庭错误:存在恶意节点,延迟、拒绝消息或发出错误的消息
2、gossip协议:https://zhuanlan.zhihu.com/p/676862634
(1)流程:
a、节点启动:节点启动时,它会加入到gossip群体中,并与其他节点建立连接。
b、信息交换:每个节点会周期性地向其他节点发送自己的状态信息,同时也会接收其他节点的状态信息。
c、状态同步:接收到其他节点的状态信息后会与本地的状态信息进行比较,若发现有更新则会进行状态同步,同时会将更新的状态信息广播给其他节点,其他节点也会这样做。
d、节点故障:当某个节点发生故障或异常时,其他节点会检测到该节点的状态变化,并将该节点从 Gossip 群体中移除
(2)操作:
a、查询操作:当一个节点需要查询数据时,它会向 Gossip 群体中的其他节点发送查询请求。其他节点接收到查询请求后,会检查本地是否有对应的数据,如果有,则将数据返回给查询节点。如果没有,则会将查询请求广播给其他节点,直到有节点返回对应的数据为止
b、更新操作:当一个节点需要更新数据时,它会将更新请求广播给 Gossip 群体中的其他节点。其他节点接收到更新请求后,会检查本地是否有对应的数据,如果有,则进行数据更新。同时,其他节点也会将更新请求广播给其他节点,直到所有节点都完成数据更新
二、崩溃容错(CFT)共识协议
1、Paxos算法
(1)组成:
-
提议者(Proposer):负责发起提议(proposal)
-
接受者(Acceptor):负责接收提议,并根据提议编号决定是否接受该提议
-
学习者(Learner):负责学习最终被接受的提议值
(2)数据结构:
-
提议(Proposal):
-
提议编号(Proposal Number):全局唯一的编号,通常由提议者的ID和递增的序列号组成,用于表示提议的优先级。编号越大,优先级越高
-
提议值(Proposal Value):提议的内容,例如某个操作或决定
-
-
接受者维护状态:已接受的最高编号的提议
(3)一次paxos实例的流程(一次paxos实例最终只达成一个提议共识):
a、准备阶段(Prepare Phase):
· 提议者选择一个新的、比之前任何提议编号都大的编号n
· 提议者向所有接受者发送包含编号n的准备请求
· 若接受者未收到过编号大于n的请求,它会承诺不再接受编号小于n的提议,并返回之前接受的最高编号的提议(若有)。否则拒绝此次准备请求,不做出响应
b、接受阶段(Accept Phase):
· 提议者收到多数响应后,若响应中均不包含接受者已接受的提议,则提议者可自由选择一个值作为提议值,否则选择响应中编号最大的提议值
· 提议者向所有接受者发送接受请求,包含编号n和提议值v
· 如果接受者未收到过编号大于n的准备请求,则接受提议(n,v),并更新自己的状态,否则拒绝此次接受请求
· 一旦某个提议被多数接受者接受,学习者学习该值为最终共识值
2、Multi-Paxos算法
(1)组成:
-
提议者(Proposer):通常由一个稳定的领导者担任,负责发起提议(proposal)
-
接受者(Acceptor):负责接收提议,并根据提议编号决定是否接受该提议;为每个实例维护独立的状态
-
学习者(Learner):负责学习每个实例中被选定的共识值
(2)数据结构:
-
实例编号(Instance Number):标识每个独立的共识实例,通常是一个递增的整数
-
提议(Proposal):
-
提议编号(Proposal Number):全局唯一的编号,通常由提议者的ID和递增的序列号组成,用于表示提议的优先级。编号越大,优先级越高
-
提议值(Proposal Value):提议的内容,例如某个操作或决定
-
-
接受者的状态:接受者为每个实例维护已接受的编号最高的提议
(3)流程:
a、领导者选举:通过某种方式(如基于超时的心跳机制)选举一个领导,负责后续所有实例的提议,直到它失败或被替换
b、Prepare阶段:在领导者稳定的情况下这一阶段只需执行一次,因为单领导模式可以确认不会有更大的提议编号出现:
· 对于当前实例,领导者发送一个prepare请求,携带一个较大的提议编号n
· 接受者承诺不接受编号小于n的提议,返回当前实例上已接受的最高编号的提议(若有)
c、Accept阶段:
· 领导者选择一个值(通常来自客户端请求),发送Accept请求
· 接受者若未承诺更高的prepare编号,则接受该提议
· 当大多数接受者接受某个实例的提议时,该实例的值被选定
d、学习阶段
· 学习者从接受者或领导者获知每个实例的选定值
3、Raft算法
(1)组成:
-
领导者Leader:负责日志的复制,向跟随者发送日志条目,处理客户端请求,周期性地发送心跳(AppendEntries RPC)以告诉其他节点自己是Leader
-
跟随者Follower:从领导者复制日志,响应领导者或候选者的请求
-
候选者Candidate:当感受不到领导者的存在时,跟随者会进入候选者状态,发起选举。为领导者和跟随者的中间状态
(2)任期:
-
用递增的数字作为编号
-
在每个任期内,可以没有Leader,但是不能出现大于等于两个的Leader
-
每个任期由选举Election开始,处于Candidate状态的节点竞争产生新的Leader,若一个Candidate赢得了选举,就会在该任期的剩余时间担任领导人。若没有选出领导者,则会开始下一个任期,重新进行选举
(3)数据结构:
-
所有节点维护:
-
日志Log:包含一系列日志条目,每个条目包括命令和元数据(如Term编号和全局唯一的Log Index),用于记录操作
-
提交索引Commit Index:节点已知被提交的最高日志索引
-
最后应用索引Last Applied:节点已应用到状态机的最高日志索引
-
有限状态机FSM:用于确保各个节点中的日志序列是确定的(以相同的顺序写入)
-
-
领导者额外维护:
-
下一个索引Next Index:为每个跟随者记录下一个要发送的日志索引
-
匹配索引Match Index:记录每个跟随者已复制的最高日志索引
-
-
心跳AppendEntries RPC:
-
当前Term编号
-
领导者ID
-
前一日志索引prevLogIndex:领导者认为跟随者已有的最后一个日志索引
-
前一日志任期prevLogTerm:该日志索引对应的任期
-
提交索引:领导者的提交索引
-
(4)流程:
a、领导者选举:每个跟随者Follower都有自己的随机化选举时间,到期时可变为Candidate参加选举。选举时,Follower增加其Term编号并改变状态为Candidate状态,然后向其他节点发出RequestVote RPC,每个节点每个任期最多投一票。然后可能发生:
· 候选者获得多数选票,候选者成为领导者,向其他节点发送心跳;
· 候选者接收到来自Leader发送来的心跳AppendEntries RPC,若RPC的Term编号≥自身的Term编号,则承认该Leader,自身状态变为Follower,否则拒绝承认Leader,状态仍然为Candidate;
· 旧任期的领导者通过候选者的响应(包含更高任期号)得知新任期,更新自身任期号并变为跟随者;
· 一直没有Leader产生,则Term递增,重新选举。
b、日志复制:
Leader选举出来后便开始负责客户端的请求,接受请求并将其追加到Log的尾部,然后向其他节点发出AppendEntries RPC,包括:
· 当前Term编号
· 领导者ID
· 前一日志条目的索引prevLogIndex和任期prevLogTerm,用于一致性检查
· 要追加的日志条目列表
· 领导者的提交索引commitIndex
跟随者接收appendEntries时:
· 若Term编号小于当前任期,或前一日志条目的索引和任期不匹配,则拒绝请求
· 若匹配,追加新条目到日志
领导者通过调整 nextIndex(若跟随者拒绝,减少 nextIndex 重试)确保日志一致
一旦该日志条目被多数节点复制,此时该条目被视为提交,领导者将提交索引commitIndex更新为该条目索引,并通过appendEntries通知跟随者,然后将提交的条目应用到状态机并响应客户端。跟随者收到更新后将commitIndex设置为领导者提交索引与自身日志最后索引的较小者,并将提交的条目应用到状态机。
三、拜占庭BFT容错
1、实用拜占庭容错PBFT:在副本数量n=3f+1的情况下,最多可容忍f个拜占庭故障
(1)组成:
-
客户端client
-
副本:
-
主节点primary:1个,负责请求排序
-
备份节点backups:n-1个,验证主节点的行为并参与共识投票
-
(2)数据结构:
-
每个副本维护:
-
状态机State Machine:执行请求以更新系统状态,确保一致性
-
日志Log:记录已同意的请求序列,包含序列号和请求内容
-
视图信息View Information:每个副本跟踪当前视图,视图由主节点编号标识,记录主节点身份,用于主节点切换
-
-
消息:包括预准备、准备和提交消息
(3)流程:
a、客户端client向主节点primary发送请求
b、主节点为请求分配序列号,向所有副本广播预准备消息,消息包括请求、序列号和视图号
c、副本验证后向其他所有副本广播准备消息
d、收到2f个准备消息后,副本向其他所有副本广播提交消息(2f确保同意的诚实节点占多数)
e、收到f+1个提交消息后,副本执行请求并回复客户端。客户端等待f+1个不同副本的回复,取多数结果(f+1确保至少有一个诚实节点已提交)
(4)缺点:通信开销高(O(n^2)),视图变更可能导致性能下降。
2、联邦拜占庭协议FBA
(1)组成:由多个节点组成,每个节点有自己的仲裁片(quorum slice),定义信任的节点集
(2)数据结构:
-
每个节点维护:
-
账本Ledger:记录交易序列,反映系统状态
-
仲裁片定义
-
视图信息View Information:每个副本跟踪当前视图,视图由主节点编号标识,记录主节点身份,用于主节点切换
-
-
消息:包括提案prepare、确认confirm和提交commit消息,节点通过这些消息达成共识
(3)流程:
a、节点提案交易,广播准备消息
b、其他节点接收准备消息,若同意,广播自身准备消息,形成投票网络
c、节点若收到仲裁片多数节点的准备消息,确认该交易,广播确认消息
d、当节点和其仲裁片确认交易,且收到其他仲裁片多数确认,交易被提交,更新账本
3、授权拜占庭容错算法dBFT:在副本数量n=3f+1的情况下,最多可容忍f个拜占庭故障
(1)组成:
-
节点Nodes:持有权益或投票权
-
代表Delegates:通过选举选出的节点子集,组成共识委员会,负责共识过程
-
共识委员会Consensus Committee:当前轮次的代表集,动态变化
(2)数据结构:
-
区块链:每个代表维护区块链,包括账本和交易日志
-
轮次和领导者信息(round and leader information):跟踪当前共识轮次和选定的领导者
-
投票记录:代表记录其他代表的投票结果,用于达成一致
-
状态信息:包括当前块高度、交易池和共识状态
(3)流程:
a、代表选举Delegate Election:节点基于权益或投票权选举代表,可能通过智能合约或投票机制
b、共识轮次Consensus Round:
· 领导者选择Leader Selection:每轮从代表中选一领导者,可能按轮流或随机
· 块提案Block Proposal:领导者提案包含交易的块,广播至其他代表
· 验证和投票Verification and Voting:其他代表验证块有效性,投票赞成或反对
· 共识达成Consensus:若获超多数票,块被确认
c、块最终化Block Finalization:确认的块加入区块链,更新状态,进入下一轮
(4)缺点:代表选举公平性影响系统安全性,需强加密和激励机制。