首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Paxos协议学习小结

Paxos协议学习小结

作者头像
用户1263954
发布于 2018-01-30 03:39:48
发布于 2018-01-30 03:39:48
1.2K0
举报
文章被收录于专栏:IT技术精选文摘IT技术精选文摘

一直对Paxos协议比较感兴趣,之前对这个算法 有耳闻 但只是了解皮毛,最近在学Zookeeper,趁着这股新鲜劲,就花时间研究了下Zookeeper的选举算法实现,再重新学习了Paxos算法,这篇文章算是我的学习总结吧。

Basic Paxos 协议

Paxos 协议是一个解决分布式系统中 多个节点之间就某个值(提案value)达成一致(决议)的通信协议,也就是说,每个节点 提出的提案 会 对 同一个 提案内容 达成一致(知悉 且 要commit成功)。下面简称提案IDProposalID提案内容value

算法(提案的提出与批准)主要分为两个阶段:

第一阶段 Prepare P1a:Proposer 发送 Prepare请求 Proposer 生成全局唯一且递增的ProposalID,向 Paxos 集群的所有机器发送 Prepare请求,这里不携带value,只携带 ProposalID 。

P1b:Acceptor 应答 Prepare Acceptor 收到 Prepare请求 后,判断:收到的ProposalID 是否 比 之前已响应的所有提案的ProposalID 大:

  • 如果是,则: (1) 在本地持久化 ProposalID,可记为Max_ProposalID。 (2) 回复请求,并带上 已Accept的提案中 ProposalID 最大的 value(若此时还没有已Accept的提案,则返回value为空)。 (3) 做出承诺:不会Accept 任何 小于 Max_ProposalID的提案。
  • 如果否:不回复。

第二阶段 Accept P2a:Proposer 发送 Accept 经过一段时间后,Proposer 收集到一些 Prepare 回复,有下列几种情况: (1) 回复数量 > 一半的Acceptor数量,且 所有的回复的 value 都为空,则 Porposer发出accept请求,并带上 自己指定的value。 (2) 回复数量 > 一半的Acceptor数量,且 有的回复 value 不为空,则 Porposer发出accept请求,并带上 回复中 ProposalID最大 的value(作为自己的提案内容)。 (3) 回复数量 <= 一半的Acceptor数量,则 尝试 更新生成更大的 ProposalID,再转 P1a 执行。

P2b:Acceptor 应答 Accept Accpetor 收到 Accpet请求 后,判断: (1) 收到的ProposalID >= Max_ProposalID (一般情况下是 等于),则 回复 提交成功,并 持久化 ProposalID 和value。 (2) 收到的ProposalID < Max_ProposalID,则 不回复 或者 回复 提交失败

P2c: Proposer 统计投票 经过一段时间后,Proposer 收集到一些 Accept 回复提交成功,有几种情况: (1) 回复数量 > 一半的Acceptor数量,则表示 提交value成功。此时,可以发一个广播给所有Proposer、Learner,通知它们 已commit的value。 (2) 回复数量 <= 一半的Acceptor数量,则 尝试 更新生成更大的 ProposalID,再转 P1a 执行。 (3) 收到 一条提交失败的回复,则 尝试 更新生成更大的 ProposalID,再转 P1a 执行。

最后,经过多轮投票后,达到的结果是: (1) 所有Proposer都 提交提案成功了,且提交的value是同一个value。 (2) 过半数的 Acceptor都提交成功了,且提交的是 同一个value。

Paxos 协议 的几个约束:

  • P1: 一个Acceptor必须接受(accept)第一次收到的提案;
  • P2a: 一旦一个具有value v的提案被批准(chosen),那么之后任何Acceptor 再次接受(accept)的提案必须具有value v;
  • P2b: 一旦一个具有value v的提案被批准(chosen),那么以后任何 Proposer 提出的提案必须具有value v;
  • P2c: 如果一个编号为n的提案具有value v,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于n的任何提案,要么他们已经接受(accpet)的所有编号小于n的提案中编号最大的那个提案具有value v;

常见的疑问、及异常处理:

  1. Paxos算法的核心思想是什么? (1) 引入了 多个Acceptor,避免 单个Acceptor成为单点。 Proposer用 更大ProposalID 来抢占 临时的访问权,避免 其中一个 Proposer崩溃宕机 导致 死锁。 (2) 保证一个ProposalID,只有一个Proposer能进行到第二阶段运行,Proposer按照ProposalID递增的顺序依次运行。 (3) 新ProposalID 的 proposer 采用 后者认同前者的思路运行。 容错要求: (1) 半数以内的Acceptor失效、任意数量的Proposer 失效,都能运行。 (2) 一旦value值被确定,即使 半数以内的Acceptor失效,此值也可以被获取,并不再修改。
    • 在肯定 旧ProposalID 还没有生成确定的value (Acceptor 提交成功一个value)时,新ProposalID 会提交自己的value,不会冲突。
    • 一旦 旧ProposalID 生成了确定的value,新ProposalID 肯定可以获取到此值,并且认同此值。
  2. 工程实践中 ProposalID 怎么定? 在《Paxos made simple》中提到,推荐Proposer从不相交的数据集合中进行选择,例如系统有5个Proposer,则可为每一个Proposer分配一个标识j(0~4),则每一个proposer每次提出决议的编号可以为5*i + j(i可以用来表示提出议案的次数)。 在实践过程中,可以用 时间戳 + 提出提案的次数 + 机器 IP/机器ID 来保证唯一性和递增性。
  3. 如何保证 更大的ProposalID的Proposer 不会破坏 已经达成的确定性取值value? 在P2a阶段中,Proposer会以 所有回复中ProposalID最大 的value 作为自己的提案内容。 其中,prepare阶段的目的有两个: 1) 检查是否有被批准的值,如果有,就改用批准的值。2) 如果之前的提案还没有被批准,则阻塞掉他们以便不让他们和我们发生竞争,当然最终由ProposalID 的大小决定。
  4. Paxos协议的活锁问题 新轮次的抢占会使旧轮次停止运行,如果每一轮在第二阶段执行成功之前 都 被 新一轮抢占,则导致活锁。怎么解决? 这个问题在实际应用会发生地比较少,一般可通过 随机改变 ProposalID的增长幅度 或者 增加Proposer发送新一轮提案的间隔 来解决。
  5. Paxos 运行过程中,半数以内的Acceptor失效,都能运行。为什么? (1) 如果 半数以内的Acceptor失效时 还没确定最终的value,此时,所有Proposer会竞争 提案的权限,最终会有一个提案会 成功提交。之后,会有半过数的Acceptor以这个value提交成功。 (2) 如果 半数以内的Acceptor失效时 已确定最终的value,此时,所有Proposer提交前 必须以 最终的value 提交,因为,一个Proposer要拿到过半数的accept响应,必须同一个已提交的Acceptor存在交集,故会在P2a阶段中会继续沿用该value。
  6. 若两个Proposer以不同的ProposalID,在进行到P2a阶段,收到的prepare回复的value值都为空,则两个proposer都以自己的值作为value(提案内容),向Acceptor提交请求,最后,两个proposer都会认为自己提交成功了吗? 不会,因为Acceptor会根据ProposalID,批准执行最大的ProposalID的value,另一个会回复 执行失败。当proposer收到执行失败的回复时,就知道:当前 具有更大的ProposalID的提案提交成功了。
  7. 由于大ProposalID 可以 抢占 小ProposalID 的提交权限,如果 此时 Acceptor还没有一个确定性取值,有一个具有最大ProposalID的proposer进行到P2a阶段了,但这时 这个proposer挂了,会造成一种死锁状态(小ProposalID的会提交失败,但是 具有最大ProposalID的proposer却不能提交accept请求),如何解决这种死锁状态? 不会产生这种死锁状态,acceptor回复提交失败后,proposer再生成 更大的ProposalID,下一轮可以用自己value提交成功。

Zookeeper做的调整及优化:

  1. 刚挂掉的leader 优先 争抢 leadership。 在运行的过程中,如果leader节点崩溃,此时,所有slave节点需要sleep几秒后,才能争抢leadership,而刚挂掉的节点重启后,可以马上争抢leadership。 这么做,是为了解决 leader节点由于负载过重 导致 假死,优先选择 原来的leader节点 可以减少 同步的数据量。
  2. ProposalID以 Zxid + 机器ID 来确定,其中 Zxid表示 本节点 最近Commit的事务ID。 Zookeeper会优化 选择 拥有最新commit记录(Zxid最大)的机器作为leader,如果Zxid相等,则选择机器ID更大的那个。
  3. Zookeeper中的节点兼具Acceptor,Proposer,而且没有明确区分Prepare阶段和Accept阶段。 提案的ProposalID和value,用的同一个结构体Vote,每轮投票直接发Vote,其它节点收到后,如果比自己的提案大,则将 自己的提案ProposalID和value 更新为 收到的Vote的值,且广播向其它节点发送新的提案。 经过多轮投票后,会使 每个节点的提案 趋于最终的那个值。

Multi Paxos 协议

可以看出,一个Basic Paxos Instance运行完,要经过 每个Proposer的prepare阶段、accept阶段,还需要在过半数的节点上commit成功,流程太多,导致性能不高。一般在实践过程中用Multi Paxos协议。

Multi Paxos协议省去了Basic Paxos的prepare阶段,直接由一个leader节点提交提案,并通知其它Follower节点提交提案。在Leader租约内,只有Leader可以提出提案。如果leader节点崩溃宕机、或者租约到期后没有续约,则由 其它Follower 使用 Basix Paxos协议 竞争leadship。

在使用Multi Paxos 协议做多节点的复制时,有一些细节需要注意。详细可以参考这篇文章 和 这篇文章。

解决单点问题的几种思路

最近在项目中遇到一个需求,要解决一个中心节点(下称DC节点)的单点问题,我思考了下,解决方式有三种:

  1. vip + keepalived 布署两台机器(一主一备),这两台用keepalive检测心跳,对外提供vip。每台机器都设置一个crontab脚本,每5分钟检查一下Dc进程在不在,如果不在,则拉起来。 外部用vip访问这个节点。如果一台机器的Dc进程崩溃了,则crontab脚本会拉起来。如果整台机器都挂了,则vip会切换到另一台机器的ip上。
  2. 用Zookeeper选举一个leader来对外服务,当leader节点挂掉后,再选举另一个节点。外部通过Zookeeper来实时 获取Dc的真实ip。 这种方法有个缺点:要布署一个zookeeper集群、且需要zookeeper先运行、其它节点后运行。
  3. 在Dc节点中内置Basic Paxos协议 来实现选举,对外提供接口获取Dc leader节点的ip

参考:

  1. 《Paxos made simple》论文
  2. 图解分布式一致性协议Paxos
  3. 图解zookeeper FastLeader选举算法
  4. 《从Paxos到Zookeeper–分布式一致性原理与实践》 第2、3、4、7.6章节
  5. 一步一步理解Paxos算法 这篇文章讲得很浅显易懂,我就是通过这篇文章开悟的!
  6. [Paxos三部曲之一] 使用Basic-Paxos协议的日志同步与恢复 讲解应用Basic-Paxos解决 多节点 复制日志的一致性问题。
  7. [Paxos三部曲之二] 使用Multi-Paxos协议的日志同步与恢复
  8. 架构师需要了解的Paxos原理、历程及实战
  9. 视频 paxos和分布式系统 百度的高级工程师对Paxos协议的解决,很不错!
  10. Paxos在大型系统中常见的应用场景
  11. 多IDC的数据分布设计(一)
  12. 多IDC的数据分布设计(二)

出处:https://baozh.github.io/2016-03/paxos-learning/

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术精选文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
分布式最强算法之Paxos透析
上一篇:《分布式数据一致性模型有哪些?》 提到了Base理论提到了一个重要的点就是「最终一致性」 有什么方式能实现这种一致性呢?
斯文的程序
2020/04/24
1.6K0
分布式最强算法之Paxos透析
一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析
在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)等情况。
王知无-import_bigdata
2020/12/18
3.7K0
一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析
paxos如此简单?
Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其他算法都是残次品。
lainzhang
2022/08/24
7970
Zookeeper基础篇---面试Paxos算法
Paxos算法是一种基于消息传递的具有高容错性的一致性算法,Paxos算法是一种公认的晦涩难懂的算法,并且实现它有很大难度。比较有名的工程是实现有Google Chubby,ZAB,微信的PhxPaxos等。
小土豆Yuki
2020/06/15
8680
Paxos和Raft的前世今生
前言 在保证数据安全的基础上,保持服务的持续可用,是核心业务对底层数据存储系统的基本要求。业界常见的1主N备的方案面临的问题是“最大可用(Maximum Availability)”和“最大保护(Maximum Protection)”模式间的艰难抉择: “最大可用”模式,表示主机尽力将数据同步到备机之后才返回成功,如果备机宕机或网络中断那么主机则单独提供服务,这意味着主备都宕机情况下可能的数据丢失(MySQL的半同步模式); “最大保护”模式,表示主机一定要将数据同步到备机后才能返回成功,
腾讯技术工程官方号
2018/10/09
15.3K0
Paxos和Raft的前世今生
zk基础—1.一致性原理和算法
既然是分布式系统,最显著的特点肯定就是分布性。比如电商项目会分成不同的功能,或者不同的微服务。这些服务部署在不同的服务器中,甚至不同的集群中。整个架构都是分布在不同的地方的,在空间上是随意的,而且随时会增加、删除服务器节点。
东阳马生架构
2025/06/23
870
图解分布式一致性协议 Paxos 算法【BAT 面试题宝库附详尽答案解析】
https://en.wikipedia.org/wiki/Paxos_(computer_science)
一个会写诗的程序员
2019/12/20
1.5K0
图解分布式一致性协议 Paxos 算法【BAT 面试题宝库附详尽答案解析】
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
该系列博文会告诉你什么是分布式系统,这对后端工程师来说是很重要的一门学问,我们会逐步了解常见的分布式技术、以及一些较为常见的分布式系统概念,同时也需要进一步了解zookeeper、分布式事务、分布式锁、负载均衡等技术,以便让你更完整地了解分布式技术的具体实战方法,为真正应用分布式技术做好准备。
Java技术江湖
2019/12/02
7290
Zookeeper技术:分布式架构详解、分布式技术详解、分布式事务
特点:App、DB、FileServer分别部署在独立服务器上。并且访问请求量较少
IT大咖说
2019/10/14
7860
Zookeeper技术:分布式架构详解、分布式技术详解、分布式事务
Paxos算法详解
Paxos、Raft分布式一致性算法应用场景一文讲述了分布式一致性问题与分布式一致性算法的典型应用场景。作为分布式一致性代名词的Paxos算法号称是最难理解的算法。本文试图用通俗易懂的语言讲述Paxos算法。
全栈程序员站长
2022/11/18
2K0
Paxos算法详解
Paxos 协议简单介绍
Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Chubby、Megastore 以及 Spanner 等。开源的 ZooKeeper 以及 MySQL 5.7 推出的用来取代传统的主从复制的 MySQL Group Replication 等纷纷采用 Paxos 算法解决分布式一致性问题。
JMCui
2021/04/13
2.9K0
zookeeper学习系列:四、Paxos算法和zookeeper的关系
一、问题起源 淘宝搜索的博客 http://www.searchtb.com/2011/01/zookeeper-research.html  提到Paxos是zookeeper的灵魂 有一篇文章标题更是以“Zookeeper全解析——Paxos作为灵魂” 作为标题,认为是zookeeper的基础: “ Google的Chubby,Apache的Zookeeper都是基于它的理论来实现的,Paxos还被认为是到目前为止唯一的分布式一致性算法,其它的算法都是Paxos的改进或简化。有个问题要提一下,Paxos
架构师刀哥
2018/03/20
1.5K0
分布式共识算法之Paxos图解
对于一个分布式系统来说,保障集群中所有节点的数据完全相同(即一致性)是很重要的,随着多节点的引入,这影响的是整个分布式系统对外服务的表象一致性。也就是说,一个分布式系统想要做到完全的一致性,需要对外表现为顺序一致性,即各个节点上的操作顺序都一致。
Cloudox
2021/11/23
6320
分布式共识算法之Paxos图解
CAP 一致性协议及应用解析
假设系统中有 5 个节点,n1~n5。n1,n2,n3 在A物理机房。n4,n5 在 B 物理机房。现在发生了网络分区,A 机房和 B 机房网络不通。
用户1278550
2019/04/25
7290
CAP 一致性协议及应用解析
【超详细】分布式一致性协议 - Paxos
分布式算法,不得不提paxos。它是目前公认的解决分布式共识问题最有效的算法之一,甚至可以说过去几十年里一切分布式一致性算法都来源于它。
并发笔记
2020/09/22
9.7K0
【超详细】分布式一致性协议 - Paxos
Paxos一致性协议
Paxos问题指分布式系统中存在故障fault,但不存在恶意corrupt节点场景(消息可能丢失但不会造假)下的共识达成(Consensus)问题。
红目香薰
2022/11/29
2190
第一次这么通俗易懂的讲Paxos算法
大家对Paxos的看法基本是“晦涩难懂”,虽然论文和网上文章也很多,但总觉得“云山雾罩”,也不知道其具体原理以及到底能解决什么问题。
chengcheng222e
2021/11/04
4.2K1
一致性协议浅析:从逻辑时钟到Raft
春节在家闲着没事看了几篇论文,把一致性协议的几篇论文都过了一遍。在看这些论文之前,我一直有一些疑惑,比如同样是有Leader和两阶段提交,Zookeeper的ZAB协议和Raft有什么不同,Paxos协议到底要怎样才能用在实际工程中,这些问题我都在这些论文中找到了答案。接下来,我将尝试以自己的语言给大家讲讲这些协议,使大家能够理解这些算法。同时,我自己也有些疑问,我会在我的阐述中提出,也欢迎大家一起讨论。水平有限,文中难免会有一些纰漏门也欢迎大家指出。
王知无-import_bigdata
2019/07/09
1.1K0
一致性协议浅析:从逻辑时钟到Raft
PDFT/Paxos/Raft-分布式一致性协议解析
分布式系统中有个著名的原则CAP原则,C为Consistency(一致性)、A为Availability(可用性)、P为Partition tolerance(分区容错性)。这里主要介绍下分布式环境下如果达到一致性。
王知无-import_bigdata
2020/02/20
6630
Paxos算法学习笔记
本文Paoxs指代的是Basic Paxos。 Paxos是强一致的算法,数据写入后立即可读取,不存在延迟。
sean.liu
2022/09/07
4040
Paxos算法学习笔记
相关推荐
分布式最强算法之Paxos透析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档