分布式 CAP理论 总结
前言
相关系列
- 《分布式 & 目录》
- 《分布式 & CAP理论 & 总结》
- 《分布式 & CAP理论 & 问题》
分布式
分布式的核心是将大型业务拆解成多个子业务以使之在不同的机器上执行。分布式是用于解决单个物理机容量&性能瓶颈问题而采用的优化手段,服务之间通过远程调用进行交流,从而协同工作以对外提供服务。
CAP理论
- Consistency @ (强)一致性:系统的所有节点在相同时刻可以看到相同数据,即对于在多个节点中存在的变量而言,其在同一时刻的值必然是相同的;
- Availability @ 可用性:无论响应结果如何,系统都可以“在合理的时间内”响应请求,即使节点因为各类故障(包含但不限于网络分区)而不可用;
- Partition Tolerance @ 分区容错性:系统能够在发生(特指)网络分区时继续响应请求。
所谓CAP理论指的是分布式系统无法在“读/写数据”时同时满足“一致性/可用性/分区容错性”三种特性,因此系统设计者必须在这三者之间做出权衡:
- CA策略 @ 一致性&可用性:牺牲分区容错性来保证一致性&可用性。CA策略不属于分布式系统的可用策略,因为以目前的技术能力而言网络分区是无法避免的。因此如果放弃了分区容错性,那么分布式系统在网络分区时将完全不可用。但该策略在单机部署&单点集群部署(服务虽然被多个部署为集群,但相互间没有交互)时是可用的,或者说单机部署&单点集群部署的程序默认就是CA策略,因为其内部不存在网络交互,因此也就无需在意网络分区的发生。所有程序&系统在服务未拆分/未集群的情况下采用的都是CA策略;
- CP策略 @ 一致性&分区容错性:牺牲可用性来保证一致性&分区容错性,适用于对数据一致性要求较高的分布式系统。当网络分区发生时,如果节点A无法正常请求节点B以完成数据同步,那么其可以通过阻塞至网络恢复的方式(并非只有这一种方式)来保证分区容错性。这种方式同时还可保证一致性,因为其可保证数据的读/写一定是正确的。但与此同时该方法会牺牲可用性,因为阻塞可能会导致请求难以/无法被及时回应。在实际情况中,从节点A复制数据到节点B总是需要花费一定时间的。如果是跨地域(例如北京到广州)的机房,耗费的时间就可能是几十/几百毫秒。因此CAP理论中的C在实践中是不可能完美实现的,因为在数据复制的过程中节点A&B 的数据并不一致,但CAP理论并不在意这种延迟。ZooKeeper就是一个典型的CP系统,它采用分布式一致性算法(如Paxos/Raft等)来确保在不同节点之间就数据状态达成强一致。此外,分布式一致性算法通常都带有容错特性,即只追求多数一致而非完全一致,故而大多数CP系统可用性其实也相当可观;
- AP策略 @ 可用性&分区容错性:牺牲一致性来保证可用性&分区容错性,适用于对可用性较高的场景。当节点故障/网络分区发生时,如果节点A无法正常请求节点B以完成数据同步,那么其可以通过放弃请求的方式(并非只有这一种方式)来保证分区容错性。这种方式同时还可保证可用性,因为其确保了回应必然是及时的。但与此同时该方法会牺牲一致性,因为请求将难以/无法正确地读/写数据。AP策略通常依赖“最终一致性”模型进行弥补,即虽然会有一定的延迟,但数据最终还是会在一定时间内会达成一致。
CAP理论策略的选择不是一成不变的。在 CAP理论落地实践时,我们需要将系统数据按照不同的应用场景和要求进行分类,从而为每类数据选择不同的分布式策略,而不是直接限定整个系统的所有数据都使用同一策略。
CAP理论告诉我们必须“牺牲”三特性中的一个,但这里的“牺牲”其实有一定误导作用,因为“牺牲”让很多人理解成彻底放弃。但实际上CAP理论的“牺牲”只是说我们无法在节点故障/网络分区期间保证一致性/可用性,而现实情况是系统在整个生命周期的大部分时间里·都是正常的,发生节点故障/网络分区现象的时间并不长。例如4个9 @ 99.99%可用性的系统一年运行下来不可用的时间只有50分钟;而5个9 @ 99.999%可用性的系统一年运行下来不可用的时间更是只有5分钟而已。在节点故障/网络分区期间放弃一致性/可用性并不意味着永远放弃,我们可以在节点故障/网络分区期间进行一些操作,从而令分布式系统在故障解决后重新达到一致性&可用性的状态。
BASE理论
BASE理论是对CAP理论一致性&可用性进行权衡后的结果,其核心思想是即使无法做到Strong consistency @ 强一致性,但每个应用也该根据自身业务的特点采用适当的方式来使系统达到Eventual consistency @ 最终一致性。
BASE是Basically Available @ 基本可用/Soft state @ 软状态/Eventually consistent @ 最终一致三个短语的简写,其各自含义具体如下:
- 基本可用:基本可用是指允许分布式系统在出现不可预知故障时候损失部分可用性。但注意!这绝不等价于系统不可用,以下两个就是“基本可用”的典型例子:
响应时间上的损失:正常情况下,一个在线搜索引擎需要0.5秒内返回给用户相应的查询结果,但由于出现异常(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1 ~ 2秒;
功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能够顺利地完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。 - 软状态:软状态也称弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性。通俗的说就是允许系统在不同节点的数据副本之间进行同步的过程存在延时。
- 最终一致性:最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。最终一致性的本质是需要系统数据最终能够达到一致,而不需要实时保证系统数据的强一致性。
BASE理论是对CAP理论AP策略的延伸&补充,是权衡一致性&可用性后的结果。BASE理论的诞生基础是CAP理论的AP/CP策略本质实现的也是最终一致性:例如CP策略虽然名义上保证了强一致性,但现实中数据副本的同步是有延迟的,但CAP理论直接忽视了这些延迟,因此绝对完美的CP策略是不存在的;而AP策略虽然牺牲了一致性,但这种牺牲实际上也只限于节点故障/网络分区期间,当故障恢复正常后数据同样会恢复至最终一致。
相关文章:
分布式 CAP理论 总结
前言 相关系列 《分布式 & 目录》《分布式 & CAP理论 & 总结》《分布式 & CAP理论 & 问题》 分布式 分布式的核心是将大型业务拆解成多个子业务以使之在不同的机器上执行。分布式是用于解决单个物理机容量&性能瓶颈问题而采用的优化手段…...
【UNION 和 UNION ALL 】关键字在MySql中的用法,以及注意事项
在 MySQL 中,UNION 和 UNION ALL 都用于将多个 SELECT 语句的结果合并到一个结果集中。它们的主要区别在于 UNION 去除重复 的行UNION ALL 保留所有 的行 示例 …...
GauHuman阅读笔记【3D Human Modelling】
笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...
SkyWalking 和 ELK 链路追踪实战
一、背景 最近在给项目搭建日志平台的时候,采用的方案是 SkyWalking ELK 日志平台,但发现 ELK 日志平台中的日志没有 Trace ID,导致无法追踪代码报错的整体链路。 空哥提示:Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…...
深度学习中的损失函数
损失函数是深度学习模型训练过程中不可或缺的一部分,是模型预测值与真实值之间差异的客观衡量标准。它们是模型训练的基础,指导算法调整模型参数,以最小化损失并提高预测准确性。它们衡量了模型预测值与真实值的吻合程度。通过最小化这种损失…...
android编译assets集成某文件太大更新导致git仓库变大
不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大…...
技术支持人员发现跨域问题,该如何处理
跨域问题通常是由于浏览器的同源策略(Same-Origin Policy)引起的。简而言之,浏览器阻止了一个域上的网页访问另一个域的资源,目的是为了安全性。跨域问题通常发生在以下场景: 在一个网站的前端应用程序(如…...
有 SpringBoot 助力,广场舞团解锁花式舞步密码
3 系统分析 3.1 系统可行性分析 3.1.1 经济可行性 由于本系统是作为毕业设计系统,且系统本身存在一些技术层面的缺陷,并不能直接用于商业用途,只想要通过该系统的开发提高自身学术水平,不需要特定服务器等额外花费。所有创造及工作…...
【推荐算法】单目标精排模型——FiBiNET
key word: 学术论文 Motivation: 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的,这篇文章的作者提出了采用SENET实现动态学习特征的重要性;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…...
从零开始学TiDB(3)TiKV 持久化机制
如图,每个TiKV有两个rocksdb实例,rocksdbKV复制存储键值对,rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似,在OB中每个Unit及其副本构成了paxos组,在TiDB中叫raft…...
集合ArrayList
黑马程序员Java的个人笔记 BV17F411T7Ao p111~p115 目录 集合存储数据类型的特点 创建对象 ArrayList 成员方法 .add 增加元素 .remove 删除元素 .set 修改元素 .get 查询元素 .size 获取长度 基本数据类型对应的包装类 Character 练习 返回多个数据 集合存储…...
后端API接口设计标准(Java)
Controller 层(API接口) 无论是传统的三层架构还是现在的COLA架构,Controller 层依旧有一席之地,说明他的必要性;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收…...
Oracle Recovery Tools工具一键解决ORA-00376 ORA-01110故障(文件offline)---惜分飞
客户在win上面迁移数据文件,由于原库非归档,结果导致有两个文件scn不一致,无法打开库,结果他们选择offline文件,然后打开数据库 Wed Dec 04 14:06:04 2024 alter database open Errors in file d:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_6056.trc: ORA-01113:…...
Python制做一个简易PDF编辑器——关于PDF文字编辑实现的思路
在Python零基础快速入门最后一篇,我们一起做了一个PDF编辑小工具,里面只实现的PDF翻页浏览等,并没有实现PDF的文字在线编辑,是因为在PDF编辑器中实现文字编辑功能是一个相对复杂的过程,因为PDF格式本质上是一个用于呈现…...
RabbitMQ如何保证消息不被重复消费
前言: 正常情况下,消费者在消费消息后,会给消息队列发送一个确认,消息队列接收后就知道消息已经被成功消费了,然后就从队列中删除该消息,也就不会将该消息再发送给其他消费者了。不同消息队列发出的确认消…...
Windows Terminal ssh到linux
1. windows store安装 Windows Terminal 2. 打开json文件配置 {"$help": "https://aka.ms/terminal-documentation","$schema": "https://aka.ms/terminal-profiles-schema","actions": [{"command": {"ac…...
vue实现页面自动滚动,鼠标悬浮暂停,移开继续
1、给div一个id <div class"kb_nei_new_left" id"chartsContainer">2、定义一个自动滚动的方法 autoSroll(Id) {// flag 为true时停止滚动var flag false;// 定时器var timer;function roll() {var h -1;timer setInterval(function () {flag …...
第3章:文本样式 --[CSS零基础入门]
CSS(层叠样式表)允许你以多种方式定制文本的外观。以下是一些常用的文本和字体相关的CSS属性: 1.字体 字体系列 当然,下面是两个使用不同字体系列的CSS示例。每个示例都展示了如何指定一个字体系列,并提供备用字体以确保在用户的系统中找不到首选字体时仍有合适的字体可…...
从视觉到雷达:多模态感知如何引领自动驾驶安全革命
文章目录 摘要引言多模态感知融合的原理与架构感知技术的特点多模态感知融合的目标 数据融合实现示例代码结构与主要组件模型定义 MultimodalFusionModel前向传播(forward 方法)模型细节剖析实践应用 QA环节总结参考资料 摘要 本文探讨了多模态感知技术…...
若依集成更好用的easyexcel
背景 若依使用的是apach poi并在此基础上进行封装apach poi的原生的api是很复杂的,若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的,依赖于文件大小的限制在此前提下,如果没法满足客户的需求(超大型文件的上传&am…...
大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
线段树模板
单点修改 #include <bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(false),cin.tie(nullptr); #define rep(i, x, y) for(int i(x), _(y);i<_;i) #define rrep(i, x, y) for(int i(x), _(y);i>_;i--) #define all(x) x.begin(),x.end() #d…...
算法刷题Day15: BM37 二叉搜索树的最近公共祖先
题目链接 描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以…...
正则表达式去除文本中括号()<>[]里的内容
一行文本中包含有各种括号,如()、<>、[],我们希望把括号及括号内的内容0去除,可以通过正则表达式来实现。 匹配() pattern r\([^)]*\) # 匹配()匹配一个左括号(,然后匹配0个或多个不是右括号的任意字符[^)]*,…...
Environment Modules安装配置
Environment Modules安装配置 Environment Modules是一款用来管理计算机软件环境的软件,通过简单的命令来控制计算机环境变量。本文接受该软件的安装和配置方法 系统: Linux OpenSUSE 15.6 软件版本: modules 5.5 依赖: gcc 7.5…...
constexpr、const和 #define 的比较
constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义:constexpr用于定义在编译期可求值的常量表达式。示例:constexpr int x 5;这里,x的值在编译期就确定为5。 const 定义:const表示变量在运行期间不能被修改&…...
STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)
一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT(非阻塞模式): HAL_UART_Transmit_IT 是非阻塞的传输函数,也就是说,当你调用 HAL_UART_Transmit_IT 时,它不会等到数据完全发…...
如何制作“优美”PPT
目录 1.免费PPT模板网站: 2.免费有较好质量的图片网站: 免费图片资源 免费透明PNG图片资源: 免费icon图片资源: 3.选择好的图片: 图片底色 4.要与不要 千万不要: 一定要: 6.一些建议…...
5G模组AT命令脚本-控制模组进入飞行模式
控制模组进入飞行模式 控制模组进入飞行模式 控制模组进入飞行模式 控制模组进入飞行模式 #!/bin/bash ## 5G模组采用USB3.0与上位机连接,usb接口在上位机上虚拟出多个port,其中一个可用于发送AT命令,控制模组 ## 本脚本控制模组进入飞行模式## flyin …...
计算机网络-Wireshark探索ARP
使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…...
Vue 2 生命周期函数详解
Vue 2 生命周期函数详解 引言 Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。理解 Vue 的生命周期函数(Lifecycle Hooks)对于开发高效的 Vue 应用至关重要。本文将详细介绍 Vue 2 的生命周期钩子、每个阶段的作用及其代码示例&…...
Vue的路由实现模式:hash模式和history模式
Vue 路由的两种模式: hash 模式: 类似于住在一个大房子里,你的地址很长,但用一个 “门牌号”(# 后面的部分)来标识你住哪间房间。 例如: bash http://example.com/#/home 这就好比 “example.…...
R语言 | 峰峦图 / 山脊图
目的:为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …...
Kubernetes(K8s)
头条:参考资料 Kubernetes 入门指南:从基础到实践_kubernetes 从入门到实践-CSDN博客 Kubernetes(k8s)与docker的区别 Docker、Kubernetes之间的区别_docker和kubernetes区别-CSDN博客 Docker部署SpringBoot项目(镜…...
【代码随想录|贪心算法05】
56.合并区间 题目链接56. 合并区间 - 力扣(LeetCode) 这道题思路跟前两道也很像,就是更新把相同的区间合并而已。 class Solution { public: static bool cmp(const vector<int>& a,const vector<int>& b){return a[0…...
QQ聊天室--C++基础项目--QT+Socket网络编程
目录 一、项目概述 二、项目成果 1、QQ基础界面展示: 2、群聊界面展示: 3、聊天功能展示 三、项目代码 1、登录头文件(denglu.h) 2、登录源文件(denglu.cpp) 3、聊天界面头文件(widget.…...
分布式搜索引擎之elasticsearch基本使用2
分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来,我们研究下…...
今日商协丨商协会在“双循环”新发展格局中的作用
在当今全球经济环境中,世界格局正在经历深刻变化,中国正在全面构建“双循环”新发展格局,以实现更高质量、更可持续的发展。在这一过程中,商协会发挥着不可或缺的作用。 商协会在国内大循环中扮演促进者的角色,不仅活…...
前端项目安装node-sass
这个依赖比较难装,因为这个依赖需要安装的版本是和node版本绑定的,所以你需要去sass的官网找到对应关系,下面是我的版本信息: node 16.14.2 node-sass:^6.0.1 sass-loader:^10.2.0 "sass": "^1.82.0", 你…...
算法-字符串-678.有效的括号字符串
一、题目 二、思路解析 1.思路: 用leftMin变量来记录存在的“(”, 用leftMax变量记录字符串中最多的“(” 2.常用方法: 无 3.核心逻辑: 1.遍历字符串: a.当前字符为"(",le…...
linux 压缩文件为zip
在 Linux 系统中,可以使用 zip 命令来压缩文件或目录 打开终端(Terminal)。 使用 cd 命令导航到要压缩的文件或目录所在的路径。 运行以下命令来压缩文件或目录: 压缩单个文件: zip output.zip file.txt这里…...
Cisco Packet Tracer | Cisco Packet Tracer - VLAN 实验 - 交换机的 VLAN 划分
关注这个工具的其它相关笔记:Cisco Packet Tracer —— 使用教程合集-CSDN博客 0x01:VLAN 划分 - 单个交换机 0x0101:拓扑搭建流程 从软件底部拖出一台交换机(笔者选择的型号是 2960 IOS15): 然后再拖出四…...
《计算机网络》(408大题)
2009 路由转发和静态路由的计算 子网划分、路由聚合的计算 注:CIDR中的子网号可以全为0或1,但是其主机号不允许。 注: 这里其实是把到互联网的路由当做了一个默认路由(当一个目的网络地址与路由表中其他都不匹配时,…...
二叉树概述
目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…...
qiankun学习记录
什么是微前端 微前端是指存在于浏览器中的微服务,其借鉴了微服务的架构理念,将微服务的概念扩展到了前端。 如果对微服务的概念比较陌生的话,可以简单的理解为微前端就是将一个大型的前端应用拆分成多个模块,每个微前端模块可以…...
【C++ 20进阶(2):初始化 Initializer
【C 20进阶(2):初始化 Initializer】 原文:https://blog.csdn.net/weixin_44259356/article/details/144377955 引言 本篇文章为系列文章将着重介绍C20新特性,一是希望可以和大家交流分享,二是也便于自己…...
vue3学习——事件监听(v-on)
我们可以使用 v-on 指令监听 DOM 事件: <button v-on:click"increment">{{ count }}</button> 因为其经常使用,v-on 也有一个简写语法: <button click"increment">{{ count }}</button> 此处…...
java全栈day13-后端Web实战2
接上述查询部门实现,完成后续要求 一、统一响应结果 1.1步骤 资料如下 对一开始的代码修改如下 结果如下 1.2测试 指定请求方式 结果 小结 二、前后端联调测试 资料如下: (不行,一定要不带空格和不带中文,要不然启动不了试了半天…...
C++/CX,一个智能的 C++/Windows 平台开发库!
以下是一篇关于C/CX的C学习文章: 开篇 嘿,大家好呀!我是一行。今天咱们来一起探索一个超棒的C开发库——C/CX,它可是在Windows平台开发中非常智能且强大的工具哦,能让我们的开发变得更加高效便捷。让我们一起开启今天的…...
分布式 分布式事务 总结
前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…...