分布式 基本理论 CAP

时间:2021-05-28 21:49:34

谈及分布式,必然谈到 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。(不要怀疑, 这样的表述一定是 无比正确的)

C: 所有的节点的数据保持一致, 重点,具体点来说, 就是 进行任意的read操作 返回相同结果!
A: 如何保证每个节点可读可写, 重点,具体点来说, 就是 仍然可以进行任意的read,write !
P: 无论如何,保持系统可用
 
如何证明? 其中我们只需也 TM 只能保证 CP 或者AP?(别要问我如何保证P,网络故障已经发生了, 系统需要继续可用, 不能舍弃啊! 所以,P 完全没办法舍弃, 所以P 是一定要保证的, 而且是 TM “自动” 保证了的,  否则, 整个系统 都不可用, 还玩个毛啊!而且,  必须注意的是, 现在这个网络故障不能恢复的, 否则就TM 是另外一个话题了!) 
别要问我如何保证CA,除非单节点才会没有网络问题,但那TM都不是分布式系统了!
 

证明

其实 TM的贼简单,假设发生了网络分区
一、如果保证CP,那么必须就得舍弃A,为什么呢? 因为不允许 任意的写,就可以保证C。 这又是为什么呢? 两种方案,
1、所有的节点不允许写, 这个时候, 当然,所有的节点的数据都是最新而且一致的! 但不允许写,就丧失了 A ! 
2、选择其中一个分区(一般是选择比较“大” 的分区),另外的分区 则暂停使用或者丢弃,这样,只有部分节点 可读可写,从某个角度来讲, 保证了“当前选择的分区” 的C(当然, 其实当前分区的A也是可以保证的), 但是这样就丧失了 “被暂停使用的分区”的A,( 同时, 如果非要这么说的话, “被暂停使用的分区” 的 C 也丧失了! 那是不是可以说, 宏观来讲, CA 无法同时保证了呢? 是否CA 都丧失了呢?  ———— 是不是可以说 只能保证局部性的 CA? ————  这个时候TM 只能够保证P, CA 无法保证, CAP 描述的是最多两项)
 
二、如果保证AP,那么必须就得舍弃C,为什么呢? 因为允许 任意的写,那么TM无法保证所有的节点的数据是一致的啊!  因为网络问题 的存在, 系统的数据无法 “及时” 的从一个节点 复制到 另外一个节点! ( 否则, 那TM就不算是 网络问题了 !)所以这个时候无法保证C。 —— 等等, 这里, 某些同学可能还有疑问,虽然系统发生了网络问题, 但是 外部系统并不知道也不关心啊。 如果外部系统写的时候, 如果它仍然能够连接每一个节点,那么它 依次往每个节点都写 一份, 这样就保证了 我们的分布式系统的各节点 的数据 都是一致了啦,  然后随便怎么读, 都是一致的不会出现问题了啊!! —— 没错, 这样做确实是行得通的, 但TM 这已经是另外的话题了! CAP 的A 是指 外部只写入一次!
 
 
网络问题包括分区问题, 此外还有 比如 延迟 或者 超时, 或者网络断开了 等故障 或 node 问题(比如 node无响应或 down 掉)。
 
节点挂掉其实可以当做是 分区问题的特例,参考FLP。这个也很好证明,某个节点挂掉了后, 必然的,系统部分可用,只能保证局部性的 CA, 也就是说失去真正意义的 CA, 只能保证一个P。 证明完毕(这Tm 哪门子的证明。。。)
 
延迟、超时问题就不说了
 
 

总结

谈到CAP的时候, 一定要了解其前提条件( 所有的节点 都有数据备份), 基本假设(网络问题是一定考虑的, 系统也要一定要可用, 所以P TM 无法不保证)。 但是TM 网络没有的时候呢,CAP理论 TM 都没有存在的任何意义了! 所以CAP 理论其实TM 真是个 扯淡的 极容易搞晕的 无聊的 所谓的 理论。  甚至, 理论都称不上, 因为 完全无法 真正意义的 证明。 
 
P 是很难理解, 真正理解了后又TM 想骂人的
C 是很好理解的, AP 是最容易证明和理解
A 也还好,证明CP的时候呢, 需要考虑 网络问题已然发生, 不要考虑把网络恢复。 —— 我看到很多博客 说 考虑网络恢复, 我这里要骂死他们, 如果恢复了 TM 就不要讨论CAP了!
 
CAP 是说最多只能保证两项,确实, 有时候只能保证P。 P 无法舍弃。 是否可以只保证A 或者C,这种情况不存在。  所有的情况就是: P; AP; CP;CAP( 没有网络问题的时候);

CAP是非常骚的 理论, 非常扯淡、折腾人的理论。