分布式系统中的那些一致性(CAP、BASE、2PC、3PC、Paxos、ZAB、Raft)

news2024/10/6 2:28:39

本文介绍 CAP、BASE理论的正确理解、Paxos 算法如何保证一致性及死循环问题、ZAB 协议中原子广播及崩溃恢复以及 Raft 算法的动态演示。
下面还有投票,一起参与进来吧👍

文章目录

  • 前言
  • CAP理论
    • 理解误导
    • 正确的理解
    • CAP理论的应用
  • BASE理论
  • Paxos算法
    • 如何保证一致性?
    • 死循环问题
  • ZAB协议
    • Leader 选举
    • 广播消息
    • 崩溃恢复
  • Raft算法
  • 总结

前言

工作过几年的同学,尤其是这几年,大家或多或少都参与过分布式系统的开发,遇到过各式各样“分布式”问题,而遇到这些问题去解决时就是我们对这个知识学习的过程。

不知道大家是否跟我一样,每每搜索到“分布式”关键词,总会出现各种“分布式理论”,比如CAP、BASE理论、2PC、3PC 以及 Paxos、Raft、ZAB 算法,而这些貌似跟一致性都有一定的关系。

在读过数次与之相关的不同文章后,每次都会有不一样的理解以及困惑,比如,CAP中的 C 怎么就强一致了?BASE 理论的定义怎么这么抽象?还有 Paxos、ZAB、Raft 都是一致性算法,奥… 干!!!管求它。转眼就又忘了,不晓得大家是否跟我一样😄。

本文以我对这些一致性理论的理解进行阐述,希望可以对大家有一点帮助。

CAP理论

CAP理论是Eric Brewer教授在2000年提出的,大概是这样的:

在分布式系统中,数据一致性分区容忍性系统可用性是不可能同时达到的,只能保证其中两项可以达到。而由于在互联网交互应用中,网络不稳定的情况总是存在,网络分区始终是不可避免的,从而在设计分布式系统时,总是考虑如何在数据一致性和系统可用性上进行取舍。

理解误导

通常在一些CAP的文章中可以看到很多类似以下的说法:

C(consistency)一致性:访问所有节点得到的结果是一致的。
A(Availability)可用性:请求在一定时间内可以得到正确的响应。
P(Partition tolerance)分区容错性:在网络分区的情况下,系统仍能提供服务。

并且后面会跟上这句话分布式系统不能保证同时使用C、A和P,只能选择CP或AP

这样的说法并没有错,因为提出该理论的作者确实有提出:

Any distributed system cannot guarantly C,A,and P simultaneously

但是会误导读者去理解。比如在我之前看到上述说法时会有几个疑问:

  1. 对于分区容错性,我搞个集群就可以;对于一致性,我理解那就跟ACID中的C是不一样的,更像是某个组件集群部署后节点之间的数据一致性,那应该还是集群,为什么说是分布式系统呢?
  2. 怎么不能保证同时使用C,A, P?怎么一致就不可用了?可用就不一致了?不冲突吧?

CAP是CAP,这个“CP”或“AP”先适当存疑😁
在这里插入图片描述

正确的理解

后面去了解CAP理论的背景,得知作者写了2版来阐述CAP,最后一个版本中写道:

In a distributed system(a collection of interconnected nodes that share data),you can only have two out of the following three guarantees across a write/read pair: Consistency,Availability,and Partition Tolerance
在分布式系统(共享数据的互连节点的集合)中,在写/读对中只能有以下三种保证中的两种:一致性、可用性和分区容错

在这一个版本中的(共享数据的互连节点的集合)证实了我第一个疑问,至于为什么说分布式系统,我觉得应该是集群属于分布式系统中的一个场景。

至于第二个疑问其实还是场景问题,如果在没有网络分区的情况下,C,A是可以同时满足的,如果出现了网络分区,C,A确实不可以同时满足,举个例子:如果来了一个写操作,如果要满足一致性,意味着这几个节点的数据要一致后,数据才能被访问,但是出现了网络分区,就会等待网络恢复或重试或者其他操作,必然满足不了可用性的要求(在一定时间内可以得到正确的响应)。反过来,如果要在一定时间内得到正确响应,在网络分区的情况下,一致性必然也满足不了了。

所以CAP理论是有前提场景的,总结一下应该是这样的:分布式系统中存在共享数据的互连节点,在网络分区的前提下,不能保证同时保证可用性和一致性。

CAP理论的应用

现在再说 Zookeeper 是 CP 架构、Eureka 是 AP 架构 应该就不难理解了。

这两个组件都符合 CAP 中的(共享数据的互连节点的集合),Zookeeper 集群是 Leader 在写数据时需要过半节点同意才会写入,客户端才会读取到这个值,所以说 Zookeeper 是 CP 架构;Eureka 集群是不论哪个节点在写数据时都会立即刷新本地数据然后再同步给其他节点,客户端这个时候读取不同节点时就会发现数据不一致,所以 Eureka 是 AP 架构。

BASE理论

BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写。

  • 基本可用
    基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性,不像 CAP 中的定义那样严格(在一定时间内可以得到正确的响应)。比如:
    • 响应时间上的损失。正常情况下,0.5秒之内返回给用户结果,但由于出现故障,会有重试等操作,3秒内返回也是接受的。
    • 系统功能上的损失:正常情况下,用户可以顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,为了保护系统的稳定性,部分用户可能会被引导到一个降级页面。
  • 软状态
    软状态指允许系统中的数据存在中间状态,这种中间状态的存在不会影响系统的整体可用性。比如:在交易的场景中,因为会存在交易失败的情况,所以不会直接扣减 A 账户100到 B 账户上,而是先冻结 A 账户100。
  • 最终一致性
    最终一致性是指在经过一段时间后,软状态的数据达到一致的状态。比如:在冻结 A 账户100后,如果失败那就扣减A账户冻结的100至可用余额中;交易成功再将 A 账户冻结的100扣减,并添加至 B 账户的可用余额。最终达到一致性。

有很多的文章说是BASE理论是CAP理论的演进,这种说法先存疑,先存疑😄。因为CAP理论的场景是分布式系统(共享数据的互连节点的集合),而BASE理论是满足更多的场景的。

Paxos算法

Paxos算法是莱斯利·兰伯特于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。
基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复。Paxos 算法解决的问题是在一个可能发生上述异常的分布式系统中如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏决议的一致性

如何保证一致性?

OK,通过下图看看 Paxos 是如何保证一致性的。为了方便理解,图中的议员暂且当作一个注册中心集群中的实例。
在这里插入图片描述

  1. 当某个议员有某些想法时想让其他议员认可并批准,那么会以提案的方式进行决定。
  2. 在提交一个提案时都会获取到一个具有全局唯一性的、递增的提案编号(N),然后发送给其他议员。
  3. 其他议员在收到这个编号后会与自己批准过的提案中最大编号进行比较:
    • 如果没有收到的编号(N)大,那么它就会将它已经批准过编号最大的提案响应给提案者,意味着认可这个提案。
    • 如果比收到的编号(N)大,则代表编号(N)被处理过,不做任何响应,意味着不认可这个提案。
  4. 提案者在收到半数以上响应后,就会再次发送一个确认的请求给其它议员进行执行。
  5. 其他议员在收到确认的请求后,发现没有对编号大于N的提案请求做出过响应,它就批准该提案

这个我感觉是和2PC一样,通过两阶段提交,最终确认是否批准,只不过是实现细节以及使用场景不同罢了。当然也会存在2PC中第二阶段节点失去通信问题,这种情况议员们最多不批准提案,不会影响一致性问题。

死循环问题

Paxos 算法有几率出现死循环问题,导致提案不通过。如下图:
在这里插入图片描述

假设我们有2个议员同时发出提案请求。

  1. 议员1提交编号为1的提案并收到过半响应。
  2. 此时议员2提交编号为2的提案也收到过半响应。
  3. 由于提案阶段响应的编号已为2,根据“没有对编号大于N的提案请求做出过响应,它就批准该提案”,所以议员1的编号(1)在接收阶段不会被批准。
  4. 如果此时议员1重新发送编号为3的提案并通过后,议员2的提案在接收阶段也不会通过。

如此循环,就会造成死循环。

ZAB协议

ZAB 协议(ZooKeeper Atomic Broadcast)原子广播是 ZooKeeper 用来保持所有服务器消息的顺序同步并保证一致,与 Paxos 不同,其为主备架构,所以在同步数据时不会出现多个节点同时提交提案(死循环问题),而是会在集群节点中选举 Leader ** 节点,统一经由 Leader 节点进行提案,但是主备架构避免不了 Leader 节点的崩溃,如果出现该问题,ZAB 还会保证集群节点的崩溃恢复**。关于ZAB更多描述去ZooKeeper官网看看。

所以 ZAB 协议主要做了3件事:

  1. 选举 Leader 节点。
  2. 以广播的方式保证副本之间的消息一致。
  3. Leader 节点崩溃后进行崩溃恢复。

Leader 选举

在这之前先了解下 ZAB 节点的三种状态:

  • FOLLOWING:当前节点是跟随者,服从 leader 节点的命令。
  • LEADING:当前节点是 leader,负责协调事务。
  • LOOKING:节点处于选举状态。

当集群初始启动时,每个节点会投自己一票并向其他节点发起投票请求,进入 LOOKING 状态。当某个节点的投票数过半后,该节点进入LEADING 状态,当选 Leader,其他节点则会进入 FOLLOWING 状态,成为 Follower。下面以3台服务器为例,介绍 Leader 选举过程:

发起投票
在这里插入图片描述

如上图,三个节点同时启动首先会向自己投一票,并将(myid,ZXID)作为投票信息向其他两个节点发送。此时每个节点的投票箱都是自己投个自己(myid,myid)。myid是每个节点的标识;ZXID 是最近一次的事务ID,初始值为0。

PK阶段
在这里插入图片描述

每个节点在收到投票请求后会比较 ZXID,如果 ZXID 相等则比较 myid 。比较时如果自己节点的ZXID或myid小,那么更新自己的投票(myid,胜出节点id)并添加收到的投票至票箱(胜出节点id,胜出节点id)

如上图,node1 在收到 node2、3 的投票请求后,由于ZXID相等,node3的myid大,所以 node1 更新自己的投票箱并添加 node3 的投票,此时为(1,3)(3,3)。

node2同样如此,投票结果为此时为(2,3)(3,3)。

node3不做更新操作。

广播投票

在这里插入图片描述
node1、node2 在更新自己的投票结果后向其他两个节点广播投票结果,结果如上图。

根据上述投票,三个服务器一致认为 node3 应该是 Leader 。所以 node3 进入 LEADING 状态成为 Leader,node1、node2 进入 FOLLOWING 状态称为 follower。

下图是搭建了 Zookeeper 集群启动后的结果,也验证上述选举算法。
在这里插入图片描述

广播消息

为了保障副本之间的数据一致,ZAB协议做了以下几点:

  1. 所有的写请求都通过 Leader 进行操作,如果 Follower 收到写请求,会转发给 Leader。
  2. Leader 针对写请求会生成一个提案,并为这个提案生成一个ZXID(保障一致、顺序。)
  3. Followers 在收到提案后 ack 给 Leader。
  4. Leader 在收到过半的 Follower ack 后会广播一个 commit 消息。
  5. Follower 收到 commit 消息后会比较 ZXID,如果之前没有处理过比 ZXID 大的写请求,那就进行提交。
Leader Followers 提案 ack commit Leader Followers

崩溃恢复

Leader 重新选举

当网络异常造成网络分区或者某个节点崩溃,如果是 Leader 节点这时候需要进行重新选举。如下图
在这里插入图片描述
数据同步

选举新的 Leader 后,其他节点的数据要与之同步。同步过程如下图

在这里插入图片描述

  1. 在选举为 Leader 后,node2 将自身的 Epoch 进行自增并发送给 Follower,Follower进行更新并将自己的ZXID同步给 Leader 。每次选举 Leader 后 Epoch 会+1,这样,当老的 Leader 重新连接到集群后,会对比其日志中 epoch 编号与 leader 此时的 epoch 编号:对于 epoch 更小的那部分日志,就舍弃掉。
  2. Leader 根据 ZXID 的差异进行同步。上图 Leader 会将 Follower 未提交的事务以提案进行逐条发送和提交给 Follower ,Follower 收到提案和提交请求后进行同步。

老 Leader 恢复

当老的 Leader 恢复后要加入集群中,其过程如下:

在这里插入图片描述

  1. node1 发起投票,node2、node3 响应自己的角色和投票,通过 node2 的响应,可以知道 node2 为 Leader ,并且通过两者的投票可以确定 node2 为 Leader ,因此自己成为 Follower。
  2. 在选举为 Leader 后 将自身的 Epoch 进行自增并发送给 Follower,Follower进行更新并将自己的ZXID同步给 Leader。
  3. Leader 根据 ZXID 的差异进行同步。上图 ZXID无差异,所以无需同步。

Raft算法

Raft 算法按照我的理解是和ZAB协议相似,两者相同的概念可能名词不同,比如:ZAB 中的 Epoch 和 Raft 的 Term 概念相同;实现方式大体相似,细节不同,比如:数据同步都是通过 Leader 节点进行提案,不同的是 Raft 通过状态达到一致、Leader 选举方式相似,发起投票时都会投自己一票,实现上 Raft 通过两个 timeout 控制选举。这里我就不多废话了,大家可以通过Raft算法动态演示更容易理解。

总结

所以为什么有这么多的一致性定义呢?之间有什么关系?

我觉得还是场景,首先ACID、CAP、BASE都是理论,ACID是专注于事务、CAP理论作用在集群副本场景、BASE理论应用最终一致性场景。

而2PC、3PC则是对于事务完整性的具体解决方案,Paxos、ZAB、Raft更倾向于集群副本一致性的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASEMI代理LT6230CS6-10#TRPBF原装ADI车规级LT6230CS6-10#TRPBF

编辑:ll ASEMI代理LT6230CS6-10#TRPBF原装ADI车规级LT6230CS6-10#TRPBF 型号:LT6230CS6-10#TRPBF 品牌:ADI /亚德诺 封装:SOT-6 批号:2023 安装类型:表面贴装型 引脚数量:6 工作温度:-4…

sentinel介绍

介绍 官网地址 Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源&…

阿里云争食币圈

阿里云的触手正在向币圈延伸。几天前,阿里云与Avalanche区块链和MUA DAO联合推出Cloudverse,为想要在链上部署元宇宙的企业提供一站式解决方案。 Avalanche是典型的币圈项目,链上的一切价值流转都以加密货币结算。此次合作释放出阿里云在Web…

apt 与 dpkg 命令详解

一. apt & dpkg 异同点 1. apt 与 dpkg 均为 ubuntu 下面的包管理工具。 2. dpkg 仅用于安装本地的软件包&#xff0c;安装时不会安装依赖包&#xff0c;不解决依赖问题。 sudo dpkg -i <package_name>.deb 3. apt 默认会从远程仓库搜索包的名字&#xff0c;下载并安…

多元线性回归——自相关(二)

自相关问题 文章目录 自相关问题(R)[toc]1 什么是自相关2 自相关产生的原因3 自相关的后果4 自相关检验5 自相关补救6 R语言操作 1 什么是自相关 经典普通最小二乘法估计的假设之一是扰动项不存在自相关&#xff0c;即对于 ∀ i ≠ j \forall i\ne j ∀ij,都有 C o v ( μ …

Kali-linux测试网络范围

测试网络范围内的IP地址或域名也是渗透测试的一个重要部分。通过测试网络范围内的IP地址或域名&#xff0c;确定是否有人入侵自己的网络中并损害系统。不少单位选择仅对局部IP基础架构进行渗透测试&#xff0c;但从现在的安全形势来看&#xff0c;只有对整个IT基础架构进行测试…

5G+工业物联网——解密“智能矿山”背后的黑科技

当前&#xff0c;以5G为代表的新一代信息技术正在飞速发展并加快应用&#xff0c;以工业物联网为代表的新型基础设施建设则推动着传统制造业数字化转型发展。依托我国5G全球最大的规模网络以及国家出台的一系列政策&#xff0c;“5G工业物联网”变成应用创新最活跃的行业之一。…

【Linux】认识高级IO 5种IO模型

文章目录 高级IOIO的基本概念什么是IOOS如何得知外设当中有数据可读取OS如何处理从网卡中读取到的数据包IO的步骤 五种IO模型钓鱼的例子对应的模型如何区分同步IO和异步IO 阻塞IO非阻塞IO信号驱动IOIO多路转接异步IO 高级IO的概念同步通信 VS 异步通信阻塞 VS 非阻塞 阻塞IO非阻…

基于springboot的家政服务平台的设计与实现

背景 现代社会&#xff0c;由于经济不断发展&#xff0c;家政服务的数量也在不断的增加&#xff0c;随着家政服务的数量增多&#xff0c;人们对家政服务信息的需求也越来越高。 以往的家政服务管理平台的管理&#xff0c;一般都是纸质文件来管理家政服务信息&#xff0c;传统…

Python基本数据类型 — 列表

一、列表基本操作 1、创建列表 &#xff08;1&#xff09;使用 [] 创建列表 创建一个空列表&#xff0c;可以使用以下代码&#xff1a; my_list []创建一个包含元素的列表&#xff0c;可以在方括号中使用逗号分隔值&#xff0c;如下所示&#xff1a; my_list [1, 2, 3, …

Qt编写视频监控系统72-通过onvif增删改查OSD

一、前言 之前监控系统中原创的onvif协议解析机制&#xff0c;已经能够满足绝大部分用户的需要&#xff0c;比如搜索设备、获取视频流地址并播放、云台控制、预置位管理、图片亮度色彩饱和度等参数设置等&#xff0c;近期又多了一个需求&#xff0c;那就是通过onvif国际标准协…

平台使用篇 | RflySim平台飞控固件上传教程

导读 本教程共介绍了4种飞控固件的上传方式&#xff0c;重点介绍了Simulink模型生成自定义固件上传的两种方法&#xff0c;其中固件上传步骤主要分为三步&#xff1a;下载源码、编译生成固件及最后上传固件。 01 PX4官方上传方式 详见PX4官方固件烧录教程&#xff1a;https:…

基于spring boot + maven + opencv 实现的图像深度学习

写在前面的话 这是一个基于spring boot maven opencv 实现的Demo教程项目贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点以学习交流为目的&#xff0c;代码注释超多&#xff0c;文档也在逐步完善java语言的深度学习项目&#xff0c;在整个开源社区来说都相对…

RflySim平台使用篇 | Rflysim3D软件使用系列教程(二)

导读: RflySim3D&#xff08;支持体验版&#xff09;和RflySimUE5&#xff08;支持完整版&#xff09;为本平台核心三维显示软件&#xff0c; 分别基于UE4 和UE5 引擎开发&#xff0c;具备高逼真虚拟现实显示效果。本视频主要讲解了如何将自定义的三维场景如何加载到RflySim3D…

Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130542981 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

将远程服务器linux上的jupyter notebook映射到本地浏览器中

前提&#xff1a;mobaXterm可以连接远程服务器了 &#xff01;&#xff01;&#xff01;注意端口变化&#xff01;&#xff01;&#xff01; * 用从cmd中ssh -L 。。。去链接&#xff0c;报错perssion denied&#xff0c;所以还是选择mobaXterm方便。 1、mobaXterm的SSHTunnel配…

一般纳税人如何解决增值税、企业所得税高等问题?

业务是流程&#xff0c;财税是结果&#xff0c;税收问题千千万&#xff0c;关注《税算盘》来帮你找答案。 一般纳税人需要缴纳的增值税比小规模纳税人相比&#xff0c;需要缴纳更多。增值税作为我国第一大税种&#xff0c;能够筹划的空间并没有企业所得税那么多。 但是也是有…

软考A计划-真题-分类精讲汇总-第二章(操作系统)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

最近大火的ChatGpt,到底给我们带来了哪些改变?

我相信最近大家都有听说这个ChatGpt了吧&#xff01; 即使没有听说过也没有关系&#xff0c;我来给大家掰扯掰扯。 OpenAI公司推出了一款名为ChatGPT的人工智能聊天机器人&#xff0c;该技术通过利用大量训练数据&#xff0c;实现了人类般的自然语言处理能力&#xff0c;并能…

堆的实现,画图和代码分析建堆,堆排序,时间复杂度以及TOP-K问题

堆的实现 堆的概念及结构堆的实现初始化销毁返回堆顶元素判空有效数据个数堆的插入&#xff08;向上调整算法&#xff09;删除堆顶元素&#xff0c;仍然保持堆的形态&#xff08;向下调整算法&#xff09; 堆的创建向上调整法建堆向下调整建堆两种建堆方法时间复杂度向下调整法…