分布式系统中的CAP原理

分布式系统中的CAP原理

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

简介

在分布式系统中,我们经常听到CAP原理这个词,它是什么意思呢?其实和C、A、P这3个字母有关,C、A、P分别是这3个词的首字母。下面我们就看- -下这3个词分别是什么意思?

  • C- Consistent, -致性。具体是指,操作成功以后,所有的节点,在同一时间,看到的数据都是完全一致的。 所以,致性,说的就是数据一致性 。
  • A- Availability, 可用性。指服务一致可用,在规定的时间内完成响应。
  • P- Partition tolerance;分区容错性。指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供服务。

CAP原理指出,这3个指标不能同时满足,最多只能满足其中的两个。

详解

我们之所以使用分布式系统,就是为了在某个节点不可用的情况下,整个服务对外还是可用的,这正是满足P(分区容错性)。如果我们的服务不满足P(分区容错性),那么我们的系统也就不是分布式系统了,所以,在分布式系统中,P(分布容错性)总是成立的。那么,A(可用性)和C(一致性)能不能同时满足呢?我们看一下下面的图例。

A和B是两个数据节点,A向B同步数据,并且作为一个整体对外提供服务。由于我们的系统保证了P(分区容错性),那么A和B的同步,我们允许出现故障。接下来我们再保证A(可用性),也就是说A和B同步出现问题时,客户端还能够访问我们的系统,那么客户端既可能访问A也可能访问B,这时,A和B的数据是不一致的,所以C(一致性)不能满足。

如果我们满足C(一致性),也就是说客户端无论访问A还是访问B,得到的结果都是一样的,那么现在A和B的数据不一致,需要等到A和B的数据一致以后,也就是同步恢复以后,才可对外提供服务。这样我们虽然满足了C(一致性),却不能满足A(可用性)。

所以,我们的系统在满足P(分区容错性)的同时,只能在A(可用性)和C(一致性)当中选择一个不能CAP同时满足。我们的分布式系统只能是AP或者CP。

ACID与BASE

在关系型数据库中,最大的特点就是事务处理,也就是ACID。ACID是事务处理的4个特性。

  • A - Atomicity (原子性),事务中的操作要么都做,要么都不做。
  • C -Consistency (- 致性),系统必须始终处在强一致状态
  • I - Isolation (隔离性),-个事务的执行不能被其他事务所干扰。
  • D- Durability (持久性),-个已提交的事务对数据库中数据的改变是永久性的。

ACID强调的是强一致性,要么全做,要么全不做,所有的用户看到的都是一致的数据 。传统的数据库都有ACID特性,它们在CAP原理中,保证的是CA。但是在分布式系统大行其道的今天,满足CA特性的系统很难生存下去。ACID也逐渐的向BASE转换。那么什么是BASE呢?

BASE是Basically Available (基本可用),Soft-state (软状态),Eve ntually consistent(最终一致)的缩写。

  • Basically Available,基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
  • 软状态(Soft State),软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有两到三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
  • 最终一致性(Eventual Consistency),最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

BASE模型是传统ACID模型的反面,不同与ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了。

在分布式事务的解决方案中,它们都是依赖了ACID或者BASE的模型而实现的。像基于XA协议的两阶段提交和实物补偿机制就是基于ACID实现的。而基于本地消息表和基于MQ的最终一致方案都是通过BASE原理实现的。

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

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

相关文章

【LeetCode】206. 反转链表(简单)——代码随想录算法训练营Day03

题目链接:206. 反转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输…

JAVA获取昨日和今日日期时间

import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;public class TimeDemo {public static void main(String[] args) {Calendar calendarDay Calendar.getInstance();calendarDay.add(Calendar.DATE, -1);//查询今日时间String startTim…

MySQL表结构转换为ES索引Mapping

背景 日常开发过程中肯定会存在MySQL表数据迁移至ES的情况,以canal为例,数据迁移时需要提前在ES中创建索引Mapping,但是如果碰到字段特别的表时,创建Mapping将是一件耗费心神的事情。为了解决这些重复工作,我使用Pyth…

私域流量怎么运营最有效?

如何有效运营私域流量?这是许多企业和商家都在思考的问题。在当今的数字化时代,私域流量已经成为了企业和商家发展的重要资产之一。但是,如何才能运营好私域流量呢?下面我们将从多个角度来探讨这个问题。 一、什么是私域流量&…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-3.5连续系统离散化

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-3.5连续系统离散化

微服务网关的鉴权功能

1 网关如何整合openFeign完成统一鉴权 A 引入openFeign的依赖 B 注入user服务,lazy注解解决循环依赖 C openFeign阻塞线程,网关非阻塞线程,所以改成非阻塞调用 D 加载优先级,提高全局过滤器优先级 E 整合httpMessageConverter F 鉴…

代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛

leetcode 130. 被围绕的区域 题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…

业务题day03

3-1 你们的项目是如何进行参数校验的 我们项目中使用Java Bean Validation规范进行参数校验,该规范定义了一组注解,用于对方法参数、类属性等进行校验。 在需要进行参数校验的对象上添加注解,如NotNull、NotBlank、Min、Max等。这些注解可以…

k8s-pod的控制器

pod控制器的概念 工作负载,workload,用于管理pod的中间层,确保pod资源符合预期的状态 预期状态 1、副本数 2、容器的重启策略 3、镜像拉取策略 pod出现故障时的重启等等 pod控制器的类型 1、replicaSet 指定pod副本的数量 三个组件 …

深入浅出关于go web的请求路由

文章目录 前言一、是否一定要用框架来使用路由?二、httprouter2.1 httprouter介绍2.2 httprouter原理2.3 路由冲突情况 三、gin中的路由总结 前言 最近重新接触Go语言以及对应框架,想借此机会深入下对应部分。 并分享一下最近学的过程很喜欢的一句话&am…

架构的未来:微前端与微服务的融合

目录 前言 微服务架构简介 微前端架构简介 微前端与微服务的融合 1. 共享服务 2. 基于事件的通信 3. 统一的身份和认证 4. 交付管道的集成 示例:使用微服务和微前端的电子商务平台 微服务架构 微前端架构 融合微服务和微前端 总结 作者简介…

rollup + typescript 搭建项目

一、创建项目 1、初始化项目 1、创建一个项目目录,进入该目录 2、执行 npm init -y 生成 package.json 3、执行 tsc --init 生成 tsconfig.json 2、安装依赖 (1)安装 typescript 和 rollup-plugin-typescript npm install -D typescript …

明明的随机数【C语言】

【华为机试题 HJ3】明明的随机数 描述输入描述:示例1参考代码1参考代码2描述 明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。 数据范围: 1≤ n ≤1000 ,输入…

【打卡】牛客网:BM93 盛水最多的容器

题目: 考虑到盛水容器的特殊性。双指针从最两边开始遍历,遍历过程中舍弃最小的。 不知道原理。 模板的: class Solution { public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*…

数学建模 | 数学建模常用的十种解题方法

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 数学建模常用的十种解题方法 摘要一、蒙特卡罗算法1 蒙特卡罗计算重积分…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图的圆切图,Kotlin(4)

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图的圆切图,Kotlin(4) 这篇 Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin&am…

C语言详解之一维数组二维数组以及变长数组

一周新的开始,今天的你学习了吗? 前言 今天打算把数组的相关知识知识复习一下,比如初始化,调用,以及他和指针的关系等等 数组是什么 数组是一种数据结构,它由相同类型的元素组成,并按照一定的…

burp靶场-path traversal

路径遍历 1.路径遍历漏洞 ### 什么是路径遍历 路径遍历也称为目录遍历。这些漏洞使攻击者能够读取正在运行应用程序的服务器上的任意文件。这可能包括&#xff1a; 应用程序代码和数据。 后端系统的凭据。 敏感的操作系统文件。### <img src"/loadImage?filename218…

springCould中的Stream-从小白开始【12】

&#x1f95a;今日鸡汤&#x1f95a; 见过一些人&#xff0c;他们朝九晚五&#x1f62d;&#xff0c;有时也要加班&#xff0c;却能把生活过得很&#x1f60e;有趣。他们有自己的爱好&#xff0c;不怕独处。他们有自己的坚持&#xff0c;哪怕没人在乎。&#x1f926;‍♂️ 开心…

FASTQ 文件压缩格式有哪些?

FASTQ 文件压缩格式 .gz .bz2 .xz .rfq .rfq.xz FASTQ 文件是用于存储测序数据的一种格式&#xff0c;它包含了大量的文本信息&#xff0c;因此通常占用大量的存储空间。为了有效地处理和传输这些数据&#xff0c;通常需要对 FASTQ 文件进行压缩来节省存储空间及传输带宽。以下…