您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

深入浅出理解分布式一致性Paxos算法

时间:2022-08-02 14:31:46  来源:  作者:是啊超ya

概述

Paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。本文的目的就是带领大家深入浅出理解Paxos算法,理解它的执行流程,然后通过一个例子来了解Paxos算法在分布式系统中起到的作用。如果有能力的同学可以直接拜读原文。

分布式一致性

分布式系统通常由异步网络连接的多个节点构成,每个节点有独立的计算和存储。通常来说,分布式一致性一般指的式数据的一致性。比如分布式存储系统,通常以多副本冗余的方式实现数据的可靠存储。同一份数据的多个副本必须保证一致,而数据的多个副本又存储在不同的节点中,这里的分布式一致性问题就是存储在不同节点中的数据副本的取值必须一致。

如果不保证一致性,那么就说明这个系统中的数据根本不可信,数据也就没有意义,那么这个系统也就没有任何价值可言。

 

在分布式系统中,各个节点之间需要进行通信来保持数据的一致性,而通信的实现方式有共享内存和消息传递两种模型。基于消息传递通信模型的分布式系统,不可避免的会发生下面的错误:机器宕机,进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复。那么在这种复杂的情况下该如何保证一致性呢?

而Paxos算法就是如何快速正确的在一个分布式系统中对某个数据的值达成一致,并且保证不论发生任何异常,都不会破坏整个系统的一致性。

注: 这里某个数据的值并不只是狭义上的某个数,它可以是一条日志,也可以是一条命令,根据应用场景不同,某个数据的值有不同的含义。

Paxos算法描述

Paxos算法的目标:在分布式环境下确定一个值,这个值被所有节点承认。

角色

Paxos将系统中的角色分为提议者 (Proposer),决策者 (Acceptor),和最终决策学习者 (Learner):

  • Proposer: 提出提案 (Proposal)。Proposal信息包括提案编号 (Proposal ID) 和提议的值 (Value)。
  • Acceptor: 参与决策,回应Proposers的提案。收到Proposal后可以接受提案,若Proposal获得多数

Acceptors的接受,则称该Proposal被批准。

  • Learner: 不参与决策,从Proposers/Acceptors学习最新达成一致的提案(Value)。

在具体的实现中,一个进程可能同时充当多种角色。比如一个进程可能既是Proposer又是Acceptor又是Learner。

算法流程

 

Propser有两个重要属性,提案编号N, 提案V, 简记 Proposer(N, V)。

Acceptor有三个重要属性,响应提案编号ResN, 接受的提案编号AcceptN, 接收的提案AcceptV, 间记Acceptor(ResN, AcceptN, AcceptV)。

第一阶段: Prepare准备阶段

Proposer: Proposer生成全局唯一且递增的提案编号N,,向所有Acceptor发送Prepare请求,这里无需携带提案内容,只携带提案编号即可, 即发送 Proposer(N, null)。

Acceptor: Acceptor收到Prepare请求后,有两种情况:

  1. 如果Acceptor首次接收Prepare请求, 设置ResN=N, 同时响应ok
  2. 如果Acceptor不是首次接收Prepare请求,则:
  • 若请求过来的提案编号N小于等于上次持久化的提案编号ResN,则不响应或者响应error。
  • 若请求过来的提案编号N大于上次持久化的提案编号ResN, 则更新ResN=N,同时给出响应。响应的结果有两种,如果这个Acceptor此前没有接受过提案, 只返回ok。否则如果这个Acceptor此前接收过提案,则返回ok和上次接受的提案编号AcceptN, 接收的提案AcceptV。

第二阶段: Accept接受阶段

Proposer: Proposer收到响应后,有两种情况:

  1. 如果收到了超过半数响应ok, 检查响应中是否有提案,如果有的话,取提案V=响应中最大AcceptN对应的AcceptV,如果没有的话,V则有当前Proposer自己设定。最后发出accept请求,这个请求中携带提案V。
  2. 如果没有收到超过半数响应ok, 则重新生成提案编号N, 重新回到第一阶段,发起Prepare请求。

Acceptor: Acceptor收到accept请求后,分为两种情况:

  1. 如果发送的提案请求N大于此前保存的RespN,接受提案,设置AcceptN = N, AcceptV=V, 并且回复ok。
  2. 如果发送的提案请求N小于等于此前保存的RespN,不接受,不回复或者回复error。

Proposer: Proposer收到ok超过半数,则V被选定,否则重新发起Prepare请求。

第三阶段: Learn学习阶段

Learner: Proposer收到多数Acceptor的Accept后,决议形成,将形成的决议发送给所有Learner。

 

Paxos应用案例

前面讲述了paxos算法细节,可能你还是不明白paxos算法在实际场景中有什么用处,我们现在讲个实际的使用案例。

我们以一个分布式的KV数据库为例,分析Paxos的应用场景。

 

3个server组成一个分布式内存数据库,他们的状态必须保持同步,也就是每个server 节点都需要维护有顺序的操作日志,同时保持一致。

+---+-------------+
|1  |Put("a", 1)  |
+---+-------------+
|2  |Put("b", 2)  |
+---+-------------+
|3  |Put("c", 3)  |
+---+-------------+

多个客户端并发在发送请求的时候,服务端多个节点需要协商,选择其中一个大家都认可的数据(指令), 存入到操作表中,这里协商确定指令的过程就是Paxos

比如我们将paxos算法封装到下面的方法中:

Op doPaxos(int seq, Op v){...}

以上面图示的例子详细分下这个过程:

  1. Cient2向集群发送了请求Put("b", 2),假设这个请求最终到了server1上。
  2. Client3向集群发送了请求Put("c", 3), 假设这个求情发到了server2上。
  3. server2调用doPaxos函数进行协商,即询问集群中的所有server咱们的第2个操作能否为Put("c", 2)
  4. 此时server3也调用doPaxos函数进行协商,即询问集群中的所有server咱们的第2个操作能否为Put("c", 3)
  5. 这是Paxos只会选择其中1个提案,我们这里假设server2的议题最终被通过了,集群中所有server的状态表都新增Put("c", 2)
  6. server3发现自己的提案没有选中,他会对自己的database进行Put("b", 2)操作,然后重新升级提案编号,再次调用doPaxos方法,直到自己的提案被通过。

总结

Paxos算法还是挺难以理解的,如果对整个推导过程感兴趣的话,可以阅读Lamport的原文。

根据前面讲述的Paxos算法流程,不知道大家有没有发现一个问题,如果两个Propser依次提出编号递增的提案,最终回陷入死循环,进入死锁状态,如下图:

 

我们可以通过选取主Proposer,就可以保证Paxos算法的活性, 这样是ZAB协议的由来。



Tags:Paxos算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
深入浅出理解分布式一致性Paxos算法
概述Paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。本文的目的就是带领大家深入浅出理解Paxos算法,...【详细内容】
2022-08-02  Search: Paxos算法  点击:(333)  评论:(0)  加入收藏
Paxos算法难理解?来看看大家都在用的Raft算法
分布式共识系列文章: 《解决分布式一致性问题,不得不了解的Paxos算法》 《基本Paxos协议是如何实现分布式数据一致性的?》 《可用于实际应用场景中的Multi Paxos实用算法》前面...【详细内容】
2021-06-04  Search: Paxos算法  点击:(526)  评论:(0)  加入收藏
Paxos算法为什么说是Raft,Zab协议的鼻祖,及原理解析
paxos算法在分布式领域具有非常重要的地位。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难。网上有很多讲解Paxos算法的文章,但是质量参差不齐。看了很多关于...【详细内容】
2020-01-03  Search: Paxos算法  点击:(359)  评论:(0)  加入收藏
Paxos算法浅析
前言在文章2PC/3PC到底是啥中介绍了2PC这种一致性协议,从文中了解到2PC更多的被用在了状态一致性上(分布式事务),在数据一致性中很少被使用;而Paxos正是在数据一致性中被广泛使...【详细内容】
2019-10-18  Search: Paxos算法  点击:(724)  评论:(0)  加入收藏
Paxos算法被认为是类似算法中最有效的
概述Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人在微软研究院)1990年提出的一种基于消息传递的一致性算法。[1] 这个算法被认为是类似算法中最有...【详细内容】
2019-09-27  Search: Paxos算法  点击:(669)  评论:(0)  加入收藏
Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难。网上有很多讲解Paxos算法的文章,但是质量参差不齐。看了很多关于...【详细内容】
2019-08-15  Search: Paxos算法  点击:(943)  评论:(0)  加入收藏
▌简易百科推荐
小红书、视频号、抖音流量算法解析,干货满满,值得一看!
咱们中国现在可不是一般的牛!网上的网友已经破了十个亿啦!到了这个互联网的新时代,谁有更多的人流量,谁就能赢得更多的掌声哦~抖音、小红书、、视频号,是很多品牌必争的流量洼地...【详细内容】
2024-02-23  二手车小胖说    Tags:流量算法   点击:(18)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03   一安未来  微信公众号  Tags:雪花算法   点击:(54)  评论:(0)  加入收藏
程序开发中常用的十种算法,你用过几种?
当编写程序时,了解和使用不同的算法对解决问题至关重要。以下是C#中常用的10种算法,每个算法都伴随着示例代码和详细说明。1. 冒泡排序 (Bubble Sort):冒泡排序是一种简单的比...【详细内容】
2024-01-17  架构师老卢  今日头条  Tags:算法   点击:(46)  评论:(0)  加入收藏
百度推荐排序技术的思考与实践
本文将分享百度在推荐排序方面的思考与实践。在整个工业界的推广搜场景上,特征设计通常都是采用离散化的设计,需要保证两方面的效果,一方面是记忆,另一方面是泛化。特征都是通过...【详细内容】
2024-01-09  DataFunTalk  微信公众号  Tags:百度推荐   点击:(81)  评论:(0)  加入收藏
什么是布隆过滤器?如何实现布隆过滤器?
以下我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?布隆过滤器(Blo...【详细内容】
2024-01-05  Java中文社群  微信公众号  Tags:布隆过滤器   点击:(94)  评论:(0)  加入收藏
面向推荐系统的深度强化学习算法研究与应用
随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本...【详细内容】
2024-01-04  数码小风向    Tags:算法   点击:(106)  评论:(0)  加入收藏
非负矩阵分解算法:从非负数据中提取主题、特征等信息
非负矩阵分解算法(Non-negativeMatrixFactorization,简称NMF)是一种常用的数据分析和特征提取方法,主要用于从非负数据中提取主题、特征等有意义的信息。本文将介绍非负矩阵分解...【详细内容】
2024-01-02  毛晓峰    Tags:算法   点击:(75)  评论:(0)  加入收藏
再谈前端算法,你这回明白了吗?
楔子 -- 青蛙跳台阶一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。分析: 当n=1的时候,①只需要跳一次即可;只有一种跳法,即f(...【详细内容】
2023-12-28  前端爱好者  微信公众号  Tags:前端算法   点击:(114)  评论:(0)  加入收藏
三分钟学习二分查找
二分查找是一种在有序数组中查找元素的算法,通过不断将搜索区域分成两半来实现。你可能在日常生活中已经不知不觉地使用了大脑里的二分查找。最常见的例子是在字典中查找一个...【详细内容】
2023-12-22  小技术君  微信公众号  Tags:二分查找   点击:(81)  评论:(0)  加入收藏
强化学习算法在资源调度与优化中的应用
随着云计算和大数据技术的快速发展,资源调度与优化成为了现代计算系统中的重要问题。传统的资源调度算法往往基于静态规则或启发式方法,无法适应动态变化的环境和复杂的任务需...【详细内容】
2023-12-14  职场小达人欢晓    Tags:算法   点击:(169)  评论:(0)  加入收藏
站内最新
站内热门
站内头条