分布式系统、理论、协议 非常非常多, 它们多cap 的支持是怎么样的呢?

需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP,另外某个时刻 又变成了支持AP 等等等

角色不是一成不变的。CAP 的出现是2000 年, 现在差不多18年过去了,当时的 论点,在现在看来, 可能就是不充分, 有问题的! CAP 的“三选二” 争议非常大,很多专家认为它是一个伪命题。

CAP 的关键论据其实是说,发生网络问题的时候,节点之间的“数据复制” 是无法迅速完成的。 其实这不就是废话吗?这是不证自明的!

我们看看各分布式系统的大致的 cap支持情况。

CA without P:

如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,CA系统基本上是单机系统,比如单机数据库。2PC是实现强一致性的具体手段。

CA without P 其实表明了 不能出现 任何网络问题 (包括了 节点失败), 一旦出现 那么 系统就整个不可用了。 对于单点系统来说, 其实是没有网络问题的,P 可以理解为 单点失败。 单点故障问题, 其实 就是  P 的问题。 反过来说,能够保证P, 那么 就不会有 所谓的 单点问题了!!

说明一下:

单机数据库 容易保证AC, 但 出现网络问题,那么系统 将不可用,这个容易理解。 但 集群数据库呢?

LDAP 好像是也是单机系统。LDAP 不允许任何的网络问题, 否则LDAP 系统整体都不可用。

xFS 不太理解。

2pc 任何一个节点失败或者出现网络问题, 那么肯定的 整体都不可用了。 (3pc 呢?  允许phase3 的时候 协调者挂掉?) 怎么说呢, 要求强一致性C,同时又要求整体可用, 那么就必然失去了A。而 对于2pc 和3pc 来说,其实可以说A 是P 的基础之上的,只要失去部分A, 那么P 也就没有了意义! 因为 我们需要所有的节点 都返回Yes 才会继续commit, 否则 一概 rollback。 所以 AP 必然是同时的失去。 这种情况下,C 确实是可以保留的,但是它也就没有了意义。

缓存验证协议? 不好理解

CP without A:

如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。

说明一下:

分布式数据库,选择了C即一致性,出现网络问题的时候,会导致系统不可用即 牺牲了 A, 这个具体怎么回事呢? 这里的分布式数据库 特指 Redis, MongoDB,HBase,当主节点出现网络问题的时候,整体失去了写的功能,即失去了A,但是从节点仍然是可以 读的,故C 保留了。不知道这么理解对不对。 另外, 我认为 这个仅仅是针对主节点down 掉的情况,如果 剩余的从节点 重新选举呢? 如果出问题的是 某个从节点呢?如果Redis系统中有多个主节点呢? 所以, 上面的图, 实在太笼统了,很多情况根本没说明, 不可当真!应该按照实际部署 和 软件本身提供的功能来看,绝不能一概而论,简单的说,Redis 就是CP。

  • CA:传统Oracle、mysql数据库
  • AP:Tokyo Cabinet、SimpleDB、couchDB、Riak
  • CP:redis、mongodb

分布式锁: 为什么它也是CP? 不好理解

多数决定协议:?不好理解

AP wihtout C:

要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。—— 这句话我觉得有问题,前面我们已经看到了 Redis, MongoDB 属于 CP 的成分更多一些。 当然,这种分类其实意义不大。

特别的说一下DNS,DNS 肯定是AP!为什么是AP的?其实还是比较好理解的, 当一个DNS 网络出现网络问题的时候,出现问题的小分区,和 大分区都是 仍然保持读写的,即保持可用。 那么C 就必然的失去了! 因为我们一般来说 要求DNS 容错,然后又要求继续提供服务( DNS 可以通过其内部的缓存继续进行 服务,DNS 解析不了新地址,其实也不是什么大不了的事情,  因为普遍来说, 我们对DNS 解析错误容忍度 非常高,  也就是要求其 有很好的 容错性能!)!  我记得曾经有一个面试官跟我说过, DNS 就是这个星球上 最大的 分布式系统。 好像挺有道理哦!~~~

这里我们可以再次看到,P 和 C 是 直接对立的, P 发生的那一刻,C 就其实已经失去了,  除非采取某些 措施, 但是其实可以说, 不管采取什么措施 C 都是无法完全 恢复的, 从而只能是 恢复部分的 C , 除非失去所有的A !

所以 我们常常需要在A 和C 之间做个权衡 或者取舍,不要完美的AP,也无法满足完美CP。完美C就必然完全失去所有C,完美A就必然完全失去部分C。 可以做到的是,牺牲A 越多,保留的C 越多,反之保留A 越多,那么失去的的C 越多。 前面说的是网络分区的情况下,另外 如果是 某个节点挂掉了, 那么无论如何, 无法保证完美C 和A, 因为那个节点 上的 所有的 功能(包括A和C) 都一起完全的 失去了。

我们可以不要完美的AP 或者CP;而是根据使用的业务场景,保留完美P, 然后保留部分的 A 和 保留部分的 C。 —— 这就是所谓的 软状态!

最后, 多说一句,现在的分布式系统应用场景复杂, 功能也支持越来越多,单纯的讨论其 是AP 还是CP, 我认为意义不大了,这种分类其实意义不大 !

参考:

https://blog.csdn.net/wireless_com/article/details/79153643

分布式 基本理论 CAP 之 各分布式系统的cap支持情况的更多相关文章

  1. 分布式系统之CAP理论杂记[转]

    分布式系统之CAP理论杂记 http://www.cnblogs.com/highriver/archive/2011/09/15/2176833.html 分布式系统的CAP理论: 理论首先把分布式 ...

  2. 分布式系统之CAP理论杂记

    分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.● 可用性(A):在集群中一部分节点故障后,集群整体是否 ...

  3. 分布式系统的CAP理论

    一.CAP理论概述 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项. 二.CAP ...

  4. 重温分布式系统的CAP理论

    1. CAP理论的历史 2000年7月,Eric Brewer教授提出CAP猜想:2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP:之后,CAP理论正式成为分布式计算领域的 ...

  5. 分布式系统:CAP理论

    无论你是一个系统架构师,还是一个普通开发,当你开发或者设计一个分布式系统的时候,CAP理论是无论如何也绕不过去的.本文就来介绍一下到底什么是CAP理论,如何证明CAP理论,以及CAP的权衡问题. CA ...

  6. 分布式系统:CAP 理论的前世今生

    CAP 理论是分布式系统设计中的一个重要理论,虽然它为系统设计提供了非常有用的依据,但是也带来了很多误解.本文将从 CAP 诞生的背景说起,然后对理论进行解释,最后对 CAP 在当前背景下的一些新理解 ...

  7. 看完这篇,保证让你真正明白:分布式系统的CAP理论、CAP如何三选二

    引言 CAP 理论,相信很多人都听过,它是指: 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance) ...

  8. 分布式_理论_01_CAP定理

    一.前言 五.参考资料 1.分布式理论(一) - CAP定理——零壹技术栈 2.分布式理论(一) —— CAP 定理——莫那一鲁道 3.分布式系统理论基础 - CAP 4.分布式系统的CAP理论

  9. 分布式系统之CAP原理

    参考链接:http://blog.csdn.net/wireless_com/article/details/79153643 CAP是什么? CAP理论,被戏称为[帽子理论].CAP理论由Eric ...

随机推荐

  1. MyBatis-Spring开发记录贴(新手)

    初学MyBatis-Spring,发个帖子记录一下自己的学习历程,先写个自己的编程步骤. 1.先进行数据库设计. 2.根据所设计的数据,写出相应的POJO,并写出setter和getter方法. 3. ...

  2. Go语言极速入门手册.go

    Github: https://github.com/coderzh/CodeTips /* gotips_test.go: Golang速学速查速用代码手册 Source: github.com/c ...

  3. Mysql逆向工程效率神器之使用IDE自动生成Java实体类

    Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Windows→Dat ...

  4. PythonStudy——枚举 enumerate

    # 给可迭代器对象及迭代器对象添加迭代索引 s = 'abc' for v in enumerate(s): print(v) # (0 'a') | (1 'b') | (2 'c')

  5. 给jumpserver双机配置glusterfs共享复制卷

    为什么要使用glusterfs呢. 本身Haproxy+Keepalived对jumpserver进行了负载均衡和反向代理.但是真实的视频只会存储在一个节点上 否则播放视频的时候会出现找不到的情况 为 ...

  6. 单机版Kubernetes集群(一)

    环境:CentOS Linux release 7.4.1708 (Core)   单机版Kubernetes集群的效果,如图: 1)JSP页面通过JDBC直接访问Mysql数据库并展示:这里只是为了 ...

  7. AR图像识别 AR识别图像 AR摄像头识别 外包开发 AR识别应用开发就找北京动点软件

    当绝大多数手机厂商还在追求后置双摄拍照的时候,已经有人开始潜心研究AR手机了.刚刚结束的美国消费电子展上,华硕发布了全新的ZenFone AR手机,配备5.7英寸2K屏.骁龙821处理器.8GB内存, ...

  8. RN 时间戳

    let curTime = Date.now(); 获取到当前时间 curTime: 1555120690696 是指从1970.1.1到现在的毫秒(ms)数 cxk() { //之前时间 let p ...

  9. Indent Guides插件格式代码

    vs开发工具实用性插件 一.   在开发遇到过很多括号缩近的,很是头疼,于是上网收了一下,希望对大家有所帮助. 第一款插件:Indent Guides 这款插件是给代码块增长对齐线,以标识匹配的花括号 ...

  10. js任意数组按下标相加

    let a=[1,2,3], b=[4,5,6]; let s = a.map(function(v, i) { return v + b[i]; }); console.log(s);