如何理解分布式paxos协议
前言
google的chubby的作者Mike Burrows说过,世界上只有一种一致性算法,那就是paxos,由此可见paxos协议的影响力。某司相关部门对paxos有一定的研究,并且已经在生产环境的kv中有实现并运行,同时编写了很多内网文章。最近重读了相关的文章。 本文尝试从笔者在研究过程中比较困惑的地方入手,分析paxos的协议如何理解,以及如何应用到生产环境中。
paxos具体做什么?
paxos本质上是一个共识算法。也就是在一个系统中如何实现就一个值达成共识:在达成共识之前,这个值不存在,在达成共识之后,这个值不可修改。这也就是为什么在《The Part-Time Parliament》经典论文中,以paxos岛国的议会达成统一政令进行举例。因为就某一项政令而言:达成之前,这项政令不存在;达成之后,这项政令不可修改。
可能读者和笔者一样,先入为主的以为paxos是一个实现在多机数据一致的协议。如果从这个角度来理解,肯定疑惑重重。因为我们知道,在多机系统中一个key对应的value是可以改变的,甚至是有可能删除的。
如果paxos只是为了在系统中达成某一项统一值,并且这个值达成之后不能再修改了,那这个paxos对我们来说有什么用呢?毕竟一个key对应的value是有可能变化的。这个就涉及到如何在生产环境中应用paxos了。这个其实在《paxos made simple》中有相关的介绍。我们后续进行分析。
所以本篇文章将从两个部分进行分析
- 如何理解paxos的执行过程。
- 如何将paxos应用到分布式系统中
如何理解paxos的执行过程
这部分没有涉及到我们熟悉的计算机领域相关的知识,因而无法进行迁移学习。所以在理解paxos的过程中,我们始终要明确paxos的目标:在系统中达成一个不可改变的值。那么我们在分析时就可以理解每一步为何要这么设计。
paxos协议中的三种角色
paxos协议中有三种角色,proposers、acceptors、learners。
- proposers,提出提议者;
- acceptors,接受提议者;
- learners,提议确定后,向acceptors学习提议;
为什么要有这三类角色?可以理解我们执行paxos的过程,就是在系统中扩散提议的过程;以议会投票为例,议员提出议题(proposers),大部分议员进行投票(acceptors),投票通过后,向所有公民(learners)同步决议结果。
paxos选举过程
我们这里直接介绍paxos投票过程,不详述设计paxos算法的过程。对paxos算法的设计过程有兴趣的读者可以去参阅《paxos made simple》,对理解paxos的过程有很大帮助。
- 阶段一A:prepare
proposer ——> acceptor,proposer向超过半数(majority)的acceptor发送带有编号n的prepare消息,n必须比该proposer之前发送的prepare消息的编号都要大;系统中不同的proposer生成的编号相互不重复,单个proposer内编号递增;
- 阶段一B:promise
acceptor——>proposer:acceptor返回提议的proposer是否接受prepare消息。《paxos made simple》中解释为,acceptor不会接受编号小于(已经接受的prepare request的编号)的accept请求;
详细分析,则是这两种情况:
- acceptor之前没有收到其他的proposer提交的prepare消息,则返回接受;
- acceptor之前收到其他proposer提交的prepare消息:
- 之前收到的prepare消息编号m小于当前接收的prepare消息,返回接受;
- 之前收到的prepare消息编号m大于当前接受到的prepare消息,忽略或者返回已经接受的prepare请求最大编号;
- 之前已经收到accept消息,则返回accept消息的编号m,同时返回accepted的value值,即<m, value>
返回接受了序号为n的prepare请求,代表着该acceptor承诺不再接受序号小于n的accept请求;
- 阶段二A:accept
proposer——>acceptor,proposer接受到超过半数(majority)的acceptor对prepare的接受返回之后,从返回中选择序号最大的已接受的proposal请求的value值,作为自己提交的value值,否则proposer可以提出自己的value;preposer对超过半数的(majority)的acceptors发送包含编号及value的accept请求。
- 阶段二B:accepted
acceptor——> proposer, accptor在接受到accept请求之后,判断该accept请求的序号n是否小于当前已经接受过的prepare request的序号的最大值,如果小于,则不接受该accept请求(说明有一个序号更大的paxos流程正在进行);反之则不接受该请求;
- 阶段三:learn
对于已经被majority的acceptors接受的提议,则同时learner进行同步;《paxos made simple》中给出的方案是对于acceptor通过的提议,则通知所有learner;learner收到超过半数的acceptor的请求后,则标志这个提议被接受。这是一个非常朴素的方案,为了减少learn过程中的消息数,我们可以设置distinct learn集群,acceptor只发送通过的消息到distinct learn集群。如果
paxos选举过程为什么要这样执行
- 为什么每次的请求都需要超过半数(majority)的acceptors接受?
超过半数接受,意味着不可能同时有两个请求能够在acceptor中得到通过。
- prepare阶段的目的是什么?假设不要prepare怎么样?
如果不要prepare阶段,意味着有可能多个accept操作同时进行,导致没有多数的acceptor接受到统一值,系统达成不了统一。
增加prepare阶段;相当于探测系统是否有已经达成一致的协议。如果有,则保证新提交的value和已经达成一致的value相同。如此则不违反协议达成后,value不再变化的约定。另外,prepare阶段相当于给系统加上写入锁,prepare阶段成功后,其他序号更低的proposer不能写入成功。除非此时另外有一个proposer有一个序号更高的写入请求,此时当前的proposer会写入失败;保证了同一时刻只有一个proposer的accept请求被超过半数(majority)的acceptors接受。
如何在生产环境中应用paxos
《paxos made simple》中给出的一种方案是,将paxos和状态机相结合。
假设分布式环境下每台机器作为一个状态机,起始状态一致。运行过程中的修改操作,作为paxos的value执行一次paxos过程。这样修改操作可以同步到所有机器,之后对状态机执行修改操作。各个机器上的状态机由于初始状态一致,修改操作一致,那么执行后的状态也是一致的。
如何理解分布式paxos协议相关推荐
- 理解这两点,也就理解了paxos协议的精髓
什么是paxos协议? Paxos用于解决分布式系统中一致性问题.分布式一致性算法(Consensus Algorithm)是一个分布式计算领域的基础性问题,其最基本的功能是为了在多个进程之间对某个( ...
- 大数据基础(4) - Paxos协议
文章目录 1. 整体介绍 2. Paxos 协议产生的背景 3. 副本状态机模型 4. 基本概念 5. Paxos 协议过程 5.1 准备阶段(占坑阶段) 5.2 接受阶段(提交阶段) 5.3 Pax ...
- 理解分布式一致性:Paxos协议之Generalized Paxos Byzantine Paxos
理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos Generalized Paxos Byzantine Paxos Byzantine ...
- 理解分布式一致性:Paxos协议之Cheap Paxos Fast Paxos
理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...
- 分布式一致性协议三部曲-深入理解一致性协议Paxos
在理解分析分布式一致性协议前,我们必须先看下CAP理论 CAP CAP是指在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition to ...
- 理解分布式一致性:Paxos协议之Multi-Paxos
理解分布式一致性:Paxos协议之Multi-Paxos Multi-Paxos without failures Multi-Paxos when phase 1 can be skipped Mu ...
- 理解分布式一致性:Paxos协议之Basic Paxos
理解分布式一致性:Paxos协议之Basic Paxos 角色 Proposal Number & Agreed Value Basic Paxos Basic Paxos without f ...
- paxos协议 对比_分布式一致性协议三部曲-深入理解一致性协议Paxos
CAP二阶段提交协议(2PC)协议详情改进缺陷参与者 还都处于锁定事务资源的状态中,而无法继续完成事务操.尽管协调者挂掉后可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问 ...
- 分布式一致性协议paxos
Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就 ...
最新文章
- ClickHouse 学习
- 四款 5G 版 iPhone 12 齐发,支持北斗系统,你准备好了吗?
- redis快照文件dump.rdb解析工具--redis-rdb-tools
- 关于如何提高SQL Server Compact的查询性能
- 牛客网【每日一题】3月27日 数学考试
- 26 MM配置-采购-采购申请-定义编码范围
- ECCV18 | 如何正确使用样本扩充改进目标检测性能(附Github地址)
- 图像识别算法超低代码开发方案
- “强化学习说白了,是建立分布到分布之间的映射”?数学角度谈谈个人观点
- eclipse 环境安装
- RFIC4463_F2C
- 计算机系统结构期末张晨曦,计算机系统结构(张晨曦)试题
- IOS 开发 Cache文件夹缓存的清理封装(包括WebKit缓存/SDImageCache缓存),都提供了相应的接口.
- c语言更正错误,c语言出错invalid operands to binary %
- 主成分分析(PCA)
- office随笔记录—— 批量删除空白行
- 2021执念斩长河年度总结
- TiCDC同步延迟问题处理
- 修改谷歌浏览器ua的简单方法
- aabResGuard使用