分布式下的一致性协议介绍 2pc 3pc paxos zab

2023-11-04

2PC

翻译过来叫两阶段提交算法,它本身是一致强一致性算法,所以很适合用作数据库的分布式事务。其实数据库的经常用到的TCC本身就是一种2PC.

       首先第一阶段叫准备节点,事务管理器把事务的请求都发送给一个个的资源,这里的资源可以是数据库,也可以是其他支持事务的框架,他们会分别执行自己的事务,但是不提交!!!

        二阶段当事务管理器收到了所以资源的反馈,事务都执行没报错后,事务管理器再发送commit指令让资源把事务提交,一旦发现任何一个资源在准备阶段没有执行成功这个发现是指,一阶段的每个资源的反馈是否全部都执行了(比如写操作每个资源即每台机器是否都更新了)!!!),事务管理器会发送rollback,让所有的资源都回滚。这就是2pc,非常非常简单。

优点:原理简单,实现方便

缺点:1 同步阻塞  (在二阶段提交的过程中,所有的节点都在等待其他节点的响应给事务管理器反馈完在进行下一步操作,所以在未反馈完大家无法进行其他操作),

           2单点问题(事务管理器挂了),

        3数据不一致(发了commit  命令后因为网络原因只有部门资源接收到),

        4容错性不好(众多的资源中有一个节点失败就整个事务失败,这真是强一致性啊)

 

3pc 

一阶段:确认所有的资源是否都是健康、在线的,(为了排除一些早就已经挂掉或者宕机无法响应的资源,如果大家都健康在线在执行二阶段,因为二阶段是要干活的,这样如果人都不齐就别干了,减少了当有不在线的资源时,其他资源又要去执行二阶段的事务)【这仅仅解决了2pc 同步阻塞缺点的一种情形,比如比如大家的确都健康,但是不巧的是在二阶段时某个资源在返回由于网络原因,它就是返不回给事务管理器,这还是在阻塞啊

二阶段:如果所有服务都ok,可以接收事务请求 这与2pc 的一阶段一模一样。

三阶段:与2pc 相同的是 所有资源都反馈操作成功,并且只差提交了,则发commit的指令让大家提交,但是不同的是,如果这时事务管理器挂了,不能发出commit指令时,所有的资源也会默认提交,这主要是解决了2pc 单点问题(但是有没有觉得数据一致性更差了,因为如果事务管理器仅仅是网络原因发布出去,而它本来是想发 rollback的,结果大家都默认了commit!!

 

但回顾整个过程,不管是2pc,还是3pc,同步阻塞,单点故障,容错机制不完善这些问题都没本质上得到解决

 

Paxos算法

paxos算法也分成两阶段。首先这个图有2个角色,提议者与接收者

一阶段:提议者首先提一个协议编号 例如是001,接收者的数量相当于总数量的一般以上则进行第二阶段(这注意这里不在需要所有人都同意了,)【注意这里如果小于一半,则重新发起一个协议编号,并且编号是递增的例如002,然后又被拒接003】[注意:这里的协议编号,本质是确保节点的参与程度,或者说健康度]

二阶段:大家再次投票这个协议的内容,大家是否赞同然后投票还是少数服从多数的投票。【这里大家也可以小于一半,但就要从一阶段从新来过。】【这里的协议内容:本质是说具体的业务,例如对所有参与者发问,我想更新xx的数据,或者删除xx的数据,或者我想干什么什么事,大家来投票行不行,投票过半就是行

协议要求:如果接收者没有收到过提案编号,他必须接受第一个提案编号

          如果接收者没有收到过其他协议,他必须接受第一个协议。

注意:提议者不仅仅只有一个,当有多个,比如两个提议者他们都要问接受者同意吗,在接阶段他们都可以进行,比如两个协议编号大家都通过,但是到了二阶段真正要完成时,议题是先入为主的,谁先占了先机后面的proposer在第一阶段就会学习到这个议题而修改自己本身的议题,即其他议题会修改去符合,先入主的议题。

zab 协议

       zab协议核心是在整个zookeeper集群中只有一个节点既leader将所有客户端的写操作转化为事务(提议proposal.leader节点再数据写完之后,将向所有的follower节点发送数据广播请求(数据复制),等所有的follower节点的反馈,在zab协议中,只要超过半数follower节点反馈ok,leader节点会向所有follower服务器发送commit消息,既将leader节点上的数据同步到follower节点之上。

注意这里的ack 与2pc 的一阶段每个资源完成操作成功后的一个ok 肯定的答复。

【自我总结:一阶段:我(leader即事务管理器)有写操作请求事务,大家都来复制下,并得到了一半以上人的反馈我已经复制完了。二阶段:都给我提交】

Zab再细看可以分成两部分。

第一的消息广播模式,第二是崩溃恢复模式。

zookeeper中消息广播的具体步骤如下:

第一的消息广播模式

1. 客户端发起一个写操作请求

2. Leader服务器将客户端的request请求转化为事物proposql提案同时为每个proposal分配一个全局唯一的ID,即ZXID

3. leader服务器与每个follower之间都有一个队列,leader将消息发送到该队列

4. follower机器从队列中取出消息处理完(写入本地事物日志中)毕后,向leader服务器发送ACK确认。

5. leader服务器收到半数以上的follower的ACK后,即认为可以发送commit

6. leader向所有的follower服务器发送commit消息。

为了进一步防止阻塞,leader服务器与每个follower之间都有一个单独的队列进行收发消息,使用队列消息可以做到异步解耦。leaderfollower之间只要往队列中发送了消息即可。如果使用同步方式容易引起阻塞。性能上要下降很多

二是崩溃恢复模式。

ZAB协议崩溃恢复要求满足如下2个要求: 
确保已经被leader提交的proposal必须最终被所有的follower服务器提交。 
确保丢弃已经被leader出的但是没有被提交的proposal

 

新选举出来的leader不能包含未提交的proposal即新选举的leader必须都是已经提交了的proposal的follower服务器节点。同时,新选举的leader节点中含有最高的ZXID。这样做的好处就是可以避免了leader服务器检查proposal的提交和丢弃工作。

 

  1. 每个Server会发出一个投票,第一次都是投自己。投票信息:(myid,ZXID)
  2. 收集来自各个服务器的投票
  3. 处理投票并重新投票,处理逻辑:优先比较ZXID,然后比较myid
  4. 统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定leader
  5. 改变服务器状态

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式下的一致性协议介绍 2pc 3pc paxos zab 的相关文章

  • ZooKeeper的学习与应用

    转载 http blog csdn net rengq126 article details 7393227 最近大概学习了一下ZooKeeper 本身并没有深入 LGG尝试着在虚拟机里面搭了平台 看了看一些教材 从网上到处看别人的博文并引
  • 【Dubbo】Dubbo(二)简单实践

    Dubbo 二 实践 安装注册中心 下载zookeeper 在zookeeper路径下新增date文件夹存储数据 conf路径下新增zoo cfg 编辑zoo cfg 修改数据目录dataDir为新增的data文件夹 其他与zoo samp
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • Zookeeper报错Will not attempt to authenticate using SASL解决办法

    Will not attempt to authenticate using SASL unknown error 经过查资料 这个问题与zookeeper里面的zoo cfg配置有关 在程序填写的zookeper的路径 一定与zoo cf
  • zookeeper入门到精通03——zookeeper集群搭建

    zookeeper集群搭建 3 1 多虚拟机环境搭建 3 2 zookeeper集群搭建 3 1 多虚拟机环境搭建 我们需要搭建zookeeper集群 而由于zookeeper的的服务器数量需要设置为单数 前文介绍了原因 一个zookeep
  • ZooKeeper(八)伸缩性

    一 ZooKeeper中Observer 1 1 ZooKeeper角色 经过前面的介绍 我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower Leader可以接受client 请求 也接收其他Serve
  • 服务 zookeeper 不支持 chkconfig

    在给zk设置开机启动的时候 报错 服务 zookeeper 不支持 chkconfig 因为配置文件是从别人的博客了拷贝的 只是改了个性化的部分 然后就粘贴到服务器上了 服务器上使用service能正常执行start stop status
  • Zookeeper缩容5缩3操作记录(二)

    测试目标 测试5台缩3台zk 先shutdown 一台5 再将1 2 3配置修改为1 2 3 逐一重启 是否会发生脑裂 测试过程 准备1 2 3 4 5 五台 3为leader 将5 shutdown 1 将1配置修改为1 2 3 重启 结
  • 【zookeeper】raft 共识算法 动画演示 网站

    1 概述 地址 https cyberdak github io thesecretlivesofdatacn raft
  • docker中的zookeeper安装、连接及常见命令

    一 docker安装 1 搜索一下Zookeeper镜像 这一步可以省略 docker search zookeeper 2 从Docker上下载zookeeper docker pull zookeeper 3 启动Zookeeper镜像
  • zookeeper学习网址

    1 分布式服务框架 ZooKeeper 管理分布式环境中的数据 http www ibm com developerworks cn opensource os cn ZooKeeper 2 ZooKeeper系列讲座 很全面 http w
  • Docker搭建zookeeper

    问题背景 前言 本文参考自 docker compose快速搭建Zookeeper集群 熬到凌晨三点多验证部署成功 网上有很多文章已经无法正确部署了 因为有些东西版本升级了 版本跟不上就会报错 还有一种更加详细更加全面的部署方式 Docke
  • Zookeeper和Nacos的区别

    Zookeeper和Nacos的区别 在分布式系统中 注册中心充当着重要角色 是服务发现 客户端负载均衡中不可缺少的一员 注册中心除了能够实现基本的功能外 他的稳定性 可用性和健壮性对整个分布式系统的流畅运行影响重大 zookeeper和n
  • Zookeeper之ZAB协议

    1 概念 Zookeeper使用 种称为Zookeeper Atomic Broadcast ZAB Zookeeper原 消息 播协议 的协议作为其数据 致性的核 算法 ZAB协议并不像Paxos算法那样 是 种通 的分布式 致性算法 它
  • Spring-boot+Dubbo(直连模式)

    Spring boot Dubbo 直连模式 Demo 这里应该有很多人会问 直连模式 什么鬼啊 一般情况下我们进行微服务开发时 都是通过zookeeper等注册中心来实现服务的提供和引用的 那直连模式没啥用啊 其实不然 直连模式大有用处
  • 分布式锁解决方案_Zookeeper分布式锁原理

    通过召zk实现分布式锁可靠性时最高的 公平锁和可重入锁的原理 取水秩序 1 取水之前 先取号 2 号排在前面的 就可以先取水 3 先到的排在前面 那些后到的 一个一个挨着 在井边排成一队 公平锁 这种排队取水模型 就是一种锁的模型 什么是可
  • zookeeper 搭建教程(完整版)

    zookeeper 搭建教程 完整版 1 解压zookeeper文件 root master tar zxvf opt software apache zookeeper 3 5 7 bin tar gz C opt module 修改文件
  • Zookeeper(三)—分布式锁实现

    一 独占锁原理 独占锁是利用zk同一目录下不能创建多个相同名称的节点这个特性 来实现分布式锁的功能 竞争锁的分布式系统 都在zk根目录下创建一个名为lock的节点 创建节点成功的系统 说明抢到了这把锁 没有创建成功的系统 说明这个节点已经被
  • SpringCloud使用Zookeeper作为服务注册发现中心

    本篇文章主要记录SpringCloud使用Zookeeper作为服务注册发现中心 通过服务提供者和消费者为例 来真正掌握zk注册中心 目录 一 搭建服务提供者 1 创建cloud provider payment8004项目 2 修改配置
  • 终于找到了最新版的Zookeeper入门级教程,建议收藏!

    小熊学Java https javaxiaobear cn 1 分布式一致性 1 CAP 理论 CAP 理论指出对于一个分布式计算系统来说 不可能同时满足以下三点 一致性 在分布式环境中 一致性是指数据在多个副本之间是否能够保持一致的特性

随机推荐

  • 用汇编语言实现从键盘输入一个字符,输出其对应的ASCII码

    Hello 大家好呀 这是本人的第一篇博客 这学期正好在学汇编语言 上周老师布置了一个作业 用汇编语言实现从键盘输入一个字符 输出其对应的ASCII码 说实话 这个问题最开始的时候令我不知从何下手 明明用c语言只需要几行代码 用汇编来实现却
  • GB 9706.1-2020和GB9706.1-2007对照表

    GB 9706 1 2020和GB9706 1 2007对照表 目录 GB 9706 1 2020和GB9706 1 2007对照表 新版GB 9706 1 2020标准基本情况及主要变化 pptx 原创力文档 关于发布GB 9706 1新
  • 自用工具 猴子都会用的UNITY文件浏览器(浏览文件夹)

    获取插件 效果图 支持按名称排序 按类别排序 关键词搜索 提供的接口 Vector3 最后UI位置 方便定做滑动菜单定位首尾 Bool 是否开启类别排序 可以重写该布尔值来达成切换排序方式的功能 Bool 刷新 调用这个布尔值可以刷新本插件
  • SOC基本知识

    1 什么是soc SOC称为系统级芯片 也称片上芯片 是一个专有目标的集成电路的产品 其中包括完整系统并有嵌入软件的全部内容 目前SOC更多的集成处理器 包括CPU GPU DSP 存储器 基带 各种接口控制模块 各种互联总线等 其典型代表
  • 解决问题记录7:kettle9.1在mysql中生成资源库问题

    使用kettle9 1在mysql生成资源库时 遇到了个问题 问题产生及解决步骤如下 1 kettle主页右上角没有 connect 下拉选项 解决方式一 删除下图路径下的repositories文件 然后重启kettle就可以了 解决方式
  • vue自定义指令 - v-load

    vue自定义指令 v load 前言 原理 实现方法 一 注册指令 二 实现指令逻辑 三 页面效果 前言 懒加载是一种网页性能优化的方式 它能极大的提升用户体验 图片一直是影响网页性能的主要元凶 现在一张图片超过几兆已经是很经常的事了 如果
  • EPOLLRDHUP事件是干啥的???

    EPOLLRDHUP是从Linux内核2 6 17开始由GNU引入的事件 当socket接收到对方关闭连接时的请求之后触发 有可能是TCP连接被对方关闭 也有可能是对方关闭了写操作 如果不使用EPOLLRDHUP事件 我们也可以单纯的使用E
  • 通讯协议1

    协议 就是约定 就好比我们现在说的是普通话 网络通信协议 速率 传输码率 代码传输结构 传输控制等 大事化小 分层的概念 TCP IP 协议簇 实际上是一组协议 重要 TCP 用户传输协议 UDP 用户数据报协议 出名的协议 TCP IP
  • Burp+sqlmap测试SQL注入

    免责声明 此文章仅用于学习研究使用 请勿用于违法犯罪 请遵守 网络安全法 等相关法律法规 Burp sqlmap测试SQL注入 本文主要讲述Burp和sqlmap工具联动测试SQL注入 环境准备 具有python环境 系统中有sqlmap
  • 如何申请安卓证书,申请安卓证书的流程是什么?

    用HBuilderX打包安卓正式app时 我们需要使用自有证书 安卓证书是免费申请的 虽然HBuilderX有申请教程 为了自己后期使用方便 今天给大家分享下详细的申请教程 HBuilderX的文档 https ask dcloud net
  • iphone固件降级_iphone 6s如何降级ios10.3.3【降级方法】

    iphone6s如何降级ios10 3 3 相信小伙伴们一定很好奇 下面小编为大家带来了iphone6s的ios10 3 3降级方法介绍 感兴趣的小伙伴赶紧跟着小编一起来看看吧 陆续有用户报告称苹果关闭了iPhone 6s的iOS 10 3
  • Quartus安装Altera USB-Blaster安装驱动程序出现问题(代码39)的解决办法

    在Windows11的平台下 Quartus安装Altera USB Blaster驱动时会出现问题 有如下提示 Windows在安装设备的驱动程序时遇到问题 Windows已找到设备的驱动程序 但在尝试安装它们时遇到错误 Windows无
  • yolov5代码--注释

    yolov5目录结构 yolov5 detect py代码详解 https blog csdn net CharmsLUO article details 123422822 spm 1001 2014 3001 5506 yolov5 t
  • c语言n的阶乘

    n的阶乘定义就是如同这样的 1 2 3 4 n 从一开始 到你需要的那个数字 思路如下 1 可选择有递归或者非递归的方法进行完成 2 理情思路 思考如何进行累 3 非递归代码如下 int main int n 0 scanf d n int
  • 哈希函数(散列函数)详解

    哈希函数 散列函数 详解 Hash 一般翻译做 散列 也有直接音译为 哈希 的 就是把任意长度的输入 又叫做预映射 pre image 通过散列算法 变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远
  • 没wifi没网也能用App!10分钟干洗机来了……硅谷初创公司在做啥?

    硅谷Live 实地探访 热点探秘 深度探讨 最近小探跟身边创业的朋友们聊天 大家都纷纷表示现在创业太 南 了 巨头们各占鳌头睥睨市场 对于新点子行动力迅速且 有钱有闲 不怕失败 谷歌创新坟场里项目堆积如山 Facebook 亚马逊等大公司业
  • Zabbix 监控httpd

    两台 虚拟机 一台服务端 一台客户端都要下载zabbix源 两台虚拟机都要下载 rpm Uvh https repo zabbix com zabbix 5 0 rhel 7 x86 64 zabbix release 5 0 1 el7
  • Dubbo微服务调用时公共参数的传递

    在业务开发中 有时会将一些通用参数放在Header中进行传递 后端可以通过http的getHeader 方法来获取所需的公共参数 但当该A服务调用RPC接口请求B服务时 http请求中的Header并不会随RPC请求带入到B服务中 这时可以
  • 汉明窗口Hamming Window

    1 汉明窗口 Hamming Window 汉明窗口 Hamming Window 是一种常用的数字信号处理技术 它在测高卫星中被用于处理合成孔径雷达 Synthetic Aperture Radar SAR 信号 在合成孔径雷达中 为了提
  • 分布式下的一致性协议介绍 2pc 3pc paxos zab

    2PC 翻译过来叫两阶段提交算法 它本身是一致强一致性算法 所以很适合用作数据库的分布式事务 其实数据库的经常用到的TCC本身就是一种2PC 首先第一阶段叫准备节点 事务管理器把事务的请求都发送给一个个的资源 这里的资源可以是数据库 也可以