当前位置: 首页 > news >正文

一些共识协议与算法

学习笔记,不一定正确。均有参考学习他人博客。

一、分布式系统相关概念

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)缺点:代表选举公平性影响系统安全性,需强加密和激励机制。

http://www.dtcms.com/a/267943.html

相关文章:

  • docker 无法拉取镜像解决方法
  • 【机器学习深度学习】混淆矩阵解读
  • 算法分析与设计实验1:实现两路合并排序和折半插入排序
  • PLC 智能设备 (I-Device):从原理到实战的 Profinet 通信进阶
  • SwiftUI 7(iOS 26 / iPadOS 26)中玻璃化标签页的全新玩法
  • Vue3路由跳转优化:让你的页面切换像德芙一样丝滑 [特殊字符]
  • 【认知】如何强化优先做紧急重要的事,而不是按兴趣做重要但不紧急的事
  • 黑马点评系列问题之实战篇02短信登录 利用资料中的mysql语句创建数据表时报错
  • 【Spring源码学习系列】基础架构和环境搭建
  • Redis+Caffeine双层缓存策略对比与实践指南
  • LabVIEW与西门子轴承诊断
  • 【数据分析】R语言多源数据的基线特征汇总
  • LNMP搭建discuz论坛
  • 【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
  • 【Vibe Coding 实战】我如何用 AI 把一张草图变成了能跑的应用
  • 2048小游戏实现
  • 双指针法移除元素
  • 基于文心开源大模型ERNIE-4.5-0.3B-Paddle私有化部署并构建一个企业智能客服系统
  • 小菜狗的云计算之旅,今天学习MySQL数据库基础知识及操作
  • OpenGL ES 纹理以及纹理的映射
  • 【一起来学AI大模型】数据处理核心:NumPy/Pandas/Matplotlib 精要指南
  • HarmonyOS开发实战:鸿蒙分布式生态构建与多设备协同发布全流程详解
  • Flink ClickHouse 连接器数据写入源码深度解析
  • Qt实战:使用QSqlDatabase连接MySQL,并实现增删改查
  • JavaFX项目的搭建【授课用】
  • Qt:QWidget常用属性
  • NV205NV209美光固态闪存NV210NV215
  • QT并发机制
  • Qt实现外网双向音视频通话/支持嵌入式板子/实时性好延迟低/可以加水印
  • Linux系统移植(7.4)