分布式 基本理论 CAP
谈及分布式,必然谈到 CAP, CAP 已经是被说烂了的一个 话题, 绕不开, 逃不掉。 而且, 理解起来 会有些吃力。
分布式的CAP理论告诉我们 “任何一个分布式系统都无法同时满足 一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”
这样的表述, 仍然是难以理解, 说了跟没说差不多。看看其他的说明。
经典解释
1、一致性 在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一直的状态。 对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是老数据(或称为脏数据),这就是典型的分布式数据不一致的情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性 2、可用性 可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果"。 "有限时间内"是指,对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。另外,"有限的时间内"是指系统设计之初就设计好的运行指标,通常不同系统之间有很大的不同,无论如何,对于用户请求,系统必须存在一个合理的响应时间,否则用户便会对系统感到失望。 "返回结果"是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出队请求的处理结果,即成功或失败,而不是一个让用户感到困惑的返回结果。 3、分区容错性 分区容错性约束了一个分布式系统具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。 网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络)中,由于一些特殊的原因导致这些子网络出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区。 既然一个分布式系统无法同时满足一致性、可用性、分区容错性三个特点,所以我们就需要抛弃一样:
摘抄至 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是非常骚的 理论, 非常扯淡、折腾人的理论。