分布式 基本理论 CAP
谈及分布式,必然谈到 CAP, CAP 已经是被说烂了的一个 话题, 绕不开, 逃不掉。 而且, 理解起来 会有些吃力。
分布式的CAP理论告诉我们 “任何一个分布式系统都无法同时满足 一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”
这样的表述, 仍然是难以理解, 说了跟没说差不多。看看其他的说明。
经典解释
、一致性 在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一直的状态。 对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是老数据(或称为脏数据),这就是典型的分布式数据不一致的情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性 、可用性 可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果"。 "有限时间内"是指,对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。另外,"有限的时间内"是指系统设计之初就设计好的运行指标,通常不同系统之间有很大的不同,无论如何,对于用户请求,系统必须存在一个合理的响应时间,否则用户便会对系统感到失望。 "返回结果"是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出队请求的处理结果,即成功或失败,而不是一个让用户感到困惑的返回结果。 、分区容错性 分区容错性约束了一个分布式系统具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。 网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络)中,由于一些特殊的原因导致这些子网络出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区。 既然一个分布式系统无法同时满足一致性、可用性、分区容错性三个特点,所以我们就需要抛弃一样: 摘抄至 https://www.cnblogs.com/szlbm/p/5588543.html
一致性(Consistency)
一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。 可用性(Availability)
可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。 分区容错性(Partition tolerance)
分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。 作者:丹之
链接:https://www.jianshu.com/p/f432665d523f
我之前的理解
分布式系统,首先必然是一个多个node (至少是大于1)的 集群系统, 对外提供统一的 服务。
C 是说, 外界 “以相同的方式” 访问( 其实就是“读”) 其中任意 一个 所有的(而不是当前仍然存活的) node,得到的 “ 服务 ” (或者说 响应, 其实Tm 就是读的数据), 应该都是一样的。 一般来说是针对这样一种情况,node1 的某个数据更新了, node1 是否能够 “ 及时” 更新, 如果是, 那么就是 一致的( 或者说“ 强一致性 ”), 否则,就是说,不一致( 或者说, “暂时的不一致”) 。因为我们只讨论存活的节点, 那么 如果有某个node down了, 是不会影响 C 的, 就是说, 不管down掉的node 的数据状态 是否 最新的, 都不要紧, 因为, 我们已经不考虑它了!!
特别说明, CAP的C 是指强一致性, 弱一致性,最终一致性, 都算是 不一致。
A 是说, 所有的node 应该都是可用的, 能够 “ 对于用户的每一个操作请求总是能够在有限的时间内返回结果 ”, ———— 这个无疑是一个非常难以理解的 骚 概念! 天啊!
什么情况下, 会出现不可用呢? node 死机了? cpu 100% ,非常繁忙? 网络问题? down了? 是不是 只是说 “ 不管发生了什么, 只要 用户当前 访问的 这个node 能够在 指定时间 响应 就是 可用 ” ? 整个 系统, 都TM 不能用了, 叫做 不满足A,。。
P 是说, 允许某些node 挂掉, 但是,需要整体上, 系统仍然能够“正常使用”。这里的正常使用, 也是个 不好清晰定义的概念 ( 一般来说,“正常使用” 是指 仍需要 满足CA, 这里似乎有点 概念 轮回了啊。。 )。 。 只可意会不可言传。。。。 其实呢, P 还是比较好理解的, P 就是说, 某些node 挂掉就挂了吧,客户端访问其他node的时候, 还是能够正常 服务就好了! 那么, 我们可能会问, 要是 客户端 正在或者 将要 访问 这个 挂掉的 node 呢? 那好办, 客户端 失败 数次后 ( 这个次数 是应该是 客户端自定义的。。), 自己切换到其他node 上去吧! ( 就是说, 你客户端, 别TM 吊死在一棵树上, TM 放聪明点。 否则 就是 你客户端的责任了!) 那么, 就是把 责任推给了 客户端?? ———— 一般来说, 分布式系统 都允许 挂掉一部分 node, 但是呢, 也不能挂掉了太多node, 否则 系统 可能就无法 有效 保证 A, 或者C 了! 一般来说, 允许 挂掉一部分 node 数, 小于 总节点数的 一半 减 1 。
什么情况是 叫做 不满足P? 就是说, 不允许 网络故障 或 node 发生错误, 如果出现 则就是 不满足P。—— 这TM 的 谁也无法保证啊!!
为什么 会出现这么个 奇怪的 困惑的 难解 的 理论? 为什么我们需要它 ? 如何证明?
用数学公式来证明 似乎是 很难的, 我们“反正”一下吧。
分布式系统为什么会有不稳定之说??? 当然, 单节点的时候 可能出现 的问题, 分布式系统 中一样都会有, 但是 分布式系统中 问题会更多, 多 一些 “分布式相关的问题”。 ———— 简单说, 最根本的问题, 就是分布式系统中 网络故障,延迟的客观 存在 的可能性。
首先, 我们需要 假设 分布式系统中 网络 故障 是 有可能发生的。 ( 我们可以假设它 现在随意的 发生),其实说来说去, 说到根本上, 网络问题是无法避免的。 除非?
然后, 假设 分布式系统中5个节点, 5个节点都TM 正常工作, 网络延迟 都非常小, 不会出现 客户端 “ 先发出的 请求, 后面才到达 ” 的问题。 那么, CAP 是不是同时都满足了呢?
CAP 理论这个时候是不是 被 打脸了??
NO, 现在来看, 上面的例子, 没有出现网络问题。 实际情况下, 不能保证 永远 不出现网络问题, 所以, 上面的情况 是片面的!说句反话, 应该这么理解, CAP 说的是 在任何情况下, 都要永远的 同时的保证的一个CAP状态,是TM 不可能的! 这么说, 大家, 是不是就 好理解 CAP 了呢??
现在就讨论网络问题情况下, 为什么TM 不能 同时保证CAP了呢?
首先P,TM 就是无法保证的, 所以证明 无法保证 CAP,—— 无法再继续证明了。。。
为了保证C, 那么我们需要保持 存活的节点 的数据是最新的,如果 如果 down掉的 node是master,
有一个问题需要 区分, 网络问题(比如 延迟 或者 超时, 或者网络断开了 等故障) 或 node 问题(比如 node无响应或 down 掉)。node响应慢 可以归为 网络延迟的一种特例。
前者引起的分布式问题是: 无法通信 或者 指令 的顺序 错位。 很显然, 这个情况 可能导致 各个node的数据不一致, 也有可能是 各node 一致, 但是不知道是否一致。 如果排除这个网络问题呢? node 之间的数据 能够恢复一致性吗?
后者引起的分布式问题是: 超时。。 很显然, 这个情况 可能导致 各个node的数据不一致。 但是如果把这些失败的node 剔除, 可以保证一致吗? 答案是 肯定的。。。 如何证明?
==============================================================================================
特别声明:我之前的理解已经过时,说了这么多,我的表述可能也有错误, 当时我还是比较懵逼
改写
我们讲CAP理论稍微改写一下, CAP 描述的是 这么一个多节点的系统,每个节点保存相同的数据备份, 现在发生了网络问题, 无论如何, 无法同时保证CAP。—— 也就是说, 这种情况下,我们只能保证C或者A, 而不能同时保证 CA。(不要怀疑, 这样的表述一定是 无比正确的)
证明
总结
CAP是非常骚的 理论, 非常扯淡、折腾人的理论。
分布式 基本理论 CAP的更多相关文章
- 分布式 基本理论 CAP 之 各分布式系统的cap支持情况
分布式系统.理论.协议 非常非常多, 它们多cap 的支持是怎么样的呢? 需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP ...
- 分布式 基本理论 CAP 2
关于P P, 即 Partition字面意思是网络分区,其实 包括了 各种网络问题, 我们要把它理解 一个 广义的 分区问题. P 涉及到了 时间, 这么说吧, 出现了分区, 那就是节点之间 “长久的 ...
- 【转】分布式理论-CAP理论
一 CAP理论简述 CAP (Consistency, Availability, Partition Tolerance,) 理论是NoSQL数据库管理系统构建的基础. 强一致性:等同于所 ...
- 分布式事务的CAP理论 与BASE理论
CAP理论 一个经典的分布式系统理论.CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition ...
- [转帖]浅谈分布式一致性与CAP/BASE/ACID理论
浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...
- 分布式数据库中CAP原理(CAP+BASE)
分布式数据库中CAP原理(CAP+BASE) 传统的ACID 1)原子性(Atomicity): 事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功. 2)一致性(Con ...
- 分布式系统和CAP
帽子理论(CAP): C:Consistency,一致性, 数据一致更新,所有数据变动都是同步的 A:Availability,可用性, 好的响应性能,完全的可用性指的是在任何故障模型下,服务都会在有 ...
- 分布式事务与Seate框架(1)——分布式事务理论
前言 虽然在实际工作中,由于公司与项目规模限制,实际上所谓的微服务分布式事务都不会涉及,更别提单独部署构建Seata集群.但是作为需要不断向前看的我,还是有必要记录下相关的分布式事务理论与Seate框 ...
- 分布式:分布式事务(CAP、两阶段提交、三阶段提交)
1 关于分布式系统 1.1 介绍 我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起.明显的弊端就是不易扩展.发布冗重.服务治理不好做. 所以我们把整个系统拆分成若 ...
随机推荐
- webpack打包和gulp打包工具详细教程
30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...
- LeetCode 922. Sort Array By Parity II C++ 解题报告
922. Sort Array By Parity II 题目描述 Given an array A of non-negative integers, half of the integers in ...
- Centos7.4下安装Jumpserver 1.0.0(支持windows组件)
0)系统环境CentOS 7.4 IP: 192.168.100.10 [root@jumpserver-server ~]# cat /etc/redhat-release CentOS Linux ...
- Exp6 信息搜集与漏洞扫描
Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现. ...
- C# 切分图片
public void Slice() { // 图片路径 var file = "F;/aaa.png"; // 水平切分 ; // 纵向切分 ; ; i < horizo ...
- [工作积累] Google Play Services
注意添加APP_ID <meta-data android:name="com.google.android.gms.games.APP_ID" android:value= ...
- Actifio中的Group和Consistency Group
多个应用程序具有相同的保护需求时可以使用应用程序组: Groups用于简化管理,将策略应用于组内的应用程序. 组中的每个应用程序的备份映像单独执行装载,克隆和还原操作. Consistency Gro ...
- c# 实现 HSV 调色板
界面相关核心代码如下: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private vo ...
- python发送短信和发送邮件
先注册好 发短信脚本内容 #接口类型:互亿无线触发短信接口,支持发送验证码短信.订单通知短信等. #账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html ...
- 面试题-Python高级
元类 Python 中类方法.类实例方法.静态方法有何区别? 类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为cls, 表示类对象,类对象和实例对象都可调用: ...