CAP原则中的P:分区容错性(Partition tolerance)
CAP 理论概述
在分布式系统中,系统面临三大核心问题:
- 一致性(Consistency):所有节点的数据始终保持一致。
- 可用性(Availability):系统始终能够响应请求,无论请求是否成功。
- 分区容错性(Partition Tolerance):系统能够在部分机器故障、网络故障、机房停电等异常情况下继续运行。
CAP 定理的核心内容是,在一个分布式系统中,分区容错性(P) 和 一致性(C)、可用性(A) 三者之间是相互制约的。也就是说,如果发生网络分区,系统只能选择保证 一致性 或 可用性,但不能同时保证这两者。
理解 CAP 理论非常重要,可以让我们在职场上,当领导给出的任务不靠谱时,我们可以依据 CAP 去否决它。
比如,有这么一个任务,给你定了三大目标:
- 既要提升系统的可用性
- 又要保证数据的实时可见
- 还有提升系统的容错能力
完成这个任务是不可能的(至少在现有的硬件体系和软件架构的场景下是不可能的)。但是,如果你不理解 CAP,保证完成任务,那么职场是不需要眼泪和后悔的。
CAP 本身基于状态,基于瞬态,是一个描述性的理论,它并不解决工程问题。本质是在告诉大家,在分布式系统里,需要妥协。
分布式的存储系统会有很多的节点,这些节点都是通过网络进行通信。而网络是不可靠的,当节点和节点之间的通信出现了问题,此时,就称当前的分布式存储系统出现了分区。但是,值得一提的是,分区并不一定是由网络故障引起的,也可能是因为机器故障。
分布式存储系统要求能够自动容错,也就是说,分区可容忍性总是/必须要满足的,因为只有满足了P,才有实现C和A的基础,因此,一致性和写操作的可用性不能同时满足(是指发生了网络分区的时候才无法保证,没有网络分区时是可以保证CA同时发生的,所以说CAP是基于瞬态的。)。
但是要理解,机器故障、网络故障、机房停电等异常情况不是一直出现的,是一种概率相对较低,但是从长远来看又一定会发生的事件。当出现了网络分区就需要我们做出抉择,是保证C还是保证A
这是现在所有分布式框架设计的理论基础。
下面开始正题
1. 什么是分区容错性(Partition Tolerance)?
分区容错性(Partition Tolerance,简称 P)是 CAP 定理 中的一个重要特性。它指的是,在分布式系统中,即使网络发生了故障或者出现了节点之间无法通信的情况,系统仍然能够继续运行,而不会崩溃或失效。P 是在分布式系统中处理网络分区或通信故障的能力。
在网络发生分区时,系统的一部分可能和其他部分无法通信。为了避免整个系统崩溃,系统必须能够保持其运行,即使其中一部分处于无法访问的状态。
2. 为什么分区容错性重要?
在分布式系统中,多个计算机(或节点)分布在不同的物理位置,它们之间需要通过网络进行通信和数据交换。网络是一个可能发生故障的地方,故障可能由多种原因引起,例如:
- 网络硬件故障
- 路由器问题
- 网络连接不稳定
- 服务器故障
当这些故障发生时,可能会导致一部分节点和其他节点之间失去连接,这就是所谓的 网络分区。如果系统没有分区容错性,那么一旦网络分区发生,系统可能会完全崩溃或者变得不可用。
为了确保系统的可靠性和持续运行,分区容错性就显得至关重要。它可以保证即使部分系统节点无法通信,其他节点仍然能够继续工作。
3. 发生场景:什么情况下会发生网络分区?
分区容错性只在发生 网络分区 时起作用。网络分区的场景可以是以下几种:
- 物理网络故障:某些数据中心的网络设备或链路发生故障,导致节点间无法通信。
- 服务器故障:某个服务器或者一组服务器发生故障,无法与其他节点连接。
- 网络延迟过高:由于节点之间距离过远或者网络拥堵,导致请求的延迟非常高,导致节点无法及时收到其他节点的响应。
- 路由错误:路由器发生故障,导致消息无法传递到目标节点。
这些情况都会导致网络分区的发生,系统的一部分可能变得不可访问,而其他部分仍然可以工作。
4. 如何做到分区容错性(P)?
当网络分区发生时,分布式系统必须决定如何继续提供服务。通常有两个主要的选择:
- 继续提供服务,保证可用性(AP)。
- 暂停部分服务,保证一致性(CP)。
分区容错性要求系统在网络分区的情况下,能够选择其中之一,而不会完全停止工作。
步骤 1:检测网络分区
每个节点都有机制来检测与其他节点的连接是否正常。常见的方法是 心跳机制,即节点定期向其他节点发送信号(“心跳”),以确认是否能正常通信。
- 如果一个节点长时间没有收到其他节点的心跳信号,它就会认为自己和其他节点之间的网络连接可能已经发生问题,这就是 网络分区。
- 在发生分区时,节点可以根据检测到的网络状态,决定自己如何行动。
步骤 2:选择操作策略
在网络分区的情况下,系统必须选择一种策略:继续提供服务(可用性优先),或者暂停部分操作(一致性优先)。具体选择哪种策略,取决于系统的设计和业务需求。
-
选择可用性(AP):即使数据不一致,系统仍然会继续响应请求。这意味着系统的某一部分可能与其他部分不同步,但是不会停止服务。例如,用户在某一节点更新了数据,其他节点可能还没有收到更新,但用户仍然可以继续操作。这是现在大部分高并发的系统选择的方案,例如熟知的京东,PDD,淘宝等。但是不代表不考虑CP,追求的是最终一致性。
-
选择一致性(CP):在发生网络分区时,系统可能会暂停某些操作,直到确保所有数据一致(在超大数据量的场景下代价很高)。这种方式保证了数据在所有节点之间的一致性,但可能会导致部分服务不可用。
步骤 3:解决数据冲突(如果选择了可用性)
当系统选择保证 可用性(AP) 时,不同的分区节点可能会对同一数据进行不同的修改,导致数据冲突。在这种情况下,系统需要通过一些机制来解决数据冲突。
- 冲突解决策略:可以通过时间戳、版本号或者其他规则来决定哪个数据版本是“正确”的。
- 最后写入胜(Last Write Wins):选择时间戳更新更晚的数据版本。
- 手动解决冲突:通过管理员或者应用层逻辑来合并或选择合适的数据版本。
步骤 4:数据同步(如果选择了一致性)
如果系统选择了 一致性(CP),那么当网络分区恢复时,系统会执行数据同步过程,将分区前后不一致的数据进行同步,确保数据一致性。
- 一致性协议:比如 Paxos 或 Raft,这些协议可以帮助系统确保在网络恢复时,各个节点的数据是同步的。
- 同步数据:数据同步可能会导致延迟,系统会通过写入日志、复制数据等方式,确保数据的一致性。
步骤 5:恢复并继续操作
当网络分区恢复时,系统会重新连接失去连接的节点,并进行数据同步。根据之前的选择策略,系统将恢复操作:
- 如果选择了可用性,系统会确保服务不中断,尽管数据可能不一致,系统会继续提供服务并解决冲突。
- 如果选择了一致性,系统会暂停服务直到数据同步完成,确保数据的一致性。
5. 具体实例:Redis (AP)与 HBase(CP)
- Redis 是一个典型的 AP 系统,它在发生网络分区时,仍然会继续响应请求,允许数据在不同节点上不一致,分区恢复后会同步数据并解决冲突。
- HBase 是一个典型的 CP 系统,它会在发生网络分区时暂停部分操作,直到系统确保所有节点的数据一致性。网络恢复后,系统会同步数据,确保一致性。
6. 总结
分区容错性(P) 是指在网络分区发生时,分布式系统能够继续运行的能力。它确保即使系统的部分节点无法通信,系统的其他部分也能继续提供服务。系统必须根据实际情况做出选择:
- 可用性(AP):系统继续响应请求,可能导致数据不一致。
- 一致性(CP):系统暂停服务,直到确保数据一致性。
在设计分布式系统时,理解 分区容错性 是至关重要的,因为网络分区是不可避免的,必须采取合适的策略来保证系统的高可用性和稳定性。
相关文章:
CAP原则中的P:分区容错性(Partition tolerance)
CAP 理论概述 在分布式系统中,系统面临三大核心问题: 一致性(Consistency):所有节点的数据始终保持一致。可用性(Availability):系统始终能够响应请求,无论请求是否成功…...
校验收货地址是否超出配送范围实战3(day09)
优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。 提示: 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/)…...
【二叉树的深搜】二叉树剪枝
文章目录 814. 二叉树剪枝解题思路:深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点…...
Java 大视界 -- Java 大数据中的数据脱敏技术与合规实践(60)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s优雅重启
理论上处于terminating状态的pod,k8s 就会把它从service中移除了,只用配置一个优雅停机时长就行了。kubectl get endpoints 验证 简介 使用kubernetes启动容器时,一般都会配置一些探针来保证pod的健康,并通过terminationGracePe…...
RK3568上电启动流程详解.2 [十五]
这里我们再深入分析一下 U-Boot 启动 Kernel 的过程。 我们首先需要从 eMMC 的 boot partition 中加载 kernel Image,kernel dtb 以及 Ramdisk: > mmc partPartition Map for MMC device 0 -- Partition Type: EFIPart Start LBA End L…...
仅仅4M!windows系统适用,免费无限制使用!
软件介绍 在日常生活里,我们经常会碰到电脑运行迟缓、网速卡顿的现象,却又不清楚是哪个程序在占用过多资源。这种时候,一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢,就给大家介绍一个小巧又实用的监控工具——「T…...
SOME/IP服务接口
本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟,并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理,并结合实际代码展示 SOME/IP 的使用,旨在自我复习并与大家交流。文中引用了一些例图,但由于未能找到原作…...
计算机网络之网络层
本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 03 网络层 在网上看到其他人做了相关笔记,就不再多余写了,直接参考着学习吧。 1 详解网络层-网络层概述和编址【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51CTO博客 2 …...
WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术
一、背景&现状 创作者服务平台作为得物为社区创作者提供的PC端视频发布入口,地位非常重要。且随着功能的升级迭代,用户群体也越来越多。但我们偶尔会收到如下反馈: 视频损坏,无法播放视频模糊曝光度问题黑屏,只有…...
服务器内部是如何运行的
服务器内部的运行可以从硬件和软件两个方面来解释。 一、硬件层面 服务器的硬件与普通计算机相似,但它通常具有更高的性能和更强的扩展性。服务器硬件包括: 1.中央处理单元(CPU):负责执行服务器上的计算任务。服务器一般配备多核心的高性能CPU,以支持多个请求并行处理…...
mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用
全国地图json数据下载地址 目录 html加载全部代码 方式一:使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式,设置type加载数据类型 设置线条 鼠标移入改变颜色,设置图层属性,此处是fill-extru…...
电子应用设计方案102:智能家庭AI鱼缸系统设计
智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境,同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定,包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…...
ESP8266 OTA固件启动日志里分区解析【2M flash】
ESP8266 启动日志中分区表的内容及其解释 分区表日志: I (136) boot: Partition Table: I (147) boot: ## Label Usage Type ST Offset Length I (170) boot: 0 nvs WiFi data 01 02 00009000 00004000 I (193) boot:…...
dl学习笔记:(7)完整神经网络流程
完整神经网络流程 反向传播链式求导 代码实现反向传播动量法Momentum开始迭代为什么选择小批量TensorDataset与DataLoader 反向传播 由于本节的公式比较多,所以如果哪里写错了漏写了,还请帮忙指出以便进行改正,谢谢。 在前面的章节已经介绍过…...
三分钟简单了解一些HTML的标签和语法_01
1.图片建议建立一个文件夹如下图所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"keywords"><title>魔神羽落</title><style>.testone{background-color: #ff53e…...
C# 中使用Hash用于密码加密
通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化࿰…...
【C++高并发服务器WebServer】-2:exec函数簇、进程控制
本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...
Linux将目录挂载到另一个目录,类似软硬链接,并通过fstab实现
格式 <源> <目> none bind 0 0例如 /data/var/lib/docker /var/lib/docker none bind 0 0参数使用制表符tab间隔 效果 rootDebian12:~# cat /etc/fstab | grep -v ^# /dev/mapper/Debian12--vg-root / ext4 erro…...
【C++模板】:如何判断自定义类型是否实现某个函数
一、引子 偶尔我们会面对这样的尴尬的场景,我们需要显示的去判断在某个自定义类型中,是否已经提供了我们期待的API接口,以避免产生“莫须有”的错误。阁下该如何破解此问题! 这里,直接给出一种通用的方法,…...
关于CAN(FD)转以太网详细介绍
一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…...
GPU算力平台|在GPU算力平台部署MedicalGPT医疗大模型的应用教程
文章目录 一、GPU算力服务平台云端GPU算力平台 二、平台账号注册流程MedicalGPT医疗大模型的部署MedicalGPT医疗大模型概述MedicalGPT部署步骤 一、GPU算力服务平台 云端GPU算力平台 云端GPU算力平台专为GPU加速计算设计,是一个高性能计算中心,广泛应用…...
【ChatGPT】意义空间与语义运动定律 —— AI 世界的神秘法则
作者介绍 斯蒂芬•沃尔弗拉姆(Stephen Wolfram) 计算机科学家、数学家和理论物理学家,当今科学和技术领域重要的革新者之一。他创造了在全世界备受推崇的软件系统——Mathematica、Wolfram|Alpha和Wolfram语言。 在 ChatGPT 内部,…...
Harbor 部署教程
Harbor 部署教程 一.背景二.遇到的问题及解决办法1.服务无法启动,相关的容器不断重启 三.操作步骤1. 创建工作目录并进入2. 配置 Docker 守护进程3. 重启 Docker 服务4. 下载 Harbor 离线安装包和 Docker Compose5. 安装 Docker Compose6. 解压 Harbor 安装包7. 配置 Harbor8. …...
hive 自动检测、自动重启、记录检测日志、自动清理日志
最终效果 定时检测hive运行状态,进程不存在或者进程存在但是不监听端口的hiveserver2,自动重新拉起每次检测脚本执行的日志都会保存在log目录下.check文件,每一个月一个文件每月15日,删除2月前的检测日志开启hive自带日志输出后&…...
C++类和对象下详细指南
C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量,特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表,成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...
【算法C++】构造回文字符串问题
问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件: t 由小写字母组成,且长度与 s 相同。t 是回文字符串,即从左到右与从右到左读取相同。t 的字典序要小于 s&…...
基于java线程池和EasyExcel实现数据异步导入
基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…...
使用Layout三行布局(SemiDesign)
tips:Semi Design网址 :Semi Design 1、安装Semi # 使用 npm npm i douyinfe/semi-ui# 使用 yarn yarn add douyinfe/semi-ui# 使用 pnpm pnpm add douyinfe/semi-ui 2、引入Layout布局 import { Layout } from douyinfe/semi-ui;3、开始实现三行布局…...
缓存之美:万文详解 Caffeine 实现原理(下)
上篇文章:缓存之美:万文详解 Caffeine 实现原理(上) getIfPresent 现在我们对 put 方法有了基本了解,现在我们继续深入 getIfPresent 方法: public class TestReadSourceCode {Testpublic void doRead() …...
PHP防伪溯源一体化管理系统小程序
🔍 防伪溯源一体化管理系统,品质之光,根源之锁 🚀 引领防伪技术革命,重塑品牌信任基石 我们自豪地站在防伪技术的前沿,为您呈现基于ThinkPHP和Uniapp精心锻造的多平台(微信小程序、H5网页&…...
STM32——LCD
一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然,后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...
洛谷刷题1-3
比较巧妙,求最小公倍数,看多少个数一次循环,直接求解就好了,N的数量级比较大,一层循环也会超时,也用了点双指针的想法(归并排序) 这里很大的问题,主要是cin输入的时候遇到…...
Facebook 元宇宙与全球文化交流的新趋势
随着科技的快速发展,虚拟现实与增强现实技术逐渐成为全球社交平台的重要组成部分。Facebook(现改名为 Meta)率先将目光投向了元宇宙这一新兴领域,致力于打造一个超越传统社交媒体的虚拟空间,成为全球文化交流的新平台。…...
结构化布线系统分为六个子系统
文章目录 前言系统介绍1. 工作区子系统 (Work Area Subsystem)2. 水平布线子系统 (Horizontal Cabling Subsystem)3. 管理子系统 (Administration Subsystem)4. 干线(垂直)子系统 (Backbone Cabling Subsystem)5. 设备间子系统 (Equipment Room Subsyste…...
亿坊软件前端命名规范
在前端开发中,文件命名的重要性不言而喻。由于历史原因和个人习惯,不同的开发者在命名DOM结构、图片和CSS文件时,可能会产生不一致的情况。这不仅会导致维护成本增加,还会降低团队协作效率。因此,制定一套统一的命名规…...
单片机-STM32 IIC通信(OLED屏幕)(十一)
一、屏幕的分类 1、LED屏幕: 由无数个发光的LED灯珠按照一定的顺序排列而成,当需要显示内容的时候,点亮相关的LED灯即可,市场占有率很高,主要是用于户外,广告屏幕,成本低。 LED屏是一种用发光…...
【Qt】: QPointer详解
考古: 《Qt智能指针之QScopedPointer》 QPointer是Qt框架中的一个智能指针类,用于安全地管理QObject派生对象的指针。它的主要功能是自动将指针置为nullptr,当它所指向的QObject对象被销毁时。这在Qt应用程序中非常有用,因为QObj…...
15_业务系统基类
创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…...
C++中explicit关键字的介绍和使用详解
某一天突然发现Qt自动生成的类文件的构造函数前边都有explicit关键字,但是explicit关键字什么意思呐? 在C中,explicit是一个关键字,主要用于修饰构造函数或转换运算符,其作用是防止隐式类型转换或隐式构造行为。 下面…...
动态内存管理
本章重点 1.为什么存在动态内存分配 2.动态内存函数的介绍 3.malloc free calloc realloc 4.常见的动态内存错误 一.为什么存在动态内存分配 二.动态内存函数的介绍 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &…...
Java 中的各种锁详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
进制之间转换
「 一、十进制 二进制 」 1.十进制转二进制:一直除以2直到商为0,再反向取余数。 例:13(十进制)转1101(二进制) 2.二进制转十进制:最后一位数开始是2^0,然后一直按照指数递增的方式…...
微信小程序获取位置服务
wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…...
数据结构——实验八·学生管理系统
嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...
Linux应用编程(五)USB应用开发-libusb库
一、基础知识 1. USB接口是什么? USB接口(Universal Serial Bus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电…...
Swift语言探索:Sequence与Collection的详细解读
在Swift编程语言中,Sequence和Collection是两个非常重要的协议,它们定义了遍历和访问元素集合的方式。理解这两个协议不仅有助于我们更好地掌握Swift的集合类型,还能让我们在编写代码时更加灵活和高效。本文将详细解读Sequence与Collection&a…...
解锁C# EF/EF Core:从入门到进阶的技术飞跃
一、EF/EF Core 初相识 在.NET 开发的广阔天地中,Entity Framework (EF) 及其轻量级、可扩展、跨平台的版本 Entity Framework Core (EF Core),犹如两颗璀璨的明星,照亮了数据访问层开发的道路。它们是开源的对象关系映射器(ORM&…...
大模型搜广推?对算法工作的影响
大模型与传统应用结合的性质 长期看是一种范式革新。算力和模型定义的边界发生变化,选择生成式AI或大模型发展方向时,会不断发现新的增长曲线,目前在不断被验证。 现阶段大模型确实带来了增量信息,但推荐过程仍在原有流程基础上…...
【教程】最好的pytorch教程
文章目录 Materials for the Learn PyTorch for Deep Learning: Zero to Mastery course from: https://github.com/mrdbourke/pytorch-deep-learning/blob/main/01_pytorch_workflow.ipynb...