定义

在一个分布式系统(指系统中的节点互相连接并共享数据)中,当涉及读写操作时,只能保证一致性 (Consistency)、可用性 (Availability)、分区容错性 (Partition Tolerance)三者中的两个,另外一个必须被牺牲。

  • 一致性:CAP中的C和ACID 中的C不是一个含义,ACID 中的C是指数据库中的数据满足一定的约束条件。而CAP中的C是指线性一致性,即:客户端向系统写入什么,那么读出来的也会是什么。也就是要保证客户端读取到的数据一定是上次写入的最新数据。
  • 可用性:指系统中的部分节点出现故障后,系统能否还能对外提供完全可用的服务;
  • 分区容错性:指是否允许系统中的节点之间无法通信,也就是无法互相连接;

适用场景

那么什么样的分布式系统是节点之间互联并共享数据呢?

典型的场景就是数据库的主从集群,一个数据库集群有一个主,多个从,主从之间会进行数据复制。所以适用于CAP原理。

那么如果我现在是一个Redis的集群,集群中每台机器存储不同的数据,集群中每台机器不需要复制和传递数据,那么就不属于CAP原理的讨论范围。同理,如果是A,B两个不同的业务系统,比如招行账号A给工行账号B转账100元,由于招行和工行是两个不同的业务系统,业务上隔离,且他们之间也没有共享的数据,从而也不属于CAP原理的讨论范围。

场景方案选择

  • 传统数据库主从集群:如果当前是一个现在是一个主从复制的数据库集群,同一条数据会在主从数据库上都存储,那么当存在主从数据库之间网络断开时,我们确实只能要么选择A放弃C,要么选择C放弃A。选择A放弃C,就是客户端读取到的可能不是最新的数据,但是系统持续可用;选择C放弃A,就是让系统服务不可用,客户端自然就不会认为数据不一致了。
  • 分布式数据库,如阿里的OceanBase,这种数据库也是一个主从的集群,但是主从节点往往使用Paxos/Raft等副本一致性协议,做到整个数据库系统,在部分节点发生故障时,也能在很短的时间内自动重新选主,选出一个新的主从集群的数据库系统。在重新选主的过程中,系统不可用,相当于放弃了A,而一旦选出新的主之后,系统又继续可用,且数据对外是线性一致的。相比传统的数据库主从集群,分布式数据库由于可以在遇到网络分区导致数据库主从节点之间无法互联时,可以快速选出新的主,然后快速恢复,所以架构设计上和用户体验上,要好很多。但是系统设计的复杂度也非常高。

分布式事务

通过上面的分析,我们知道CAP中的数据一致性,本质上是为了维护同一个数据的不同副本之间的一致性。而更多的时候,我们要解决的是不同业务系统之间的数据一致性,即数据之间总是应该满足规定的业务规则。典型的场景比如有跨行转账、订单和减库存。这种场景,由于没有数据共享的特征,所以不适用于CAP。比如A银行的账户给B银行的账户转账100元,那么转账前后,两个账户的钱加起来应该不变。也就是A扣款了,B就必须加款。那么这种场景如何解决呢?一般的做法是采用分布式事务,常见的分布式事务的解决方案有:2PC\3PC、TCC、基于分布式MQ+本地消息、分布式MQ事务消息、Sagas。

CAP原理的更多相关文章

  1. NOSQL数据模型和CAP原理

    NOSQL数据模型和CAP原理 http://blog.sina.com.cn/s/blog_7800d9210100t33v.html 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoS ...

  2. [转]CAP原理与最终一致性 强一致性 透析

    在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick).在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子.CAP原理中,有三个要素: 一致性 ...

  3. CAP原理的证明

    CAP概述 C: Consistency 一致性 A: Availability 可用性 P:Partition Tolerance分区容错性 CAP理论的核心是:一个分布式系统不可能同时很好的满足一 ...

  4. CAP原理、一致性模型、BASE理论和ACID特性

    CAP原理 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Con ...

  5. 在分布式数据库中CAP原理CAP+BASE

    本篇博文的内容均来源于网络,本人只是整理,仅供学习! 一.关系型数据库 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (At ...

  6. 大数据 --> CAP原理和最终一致性

    CAP原理和最终一致性 CAP原理和最终一致性(Eventually Consistency)

  7. CAP原理中的一致性

    CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾.因此在进行分布式架构设计时,必须做出取舍.而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值.因此设计分布式数据系统,就是在 ...

  8. 对CAP原理的理解

    对CAP原理的理解 CAP原理按照定义,指的是C(Consistency)一致性,A(Availability)可用性,P(Partition tolerance)分区容错性在一个完整的计算机系统中三 ...

  9. Nosql数据库的四大分类及分布式数据库CAP原理

    1. Nosql数据库的四大分类 2. 分布式数据库CAP原理 2.1 关系型数据库事务遵循的ACID规则 首先了解传统关系型数据库事务遵循的ACID规则: 原子性(Atomicity):事务里的所有 ...

  10. Redis_NoSql分布式数据库CAP原理

    前文简单介绍了NoSql数据库的四大分类以及常用的数据库技术,本文简单介绍分布式数据库CAP原理. 一.传统的CAID是什么 1. A(Atomicity)原子性:事务里的所有操作要么全部做完,要么都 ...

随机推荐

  1. 编程基础系列--之--浅谈List、Set、Map和泛型(一)——单列集合

    之前在学习Java时对于泛型,集合的理解一直模模糊糊,随着时间的推移,对泛型和集合有了一些浅显的认知,打算写出来巩固一下,也希望各位大佬能指出理解不当之处,万分感谢!!! 在Java语言中,集合分为两 ...

  2. Redhat下如何查看nvidia显卡的工作状况

    安装完毕nvidia显卡驱动后,可以使用命令来查看显卡的工作状况,命令如下: nvidia-smi 输入上述命令后,显示界面如下 安装nvidia显卡驱动的步骤,请参照驱动安装cuda和cudnn.

  3. 18年第一弹射 和网络有关; 艾曲塞嗯诶系列篇 san

    62: 管理员想要更新 AR2200路由器的VRP, 正确的方法: 1)管理员把 AR2200 配置为FTP客户端,通过FTP来传输VRP软件 2)管理员把AR2200 配置为FTP服务器,通过FTP ...

  4. Java学习笔记(二) 面向对象---构造函数

    面向对象---构造函数 特点 函数名与类名相同 不用定义返回值类型 不写return语句 作用 对象一建立,就对象进行初始化. 具体使用情况 class Student { Student(){ Sy ...

  5. Dynamics CRM Package Deployer 部署工具

    CRM 部署工具非常有用 我们可以用部署工具来做迁移,部署 等等.  Package Deployer可以同时部署多个solutions. 并且也可以勾选solution的plugin也同时部署. 三 ...

  6. BeautifulSoup标签定位方法总结

    首先说明一下两个基本函数 .find() 和 .findAll(). find()返回第一个符合要求的标签 findAll()返回一个由所有符合要求的标签组成的列表.除此之外基本相同. 0.直接定位 ...

  7. Java8新特性一点通 | 回顾字符转日期&JoinArray使用

    StringToDate日期转换 Join Array使用 StringToDate日期转换 Convert string to date in ISO8601 format 利用LocalDate. ...

  8. Fst指数说明

    群体遗传学--Fst指数,即群体间分化指数,用于群体间分化分析. 群体遗传学中衡量群体间分化程度的指标有很多种,最常用的就是Fst指数.Fst指数,由F统计量演变而来.F统计量(FIS,FIT,FST ...

  9. windows下使用pycharm配置python的virtualenv环境

    环境:win10 python2.7.10(64) 在path中配置python环境 注意:我这边的环境是py2和py3共存的,但是我这边默认使用的是py2. 在virtualenv环境中安装指定的p ...

  10. Python报错:PermissionError: [Errno 13] Permission denied

    问题分析: 错误产生的原因是文件无法打开,可能产生的原因是文件找不到,或者被占用,或者无权限访问,或者打开的不是文件,而是一个目录. 问题解决: 1.检查对应路径下的文件是否存在,且被占用.如果文件不 ...