一文详解一致性协议

news2024/9/29 13:24:46

目录

一致性协议

2PC二阶段提交

二阶段提交存在的问题:

3PC 三阶段提交

优点

Paxos算法

流程演变

Paxos优缺点

活锁问题

ZAB协议(Fast Paxos)


一致性协议

事务需要跨多个分布式节点时,为了保证事务的ACID特性,需要选举出一个协调者来协调分布式各个节 点的调度,基于这个思想衍生了多种一致性协议:

2PC二阶段提交

 

阶段一 提交事务请求

  1. 协调者向所有的参与者节点发送事务内容,询问是否可以执行事务操作,并等待其他参与者节点的反馈
  2. 各参与者节点执行事务操作
  3. 各参与者节点反馈给协调者,事务是否可以执行

阶段二 事务提交

根据一阶段各个参与者节点反馈的ack,如果所有参与者节点反馈ack,则执行事务提交,否则中断事务

事务提交:

  1. 协调者向各个参与者节点发送commit请求
  2. 参与者节点接受到commit请求后,执行事务的提交操作
  3. 各参与者节点完成事务提交后,向协调者返送提交commit成功确认消息
  4. 协调者接受各个参与者节点的ack后,完成事务commit

中断事务:

  1. 发送回滚请求
  2. 各个参与者节点回滚事务
  3. 反馈给协调者事务回滚结果
  4. 协调者接受各参与者节点ack后回滚事务

二阶段提交存在的问题:

  • 同步阻塞

二阶段提交过程中,所有参与事务操作的节点处于同步阻塞状态,无法进行其他的操作

  • 单点问题

一旦协调者出现单点故障,无法保证事务的一致性操作

  • 脑裂导致数据不一致

如果分布式节点出现网络分区,某些参与者未收到commit提交命令。则出现部分参与者完成数据提交。未收到commit的命令的参与者则无法进行事务提交,整个分布式系统便出现了数据不一致性现象。

3PC 三阶段提交

3PC是2PC的改进版,实质是将2PC中提交事务请求拆分为两步,形成了CanCommit、PreCommit、 doCommit三个阶段的事务一致性协议

 

阶段一 : CanCommit

1、事务询问

2、各参与者节点向协调者反馈事务询问的响应

阶段二 : PreCommit

根据阶段一的反馈结果分为两种情况

1、执行事务预提交

  • 1)发送预提交请求  协调者向所有参与者节点发送preCommit请求,进入prepared阶段
  • 2)事务预提交  各参与者节点接受到preCommit请求后,执行事务操作
  • 3)各参与者节点向协调者反馈事务执行

2、中断事务

任意一个参与者节点反馈给协调者响应No时,或者在等待超时后,协调者还未收到参与者的反馈,就中断事务,中断事务分为两步:

  • 1)协调者向各个参与者节点发送abort请求
  • 2)参与者收到abort请求,或者等待超时时间后,中断事务

阶段三 : doCommit

1、执行提交

  • 1)发送提交请求  协调者向所有参与者节点发送doCommit请求
  • 2)事务提交  各参与者节点接受到doCommit请求后,执行事务提交操作
  • 3)反馈事务提交结果  各参与者节点完成事务提交以后,向协调者发送ack
  • 4)事务完成  协调者接受各个参与者反馈的ack后,完成事务

2、中断事务

  • 1)参与者接受到abort请求后,执行事务回滚
  • 2)参与者完成事务回滚以后,向协调者发送ack
  • 3)协调者接受回滚ack后,回滚事务

3PC相较于2PC而言,解决了协调者挂点后参与者无限阻塞和单点问题,但是仍然无法解决网络分区问题

优点

  1. 首先对于协调者和参与者都设置了超时机制(在2PC中,只有协调者拥有超时机制,即如果在一定时间内没有收 到参与者的消息则默认失败),主要是避免了参与者在长时间无法与协调者节点通讯(协调者挂掉了)的情况下,无法释放资源的问题,因为参与者自身拥有超时机制会在超时后,自动进行本地commit从而进行释放资源。而这种机制也侧面降低了整个事务的阻塞时间和范围。
  2. 通过CanCommit、PreCommit、DoCommit三个阶段的设计,相较于2PC而言,多设置了一个缓冲阶段保证了在最后提交阶段之前各参与节点的状态是一致的

Paxos算法

Paxos算法是Leslie Lamport 1990年提出的一种一致性算法,该算法是一种提高分布式系统容错性的一致性算法,解决了3PC中网络分区的问题,paxos算法可以在节点失效、网络分区、网络延迟等各种异常情况下保证所有节点都处于同一状态,同时paxos算法引入了“过半”理念,即少数服从多数原则。(主要是为了选Leader)

paxos有三个版本:

  • Basic Paxos

  • Multi Paxos

  • Fast Paxos

在paxos算法中,有四种种角色,分别具有三种不同的行为,但多数情况,一个进程可能同时充当多种角色。

  • client:系统外部角色,请求发起者,不参与决策

  • proposer:提案提议者

  • acceptor:提案的表决者,即是否accept该提案,只有超过半数以上的acceptor接受了提案,该 提案才被认为被“选定”

  • learners:提案的学习者,当提案被选定后,其同步执行提案,不参与决策

Paxos算法分为两个阶段:prepare阶段、accept阶段

  • prepare阶段

    • proposer提出一个提案,编号为N,发送给所有的acceptor。
    • 每个表决者都保存自己的accept的最大提案编号maxN,当表决者收到prepare(N)请求时,会 比较N与maxN的值,若N小于maxN,则提案已过时,拒绝prepare(N)请求。若N大于等于maxN, 则接受提案,并将该表决者曾经接受过的编号最大的提案Proposal(myid,maxN,value)反馈给提议者:其中myid表示表决者acceptor的标识id,maxN表示接受过的最大提案编号maxN,value表 示提案内容。若当前表决者未曾accept任何提议,会将proposal(myid,null,null)反馈给提议者。
  • accept阶段

    • 提议者proposal发出prepare(N),若收到超过半数表决者acceptor的反馈,proposal将真正的 提案内容proposal(N,value)发送给所有表决者。
    • 表决者acceptor接受提议者发送的proposal(N,value)提案后,会将自己曾经accept过的最大 提案编号maxN和反馈过的prepare的最大编号,若N大于这两个编号,则当前表决者accept该提案,并反馈给提议者。否则拒绝该提议。
    • 若提议者没有收到半数以上的表决者accept反馈,则重新进入prepare阶段,递增提案编号, 重新提出prepare请求。若收到半数以上的accept,则其他未向提议者反馈的表决者称为learner,主动同步提议者的提案。

流程演变

  • 正常流程

  • 单点故障,部分节点失败

  • proposer失败

  • Basic Paxos算法存在活锁问题(liveness)或dueling,而且较难实现

  • Multi Paxos: 唯一的proposor,即leader

  • 简化角色

Paxos优缺点

优点:paxos算法的优点很明显,按照此方法可以对多个数据值达到一致,收敛较好。

缺点:paxos算法的缺点是会出现活锁问题,考虑到一种极端的情况下,有两个proposer依次提出了一系列编号递增的议案,但是最终paxos无法形成最终的议案。

活锁问题

活锁就是永远不会结束的锁

  • Acceptor不再应答Proposal 提案号小于等于当前请求的Prepare请求

  • 意味着需要应答Proposal 提案号大于当前请求的Prepare请求

  • 两个Proposers交替Prepare成功,而Accept失败,形成活锁(Livelck)

  • 两个值会一直保持失败的状态

解决方式:稍微错开时间即可

ZAB协议(Fast Paxos)

由于paxos算法实现起来较难,存在活锁全序问题(无法保证两次最终提交的顺序),所以 zookeeper并没有使用paxos作为一致性协议,而是使用了ZAB协议。

ZAB(zookeeper atomic broadcast):是一种支持崩溃恢复的原子广播协议,基于Fast Paxos实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 1105. Filling Bookcase Shelves【记忆化搜索,动态规划】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

甘特图控件DHTMLX Gantt入门使用教程【引入】:dhtmlxGantt与ASP.NET Core(下)

DHTMLX Gantt 是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&a…

从Pandas快速切换到Polars :数据的ETL和查询

对于我们日常的数据清理、预处理和分析方面的大多数任务,Pandas已经绰绰有余。但是当数据量变得非常大时,它的性能开始下降。 我们以前的两篇文章来测试Pandas 1.5.3、polar和Pandas 2.0.0之间的性能了,Polars 正好可以解决大数据量是处理的…

电影《忠犬八公》观后感

上周看了电影《忠犬八公》,整部电影是以一条狗为故事线演绎的,之前看电影《忠犬帕尔玛》的时候,同事就推荐了《忠犬八公》,以为说的是同一部电影,去维基百科查过才知道,中国版的冯小刚为主演的《忠犬八公》…

全景丨0基础学习VR全景制作,平台篇第五章:开场封面功能

大家好欢迎观看蛙色平台使用教程 开场封面功能,现已支持开场图片和开场视频两种呈现方式, 分别针对PC端和移动设备访问分别设置呈现图片、视频内容,满足市场主流需求。 开场图片 传达主旨 1、全局-开场封面-图片 2、分别对PC端和移动设备访…

手动构建自己的docker容器镜像实战

前言 之前的实战中,我们实战中,我们使用的镜像都是镜像仓库已有的镜像。 已有的镜像都是别人已经开发好上传的。今天我们一起来看看如何构建自己的镜像并上传到镜像仓库中。 🏠个人主页:我是沐风晓月 🧑个人简介&…

[计算机图形学]光线追踪前瞻:阴影图(前瞻预习/复习回顾)

一、前言 我们前面学习过了光栅化,而光栅化会有一系列问题,比如:全局的光线传输,阴影。我们之前讲着色的时候说了,我们认为着色是一个局部的操作,我们只考虑着色点本身,并不考虑其它物体的遮挡对…

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标

3Dconnexion SpaceMouse Enterprise 企业版有线3D鼠标 企业版有线3D鼠标SpaceMouse Enterprise凭借六自由度(6DoF)传感器,以及标准和自定义快速视图的一键访问功能,你可以比以往更加轻松自如地查看3D模型。轻轻操纵控制帽即可流畅…

表白墙 - 进阶(MySQL版本) - 持久化存储

想要解决上面那个版本存在的问题:服务器重启,数据不丢失。 最好的办法:将数据存储到硬盘上。 存储的方式: 1、直接使用 流对象 写入文本文件 2、借助数据库 我们采取的方式:是 MySQL 数据库的方式 来实现 持久化存储。…

Python卷积详解

文章目录 卷积函数对比测试卷积应用 卷积函数 python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpy和signal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二 numpy.convolve(a, v, modef…

拥抱汽车行业新时代,移远通信着力打造“七大产品技术生态”

汽车市场和消费者的需求正在发生日新月异的变化。以往中国新能源汽车的推广,大多倚重政策补贴,而如今新能源汽车已经走过了这个阶段,开始变成消费者自愿选择。除了汽车的电动化,“智能化”是不少车型拨动消费者心弦的另一主要因素…

光学仿真小作品集

光学仿真小作品集 传播方向与 z 轴平行的二维平面波自由空间中的传输传播方向与 z 轴有一定夹角的二维平面波自由空间中的传输 本文将展示一些作者本人平时自制的光学仿真小作品。 传播方向与 z 轴平行的二维平面波自由空间中的传输 传播方向与 z 轴有一定夹角的二维平面波自由…

(九)【软件设计师】计算机系统-浮点数习题

文章目录 一、2009年下半年第3、4题二、2011年上半年第5题三、2012年下半年第3题四、2015年上半年第1题五、2015年下半年第3题六、2016年下半年第3题七、2018年上半年第1题八、2020年下半年第3题 知识点回顾 (八)【软件设计师】计算机系统—浮点数 一、…

怎么使用AS推送项目到Github上,一文解决!

废话不多说,直接发车了!在android studio上推送项目到GitHub上有个基本可以解决所有推送失败问题的步骤,如下图: 路径:File —— Setting —— Version Control —— GitHub —— 加号,添加用户 上述步骤是…

河道船舶识别检测系统 python

河道船舶识别检测系统通过ppythonYOLOv5网络模型算法技术,河道船舶识别检测系统对画面中的船只进行7*24小时实时监测,若发现存在进行违规采砂或者捕鱼立即自动抓拍触发告警。与C / C等语言相比,Python速度较慢。也就是说,Python可…

mui.ajax

mui.ajax(http:xxxxxxxxxx/login,//请求的地址{data:{},//传给服务器的数据,一般在post请求中dataType:json,//服务器返回数据的格式;type:post,//HTTP请求类型;目前仅支持post/gettimeout:5000,//设置超时时间async:true,//是否异步&#xf…

应急照明和疏散指示系统在化工厂房中的设计与产品选型

【摘 要】《消防应急照明和疏散指示系统技术标准》(GB 51309-2018)的颁布,使应急照明和疏散指示的设计理念及设计方案发生了颠覆性的改变。化工企业在进行系统设计时也有其自身的特点及问题,现根据实际案例,解析化工企业应急照明和疏散指示系…

echrts 工程项目可视化

Echarts 常用各类图表模板配置 注意: 这里主要就是基于各类图表,更多的使用 Echarts 的各类配置项; 以下代码都可以复制到 Echarts 官网,直接预览; 图标模板目录 Echarts 常用各类图表模板配置一、工程项目可视化二、…

记录-new Date() 我忍你很久了!

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 大家平时在开发的时候有没被new Date()折磨过?就是它的诸多怪异的设定让你每每用的时候,都可能不小心踩坑。造成程序意外出错,却一下子找不到问题出处,那…

受安全威胁困扰的时代的可见性和人工智能

安全漏洞和事件以惊人的规律性发生,媒体报道的大人物,只是发生的实际数量的一小部分。 就在上周,横跨澳大利亚和新西兰的主要金融服务提供商 Latitude Financial 公布了影响其 1400 万客户的网络攻击和数据泄露的详细信息。 如果我们要确保…