Paxos算法讲解

Paxos算法解决的问题是在一个消息可能会发生延迟、丢失、重复的分布式系统中 如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏值的一致性。

基于一大堆完全不可靠的网络条件下,可靠确定地实现共识一致性的算法

       Paxos算法是这样解决这个问题:
       1、每个人都可以提出建议、同意建议、接受建议
       2、少数服从多数。只要建议被多数人同意即可确定该建议。
       于是确定以下讨论方式:
       1、只有被提出来的建议才能被大家同意。
       2、最终只能确定一个建议
       3、如果某个人认为大家同意了某个建议,那么这个建议必须真的是被大家同意的

 

P1:每一个人必须同意他收到的第一个建议

P2:一个提议必须被大多数人同意才能生效

一个人可以同时同意多个建议(可能会出现拜占庭将军问题导致结果不一致)(拜占庭:存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的,因为Paxos必须假定信道是可靠的,即消息不会被篡改。消息丢失是允许的)

P3:一个人一旦同意了某个建议,那么之后同意的建议内容信息必须一致。

必须为提议分配一个编号,在提议之间建立一个全序关系

 

Paxos完成一次写操作需要两次来回,分别是prepare/promise, 和 propose/accept:

第一次由提交者Leader向所有其他服务器发出prepare消息请求准备,所有服务器中大多数如果回复诺言承诺就表示准备好了,可以接受写入;第二次提交者向所有服务器发出正式建议propose,所有服务器中大多数如果回复已经接收就表示成功了。

 

Paxos读操作

客户端请求读取所有进程中存储的当前值,如果客户端获得大多数节点返回的相同的值,它就算读取成功了,将保存这个读结果

在现实中使用Paxos实现时,其实不需要每个节点都进行一次读取,会有更好的读取方式,但是他们都是拓展的原始 Paxos 算法。

 

 

Paxos写操作(Paxos精华)

Paxos管理的系统中一个客户端要求写入一个新值时,Paxos能保证客户端发送写请求到Paxos集群中任何成员。注意这里是任何成员,意味着没有任何单点风险,Paxos系统能够一直保持在线可用(有节点宕机或掉线不发给它就是了)(如果我们像二阶段或三阶段提交那样设置一个协调者,那么免不了会有单点故障的风险,Paxos使用多客户端共同管理的方式解决了三阶段提交中,协调者在doCommit阶段发送rebort,由于网络导致没能到达参与者,而参与者自动执行commit导致数据不一致的问题,具体详细在下面描述)

当客户端的写请求被Paxos系统接收后,Paxos进程会将这个写的新值放到系统中的请求“建议”。

这个准备消息保存在被建议的值数据中,也称为序列号,序列号是由建议进程产生的,它表明新旧建议之间的区别。此时建议进程将产生一个seq

 

Paxos第一阶段:准备prepare/承诺promise

准备阶段就是将建议值发送到各个目标节点。

当建议被发到目标节点后,进程会会检查建议中的序列号,是否是它们见到过的最新,如果是最新,它们会发出一个promise不再接受比这个新序列号更旧的建议了,这个诺言promise作为消息从许下诺言的进程发到提交建议新值的进程服务器,这个诺言消息给提交建议的进程后,提交建议的进程需要自己统计一下有多少其他进程已经发回它们的诺言promise了,如果数量过半,那么这个提交建议的进程就能知道它获得了发言权(因为有大多数支持),进入第二阶段,否则表示失败,即客户端要求的写操作失败

第二阶段:Paxos接纳Acceptance,propose/accept

一旦建议提交者已经从大多数其他进程服务器获得了诺言,它会要求许诺的进程服务器接收它们之前承诺接受的新值数据,这是一个“确认commit”阶段,如果没有冲突建议 失败或分区错误,那么这个新建议将被所有其他节点接受,那么Paxos过程就完成了。

 

案例解释:有三个客户端向Paxos系统发出写操作

假设:只有User1、User2、User3 三个人决定1+1等于几!

  1. 准备阶段

 1、User1  提案编号为1 并发送给User2和User3。

因User2 和User3 根据P2c它们并没有接受过小于编号为1的提案。所以它们可以接受该提议,并反馈给User1 不再接受小于编号1的提案。这时User1收到多数人的回复,将进入第2阶段。(如果收到的回复并不能形成多数人,那么将再次进入阶段1)

 

 2、User2 提案编号为2  ;并发送给User1和User3。
      因User1第一次收到提案,并且根据P2C它并没有同意过小于编号为2的提议,所以它可以接受该提议。User3由于接受过User1编号为1的提案,但User2的提案编号2>1所以User3也可以同意User2的提议,并反馈不再接受小于2的提议。User2也收到多数人的回复,将进行第2阶段。

 

  1. User3提案编号为3 ;并发送给user1 和user2 .

因user1收到user3编号为3的提案>user2编号为2的提案,所以接受user3的提案。

因user2收到User3编号为3的提案>user1 编号为1的提案,所以接受user3的提案。

至此user3也收到多数人回复,将进行第2阶段。

 

第二阶段:propose/accept

 1、user1 发送编号为1的提议,提议内容为:1+1=1;并发送给user2和User3 。
      由于user2已经声明不再接受小于3的提案,所以拒绝user1的提案。
      由于User3已经声明不再接受小于2的提案,所以同样拒绝User1的提案。
      User1提议被多数人拒绝,再次进入阶段1.

2、user2 发送编号为2的提议,提议内容为:1+1=2;并发送给User1和User3

由于User1已经声明不再接受小于3的提案,所以拒绝user2的提议。
      由于User3已经声明不再接受小于2的提案,该提案编号=2所以user3同意User2的提议。
      但User2并没有获得多数人的同意,所以同样进行阶段1.

  1. User3 发送编号为3的提议,提议内容为:1+1=3;并发送给User1和User2;

由于user1声明不再接受小于3的提案,所以同意User3的提议。
 由于 user2声明不再接受小于3的提案,所以同意User3的提议。
 至此最终User3可以获得多数人的同意。

 

 

参考链接:

https://www.cnblogs.com/esingchan/p/3917718.html

http://blog.51cto.com/12615191/2086264

 

<think>好的,用户现在问的是Paxos算法的前提条件。之前他让我详细讲解Paxos,我用了班级选举的例子,现在他可能想更深入地了解这个算法运行的基础条件。 首先,我需要回顾一下之前的对话,确保这次回答不重复但补充之前的内容。用户在学习ZooKeeper,所以可能关注分布式系统中的共识问题,以及为什么Paxos适合这样的环境。 接下来,Paxos的前提条件有几个关键点。我需要把这些点列出来,并且用简单易懂的语言解释,避免技术术语太多。比如,网络不可靠、节点故障、过半机制、异步模型等。 用户可能需要这些前提条件来理解为什么Paxos这样设计,或者在自己的项目中考虑是否适用。比如,他们是否满足过半数的节点可用,或者网络延迟是否可接受。 要注意的是,用户可能混淆了Paxos和ZAB协议,所以需要明确这些前提是否同样适用于ZooKeeper的情况。比如,ZooKeeper的ZAB协议在Paxos基础上做了优化,但前提条件可能类似。 需要检查是否有遗漏的前提条件,比如没有拜占庭故障,节点是良性的,这些也需要提到。同时,强调这些前提的重要性,比如为什么需要过半机制来防止脑裂。 最后,确保结构清晰,分点列出,每个点都有例子或解释,帮助用户理解这些前提在实际中的作用。可能还需要联系之前的班级选举例子,说明前提条件如何对应到那个场景中,加强记忆点。</think>Paxos 算法要能正确运行,必须建立在以下 6 个核心前提条件之上(用日常场景类比解释): --- ### 1️⃣ **半数学派原则(多数派原则)** - **核心**:任何决策必须获得过半节点(N/2+1)的同意 - **类比**:就像公司重大决策需要超过半数股东同意才能生效 - **作用**:防止网络分区时出现"双主"(脑裂),确保系统最终只有一个合法结果 --- ### 2️⃣ **消息可能丢失但不会篡改** - **核心**:允许网络丢包、延迟,但消息内容不会被恶意篡改 - **类比**:快递可能丢失,但收到的包裹不会被调包 - **隐含**:假设没有拜占庭故障(节点不会故意作恶) --- ### 3️⃣ **节点可能宕机但不会作恶** - **核心**:节点可能临时离线或永久故障,但不会故意发送错误信息 - **类比**:投票时选民可能缺席,但不会伪造选票 - **影响**:算法只需处理"不作为"故障,无需防御主动攻击 --- ### 4️⃣ **提案编号全局唯一递增** - **核心**:每个提案必须有唯一且递增的编号(类似时间戳+节点ID) - **类比**:班级选举时每次竞选口号要比前一次更响亮(比如举的牌子数字更大) - **作用**:通过编号大小判断提案的旧关系 --- ### 5️⃣ **异步网络模型** - **核心**:不依赖网络传输的时间保证(没有全局时钟) - **类比**:跨国团队协作,不要求所有人同时在线 - **特点**:允许消息无限延迟,只要最终能到达 --- ### 6️⃣ **节点存储持久化** - **核心**:节点必须能持久化存储已接受的提案 - **类比**:选民投票后要把结果写在不会消失的黑板上,而不是便签纸上 - **意义**:保证宕机恢复后仍能维持一致性 --- ### 🌰 **现实场景验证前提** 假设用 Paxos 实现分布式锁服务: 1. 5 个节点中至少 3 个在线(满足过半原则) 2. 节点可能响应慢,但不会伪造锁状态(满足不作恶假设) 3. 每个锁请求都有唯一递增的序列号(提案编号) 4. 节点重启后能读取之前的锁授予记录(持久化存储) --- ### ⚠️ **特别注意的限制** - 不保证实时性(达成共识的时间不确定) - 不处理恶意节点攻击(需要结合其他机制) - 不要求所有节点始终在线(允许部分故障) 这些前提条件构成了 Paxos 的"安全边界",也是理解 ZooKeeper 的 ZAB 协议的基础——ZAB 在 Paxos 基础上增加了: ① 强制顺序提交 ② Leader 主导写入 ③ 崩溃恢复快速追踪最状态 等优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值