返回顶部
首页 > 资讯 > 前端开发 > JavaScript >分析CAP和Paxos共识算法
  • 538
分享到

分析CAP和Paxos共识算法

2024-04-02 19:04:59 538人浏览 薄情痞子
摘要

本篇内容介绍了“分析CAP和Paxos共识算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 CAP

本篇内容介绍了“分析CAP和Paxos共识算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

什么是 CAP

分析CAP和Paxos共识算法

关于 CAP 理论的背景介绍已经很多,这里不过多介绍,我们谈谈如何理解它的问题。

用通俗易懂的话解释三个名词:

一致性

如果刚刚向一个节点写入,那么之后,从另外一个节点读取的必须是刚刚写入的数据,不能是更老的数据。

可用性

如果请求一个节点,这个节点必须能够给予回复,如果节点挂掉了,那就谈不上可用性了。

分区容忍性

是否容忍网络分区,即可以允许节点和其它节点无法通信。

CAP 的意思就是说我们最多只能保证其中两个条件同时成立。

下面我们来看看为什么。

分析CAP和Paxos共识算法

如图所示,假如我们满足了分区容忍性,即虚线处表示两个节点发生了分区。

  • 假如要满足一致性,那么,我们只能让请求另一个节点的操作暂时 hang 住,返回 client  失败或者超时的结果,这种情况多发生在银行柜台等对数据一致性要求很高的情境下,因为比起保证用户资金数目的正确性比暂时让用户无法操作要更重要一些。

  • 假如要满足可用性,因为网络已经隔离,也就没办法达到一致性,这种情况多发生在互联网行业中,比如新闻等对数据一致性要求不高但对可用性要求高的情况下,毕竟,用户压根看不了新闻比看不到及时新闻要重要的多。

大家可以自己自由组合,最终会证明,三种条件不可能同时满足,其实大部分情况下,我们都是在一致性和可用性之间取舍而已。

Consistency = Consensus?

Consistency 几乎被业界用烂,以至于当我们在讨论一致性的时候,其实我们都无法确定对方所说的一致性是不是和自己的那个一致。

Consistency:一致性,Consensus:协同,这两个概念极容易混淆。

我们常说的一致性(Consistency)在分布式系统中指的是对于同一个数据的多个副本,其对外表现的数据一致性,如线性一致性、因果一致性、最终一致性等,都是用来描述副本问题中的一致性的。而共识(Consensus)则不同,简单来说,共识问题是要经过某种算法使多个节点达成相同状态的一个过程。在我看来,一致性强调结果,共识强调过程。

共识?状态机?

共识有个更高逼格的称呼:

基于状态机复制的共识算法

那么,状态机是什么?

状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。

看下图,门,有两种状态,开着的和关着的。因此,在我看来状态是一种静态的场景,而转换赋予了其动态的变化。

分析CAP和Paxos共识算法

以此类比一下,如果一个节点当前的数据是 X,现在有了 add+1 的操作日志来了,那么现在的状态就是  X+1,好了,状态(X)有了,变化(操作日志)有了,这就是状态机。

分布式共识,简单来说,就是在一个或多个节点提议了一个状态应当是什么后,系统中所有节点对这个状态达成一致意见的整个过程。

共识是过程,一致是结果。

共识模型

主从同步:

分析CAP和Paxos共识算法

我们都知道 Mysql 等业界常见数据库的主从同步(Master-Slave Replication),主从同步分三个阶段:

  • Master 接受写请求

  • Master 复制日志至 Slave

  • Master 等待,直到所有从库返回。

可见,主从同步模型存在致命问题:只要一个节点失败,则 Master 就会阻塞,导致整个集群不可用,保证了一致性,可用性缺大大降低了。

多数派:

每次写入大于 N/2 个节点,每次读也保证从 N/2  个节点中读。多数派的模型看似完美解决了多节点的一致性问题,不就是性能差点嘛,可是在并发的情况下就不一定了,如下图:

分析CAP和Paxos共识算法

在并发环境下,因为每个节点的操作日志写入顺序无法保证一致,也就无法保证最终的一致性。如图,都是向三个节点

inc5、set0 两个操作,但因为顺序不一样,最终状态两个是 0,一个是  5。因此我们需要引入一种机制,给每个操作日志编上号,这个号从小到大生成,这样,每个节点就不会弄错。(是否想到了网络中的分包与重组?)那么,现在关键问题又来了,怎么协同这个编号?貌似这是鸡生蛋、蛋生鸡的问题。

Paxos

Paxos 模型试图探讨分布式共识问题的一个更一般的形式。

Lesile Lamport,Latex 的发明者,提出了 Paxos 算法。他虚拟了一个叫做 Paxos  的希腊城邦,这个岛按照议会民主制的政治模式制定法律,但是没有人愿意将自己的全部时间和精力放在这件事上。所以无论是议员、议长或者传递纸条的服务员都不能承诺别人需要时一定会出现,也无法承诺批准决议后者传递消息的时间。由于  Paxos 让人太难以理解,Lamport 觉得同行不能理解他的幽默感,于是后来又重新发表了朴实的算法描述版本《Paxos Made Simple》。

分析CAP和Paxos共识算法

该共识算法就整体来说,存在两个阶段,如图,第一个阶段是提议,第二个阶段是决定。

分布式系统要做到 fault tolorence,就需要共识模型,而节点达成共识,不仅需要节点之间的算法,还会取决于 client  的行为。比如即使副本系统使用 multi-paxos 在所有副本服务器上同步了日志序号,但如果 Client 被允许从非 Leader  节点写入数据,则整个副本系统仍然不是强一致的。

下面,重头戏来了,详细介绍 Paxos。

角色介绍:

Client:系统外部角色,请求发起者。如民众。

Proposer: 接受 Client 请求,向集群提出提议(propose)。并在冲突发生时,起到冲突调节的作用。如议员,替民众提出议案。

Accpetor: 提议投票和接收者,只有在形成法定人数(Quorum,即 Majority 多数派)时,提议才会最终被接受。如国会。

Learner: 提议接受者,backup,备份,对集群的一致性没影响。如记录员。

步骤、阶段

分析CAP和Paxos共识算法

1.Phase1a: Prepare

proposer 提出一个议案,编号为 N,N 一定大于这个 proposer 之前提出的提案编号,请求 acceptor 的 quorum(大多数)  接受。

2.Phase1b: Promise

如果 N 大于此 acceptor 之前接受的任何提案编号则接受,否则拒绝。

3.Phase2a: Accept

如果达到了多数派,proposer 会发出 accept 请求,此请求包含上一步的提案编号和提案内容。

4.Phase2b: Accepted

如果此 acceptor 在此期间没有收到任何大于 N 的提案,则接受此提案内容,否则忽略。

还记得上文中我们提到过,同步编号是非常重要的问题,绿色框出来的实际上就是同步编号的过程。通过这个编号,就知道每条操作日志的先后顺序。简单说来,第一阶段,获取编号,第二阶段,写入日志。可以看出来,Paxos  通过两轮交互,牺牲时间和性能来达到弥补一致性的问题。

现在我们考虑部分节点 down 掉的情景。

分析CAP和Paxos共识算法

由于是多数派 accptor 达成了一致,第一阶段仍然成功获得了编号,所有最终还是成功的。

考虑 proposer down 掉的情景。

分析CAP和Paxos共识算法

没关系,虽然第一个 proposer 失败,但下一个 proposer 用更大的提案编号,所以下一次 proposer  最终还是成功了,仍然保证了可用性和一致性。

潜在问题:活锁

分析CAP和Paxos共识算法

Paxos 存在活问题。如图,当 第一个 proposer 在第一阶段发出请求,还没来得及后续的第二阶段请求,紧接着第二个 proposer  在第一阶段也发出请求,如果这样无穷无尽,acceptor 始终停留在决定顺序号的过程上,那大家谁也成功不了,遇到这样的问题,其实很好解决,如果发现顺序号被新的  proposer 更新了,则引入一个随机的等待的超时时间,这样就避免了多个 proposer 发生冲突的问题。

Multi Paxos

由于 Paxos 存在的问题:难实现、效率低(2 轮 rpc)、活锁。

因此又引入了 Multi Paxos,Multi Paxos 引入 Leader,也就是唯一的 proposer,所有的请求都需经过此  Leader。

分析CAP和Paxos共识算法

因为只有一个节点维护提案编号,这样,就省略了第一轮讨论提议编号的过程。

然后进一步简化角色。

分析CAP和Paxos共识算法

Servers 中第左边的就是 Proposer,另外两个和自身充当 acceptor,这样就更像我们真实的系统了。Raft 和 ZAB  协议其实基本上和这个一致,两者的差别很小,就是心跳的方向不一样。

Raft 和 ZAB

Raft 和 ZAB 协议将 Multi Paxos 划分了三个子问题:

  • Leader Election

  • Log Replication

  • Safety

在 leader 选举的过程中,也重定义角色:

  • Leader

  • Follower

  • Candidate

这个动画网站生动展示了 leader 选举和日志复制的过程。在这里就不多讲了。

另外,raft 官方网站可以自己操作模拟选举的过程。

“分析CAP和Paxos共识算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 分析CAP和Paxos共识算法

本文链接: https://lsjlt.com/news/85216.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分析CAP和Paxos共识算法
    本篇内容介绍了“分析CAP和Paxos共识算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 CAP...
    99+
    2024-04-02
  • HotStuff共识算法详解
    HotStuff共识算法是一种基于拜占廷容错的分布式共识算法,它采用了类似于Raft算法的领导者选举和日志复制机制,并结合了类似于P...
    99+
    2023-09-23
    HotStuff
  • 如何实现分布式共识算法Raft
    本篇内容主要讲解“如何实现分布式共识算法Raft”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现分布式共识算法Raft”吧!关于CAP原理C(一致性)A(...
    99+
    2024-04-02
  • Java分布式一致性协议与Paxos,Raft算法是什么
    这篇文章主要讲解了“Java分布式一致性协议与Paxos,Raft算法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java分布式一致性协议与Paxos,Raft算法是什么”吧!2PC...
    99+
    2023-06-04
  • 数据分析算法---线性回归(初识)
              最近在学习数据分析线性回归算法时,产生了很多疑问。作为初学者,我认为应该先从基本概念上进行一些深度理解。下面将我的一些思考总结如下:         线性回归模型为: (1)         其中ε是剩余误差,假设它服...
    99+
    2023-01-30
    线性 算法 数据
  • 数据库中ACID理论和CAP理论的示例分析
    这篇文章主要为大家展示了“数据库中ACID理论和CAP理论的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中ACID理论和CAP理论的示例分析”这...
    99+
    2024-04-02
  • Java算法设计与分析分治算法
    目录一、前言二、分治算法介绍三、分治算法经典问题3.1、二分搜索3.2、快速排序3.3、归并排序(逆序数)3.4、最大子序列和3.5、最近点对四、结语一、前言 在学习分治算法之前,问...
    99+
    2024-04-02
  • React中调和算法Diffing算法策略的示例分析
    这篇文章主要为大家展示了“React中调和算法Diffing算法策略的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React中调和算法Diffing算法策略的示例分析”这篇文章吧。算法...
    99+
    2023-06-22
  • Raft 中怎么利用共识算法选举领导者
    今天就跟大家聊聊有关Raft 中怎么利用共识算法选举领导者,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Raft 是一种强领导者模型,即一切以领导者...
    99+
    2024-04-02
  • Java算法之最长公共子序列问题(LCS)实例分析
    本文实例讲述了Java算法之最长公共子序列问题(LCS)。分享给大家供大家参考,具体如下:问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X= { x1, x2,…, xm},则另一序列Z= {z1,...
    99+
    2023-05-30
    java 算法 最长公共子序列
  • C++前缀和与差分算法的示例分析
    这篇文章将为大家详细讲解有关C++前缀和与差分算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、前缀和前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的...
    99+
    2023-06-25
  • JavaScript内存管理和GC算法实例分析
    本文小编为大家详细介绍“JavaScript内存管理和GC算法实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript内存管理和GC算法实例分析”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2024-04-02
  • Go和Java算法详析之分数到小数
    目录分数到小数方法一:模拟竖式计算(Java)方法一:模拟竖式计算(Go)总结分数到小数 给定两个整数,分别表示分数的分子 numerator 和分母 denominato...
    99+
    2024-04-02
  • Django 和 Java:编程算法的优缺点分析
    在现代软件开发中,选择一种编程语言是非常重要的决策。Django 和 Java 都是非常流行的编程语言,但它们之间有许多不同之处。在本文中,我们将探讨 Django 和 Java 的优缺点,并比较它们在编程算法方面的性能。 Django...
    99+
    2023-10-09
    函数 django 编程算法
  • Python图算法实例分析
    本文实例讲述了Python图算法。分享给大家供大家参考,具体如下: #encoding=utf-8 import networkx,heapq,sys from matplotlib import py...
    99+
    2022-06-04
    算法 实例 Python
  • MySQL算法的示例分析
    这篇文章主要为大家展示了“MySQL算法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL算法的示例分析”这篇文章吧。MySQL算法简析&nbs...
    99+
    2024-04-02
  • Vue中的虚拟DOM和Diff算法实例分析
    这篇文章主要介绍了Vue中的虚拟DOM和Diff算法实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的虚拟DOM和Diff算法实例分析文章都会有所收获,下面我们一起来看看吧。简单介绍一下 虚拟DO...
    99+
    2023-06-29
  • PHP和NumPy:两种编程算法的对比分析?
    PHP和NumPy:两种编程算法的对比分析 在计算机科学领域,编程算法是解决问题的关键。在这个领域里,PHP和NumPy是两种非常常见的编程算法。虽然它们在不同的领域中使用,但它们都是非常强大和灵活的工具。在这篇文章中,我们将比较PHP和N...
    99+
    2023-10-25
    numpy 编程算法 numy
  • angular2模块和共享模块的示例分析
    这篇文章主要介绍angular2模块和共享模块的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建模块,用到了共享模块PostSharedModule,共享模块里面包含了2个...
    99+
    2024-04-02
  • Java分治法与二分搜索算法实例分析
    本文实例讲述了Java分治法与二分搜索算法。分享给大家供大家参考,具体如下:1、分治法分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的...
    99+
    2023-05-30
    java 分治法 二分搜索
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作