分布式理论:CAP、Base理论

目录

1、CAP理论

1.1、介绍

1.2、CAP的三种选择

1.3、CAP的注意事项

2、BASE理论

2.1、定义介绍

2.2、最终一致性的介绍

2.3、BASE的实现方式

2.4、与ACID的对比

3、CAP与BASE的联系

4、如何选择CAP


前言

         在分布式系统中,CAP理论BASE理论是指导系统设计的核心原则,分别从一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)以及最终一致(Eventually Consistent)的角度,帮助开发者权衡分布式系统的特性。

如下图所示:

        CAP理论指出分布式系统无法同时保证一致性、可用性和分区容错性,必须在CA中做出选择。

        在网络分区时,系统通常选择AP或CP架构,如ZooKeeper是CP,Eureka是AP。

        BASE理论则是在CAP基础上,接受在故障时损失部分可用性,允许数据的软状态和最终一致性,以实现大规模系统的可伸缩性。


1、CAP理论

1.1、介绍

        CAP理论由计算机科学家 Eric Brewer 提出,指出在分布式系统中,最多只能同时满足以下三个特性中的两个。

        对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:

1、一致性(Consistency) :

所有节点访问同一份最新的数据副本。


2、可用性(Availability):

非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)。


3、分区容错性(Partition Tolerance) :

分布式系统出现网络分区的时候,仍然能够对外提供服务。

如下所示:

        解决分区问题的最好办法就是给数据备份,备份在不同的网络中,这样,当网络通信出现故障,就会降低数据访问不到的风险提高了分区容错性

1.2、CAP的三种选择

  1. CP(一致性 + 分区容错性)

    • 保证数据强一致,但在网络分区时可能拒绝请求(牺牲可用性)。

    • 典型系统:ZooKeeper、etcd、HBase。

  2. AP(可用性 + 分区容错性)

    • 保证高可用,但可能返回旧数据(牺牲强一致性)。

    • 典型系统:Cassandra、DynamoDB、Eureka。

  3. CA(一致性 + 可用性)

    • 仅在无网络分区的单机或局域网环境中可行,分布式系统通常无法避免分区(P必须选择)。

1.3、CAP的注意事项

  • P是必须选择的:分布式系统一定会面临网络分区问题(如机房断网、节点宕机),因此实际选择是 CP 或 AP

  • CAP是理论极限:实际系统可能动态调整(如降级策略)。


2、BASE理论

        由于CAP理论中的强一致性(C)和高可用性(A)难以同时满足。

2.1、定义介绍

        BASE理论(Basically Available, Soft state, Eventually consistent)提出了一种折中方案,适用于大规模分布式系统(如电商、社交网络)。

以下是介绍:

        软状态允许数据备份延迟,但最终这些数据都要保证一致性。这就是最终一致性。

2.2、最终一致性的介绍

        最终一致性在软状态上加了一个时限,这个时限取决于网络延时、系统负载数据复制方案设计等。

根据实际的业务场景,最终一致性可被分为以下 5 种。

1、因果一致性

        有果必有因。收到数据更新通知的节点,应该使用更新后的新值,即种下什么因,就得什么果。

        例如,服务A更新了一个数据后,通知给了服务B,那么服务B如果要操作这个数据,应该使用 A 更新后的新值。如果 C 和 A没有这种关系,那么可以不受这一条件的限制。

2、读自身所写

        自身写入的新值,之后读取也应该是这个新值。这是一种特殊的因果一致性。

3、会话一致性


        会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现“读自身所写”的一致性。

        也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。

4、单调读一致性

        单调读一致性是指,如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值

5、单调写一致性

        单调写一致性是指,一个系统要能够保证来自同一个节点的写操作被顺序的执行。

        在实践中,这5种一致性往往会结合使用,以构建一个具有最终一致性的分布式系统。

2.3、BASE的实现方式

  1. 读写分离:写操作同步到主节点,读操作可能访问从节点(旧数据)。

  2. 异步复制:数据先写入主节点,再异步同步到从节点。

  3. 冲突解决:使用版本号(Vector Clock)、CRDT(无冲突数据类型)等机制处理冲突。

2.4、与ACID的对比


3、CAP与BASE的联系

  • CAP是理论框架,指出分布式系统必须权衡一致性、可用性和分区容错性。

  • BASE是工程实践,在AP系统(高可用)的基础上,通过最终一致性平衡性能与一致性。

CAP选择

  • 牺牲部分可用性(A):在网络分区或选举期间,ZooKeeper 可能暂时不可用(返回错误或阻塞请求)。

         Eureka 在设计的时候就是优先保证 A (可用性)。在 Eureka 中不存在什么 Leader 节点,每个节点都是一样的、平等的。

        因此 Eureka 不会像 ZooKeeper 那样出现选举过程中或者半数以上的机器不可用的时候服务就是不可用的情况。即使大部分节点挂掉也不会影响正常提供服务,只要有一个节点是可用的就行了。只不过这个节点上的数据可能并不是最新的。


4、如何选择CAP

  • 需要强一致性(CP):金融交易、分布式锁(如etcd)。

  • 需要高可用性(AP):社交网络、商品库存(如Cassandra)。

  • 最终一致性(BASE):评论系统、消息队列(如Kafka)。


总结

  • CAP理论:分布式系统必须牺牲C或A,P不可放弃。

  • BASE理论:通过最终一致性实现高可用,适合对实时一致性要求不高的场景。

  • 现代系统趋势

    • 混合模式(如TiDB:Raft保证CP,但通过优化提供高可用)。

    • 动态调整(如网络恢复后自动修复一致性)。


参考文章:

1、【分布式】CAP理论和BASE理论详解_cap和base理论区别-CSDN博客https://blog.csdn.net/kazuhura/article/details/129771346?ops_request_misc=&request_id=&biz_id=102&utm_term=cap%E7%90%86%E8%AE%BA%E5%92%8Cbase%E7%90%86%E8%AE%BA&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-129771346.142^v102^pc_search_result_base1&spm=1018.2226.3001.4187

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

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

相关文章

【最新】飞算 JavaAl安装、注册,使用全流程,让ai自己给你写代码,解放双手

目录 飞算 JavaAl 产品介绍 安装飞算 JavaAl 第一步:点击 File->Setting 第二步:点击 Plugins 第三步:搜索 CalEx-JavaAI 第四步:点击 Install 进行安装 第五步:点击 Install ,查看安装好的飞算…

无人设备遥控器之姿态控制算法篇

无人设备遥控器的姿态控制算法通过传感器数据融合、控制算法优化和执行机构调节实现动态平衡,核心算法包括PID控制、自适应控制、模型预测控制(MPC),以及数据融合中的互补滤波和卡尔曼滤波,同时涉及四元数算法和深度强…

【加解密与C】Base系列(三)Base85

Base85 编码简介 Base85(也称为 Ascii85)是一种二进制到文本的编码方案,用于将二进制数据转换为可打印的ASCII字符。它的效率高于Base64,但生成的字符串可能包含特殊字符(如引号或反斜杠),需在…

Docker企业级应用:从入门到生产环境最佳实践

一、Docker核心概念与架构 1.1 Docker技术栈 #mermaid-svg-CUEiyGo05ZYG524v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CUEiyGo05ZYG524v .error-icon{fill:#552222;}#mermaid-svg-CUEiyGo05ZYG524v .error-te…

8、保存应用数据

目录用户首选项的使用用户首选项主要API用户首选项开发流程用户首选项开发实践关系型数据库的使用关系型数据库工作流程关系型数据库开发实践用户首选项的使用 用户首选项主要API 用户首选项开发流程 成功的获取了一个名为myStore的Preferences实例 保存了一个键值对&#x…

(C++)list列表相关基础用法(C++教程)(STL库基础教程)

源代码&#xff1a;#include <iostream> #include <list>using namespace std;int main(){list<int> numbers{10,20,30};numbers.push_front(5);numbers.push_back(40);auto it numbers.begin();advance(it,2);numbers.insert(it,15);cout<<"该列…

Spring CGLIB私有方法访问成员变量为null问题

场景 代码 RestController public class TestJob {Autowiredprivate XxService xxService;XxlJob("testCGLIB")private void doTest(){System.out.println("方法调用");System.out.println("成员变量注入:"(xxService!null));this.doInnerTest()…

Paimon本地表查询引擎LocalTableQuery详解

LocalTableQueryLocalTableQuery 是 Paimon 中实现本地化、带缓存的表查询的核心引擎。它的主要应用场景是 Flink 中的 Lookup Join。当 Flink 作业需要根据一个流中的 Key 去关联一个 Paimon 维表时&#xff0c;LocalTableQuery 可以在 Flink 的 TaskManager 节点上&#xff0…

使用协程简化异步资源获取操作

异步编程的两种场景 在异步编程中&#xff0c;回调函数通常服务于两种不同场景&#xff1a; 一次性资源获取&#xff1a;等待异步操作完成并返回结果。持续事件通知。监听并响应多个状态变更。 Kotlin为这两种场景提供了解决方案&#xff1a;使用挂起函数简化一次性资源获取…

ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务

ABP VNext Cosmos DB Change Feed&#xff1a;搭建实时数据变更流服务 &#x1f680; &#x1f4da; 目录ABP VNext Cosmos DB Change Feed&#xff1a;搭建实时数据变更流服务 &#x1f680;TL;DR ✨&#x1f680;1. 环境与依赖 &#x1f3d7;️2. 服务注册与依赖注入 &…

STM32-定时器

定时器&#xff1a;有4个独立通道&#xff1a;输入捕获&#xff1b;输出比较PWM生成&#xff1b;单脉冲模式输出&#xff1b;可通外部信号控制定时器&#xff08;TIMx-ETR&#xff09;&#xff1b;支持针对定时的增量&#xff08;正交&#xff09;编码器、霍尔传感器电路通用定…

Windows Server 2019--职业技能大赛B模块Windows服务器配置样题

一、赛题说明 &#xff08;一&#xff09;竞赛介绍 请详细阅读网络拓扑图&#xff0c;为所有计算机修改默认防火墙以便允许ICMP和相应的流量&#xff0c;不允许直接关闭主机的防火墙。除了CD-ROM/HDD驱动器&#xff0c;请不要修改虚拟机本身的硬件设置。 &#xff08;二&…

vue3+Echarts实现立体柱状图

Echarts柱状图中文网&#xff1a;https://echarts.apache.org/examples/zh/index.html#chart-type-bar 效果展示&#xff1a; 主要实现过程是三部分的组合&#xff0c;最上面是一个椭圆&#xff0c;中间是正常的柱子&#xff0c;下方再加上一个椭圆&#xff0c;就出来立体的效…

【UE5】虚幻引擎小百科

一、类名前面的大写字母的含义是什么UE5常见前缀分类表前缀含义实例用于AActorACharacter&#xff0c;AWeaponBase可放入世界中的对象&#xff08;有位置、可碰撞等&#xff09;UUObject派生类UUserWidget&#xff0c;UWeaponComponent引擎对象、逻辑模块&#xff0c;不具备Tra…

【Linux系统】vim编辑器 | 编译器gcc/g++ | make/Makefile

1. vim编辑器一、历史发展与Vim vs Vi的区别起源与演进Vi&#xff08;1976年&#xff09; &#xff1a;由Bill Joy开发&#xff0c;嵌入BSD Unix系统&#xff0c;是首个面向屏幕的文本编辑器&#xff0c;但功能有限&#xff08;如无多级撤销&#xff09;。Vim&#xff08;1991年…

国产飞腾主板,赋能网络安全防御硬手段

​ 当前&#xff0c;网络安全形势严峻&#xff0c;网络攻击手段不断翻新&#xff0c;从数据泄露到电脑中毒&#xff0c;企业、机构乃至国家的数字资产都面临着巨大风险。在此背景下&#xff0c;国产硬件技术的突破对筑牢网络安全防线意义重大。 高能计算机基于市场需求&#…

Spring AI 概述与架构设计

目录一、前言二、简介三、核心能力概览四、理解模块架构图五、模型适配能力六、最小应用示例七、与传统 LLM 调用相比八、总结九、参考一、前言 在 AI 正以前所未有的速度“下沉”到各类系统与业务的当下&#xff0c;Spring 官方推出的 Spring AI 项目&#xff0c;为 Java 开发…

UI前端与数字孪生融合新领域:智慧环保的污染源监测与治理

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生重构智慧环保的技术范式在环境污染治理压力持续增大的背景下&…

【go/wails】wails入门系列(一)环境安装与demo

文章目录说在前面go安装nodejs安装wails创建项目运行说在前面 操作系统&#xff1a;win11go版本&#xff1a;1.24.4nodejs版本&#xff1a;v22.16.0wails版本&#xff1a;v2.10.1 go安装 官网 这里 下载安装即可 nodejs 官网 这里 下载安装即可 安装wails 设置go国内代理g…

linux qt 使用log4cpp库

一、日志库下载 下载地址&#xff1a;https://log4cpp.sourceforge.net/二、日志库解压&#xff0c;编译 1.将文件夹解压出来2.进入文件夹内部&#xff0c;打开终端3.终端中依次输入以下命令 mkdir build ./configure --prefix$(pwd)/build make make install 一般来说不会报错…