分布式系统、理论、协议 非常非常多, 它们多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. Valudate.js格式

    jQuery(function($) { $("#form").validate({ rules:{ username:{required:true }, Loginname:{ ...

  2. jdk的下载

    1.打开oracle的官网https://www.oracle.com/index.html 2.拖动页面到最后,找到java for developer 并点击 3. 4.拖动到最后找到java A ...

  3. web爬虫,requests请求

    requests请求,就是用yhthon的requests模块模拟浏览器请求,返回html源码 模拟浏览器请求有两种,一种是不需要用户登录或者验证的请求,一种是需要用户登录或者验证的请求 一.不需要用 ...

  4. 20164301 Exp2 后门原理与实践

    Exp2 后门原理与实践 1.实验内容  (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterprete ...

  5. 改变一下主要发博的方向吧...转scratch!

    因为expression2实在是没什么好说的,BUI,水滴鱼大佬还有其他贴吧上的大佬,实在是多得不行,我一个小人物也说不了什么,然而scratch我却可以多发发脚本,思路,美工啊等等.所以以后我就主要 ...

  6. mysql的基础用法,水一下

    #和上一篇是一起的,上一篇就是为这个做insert <blockquote>/*思考题*/ create database spj; use spj;create table s( sno ...

  7. vue对象属性监听

    对象属性监听的两种方法: 1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValu ...

  8. 集成direnv 与docker-compose 进行环境变量管理

    direnv 是一个不错的换将变量管理工具,同时日常的开发测试中我们使用docker-compose 会比较多,一般我们的玩法是 可以再docker-compose 中指定环境变量,可以通过envir ...

  9. D# 语法

    这篇文章 随意 的 记录 关于 D# 语法的想法 . template 和 interface   同时作为一等公民 D# 是程序员的语言,不需要太多包装和修饰, D# 是 简单的, 编译器 和 ID ...

  10. pycharm操作