定义

在一个分布式系统(指系统中的节点互相连接并共享数据)中,当涉及读写操作时,只能保证一致性 (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. [洛谷P4617] [COCI2017-2018#5] Planinarenje

    Description \(Mirko\) 和 \(Slavko\) 喜欢一起去远足. \(Mirko\) 偏好攀登山峰,而 \(Slavko\) 偏爱山谷.因此每次他们登上一座山峰后,\(Slavk ...

  2. 网鼎杯题目“phone”--十六进制mysql注入

    注册后,即可点击查看谁的电话和我类似. 注册时有三个必填项,分别是用户名.密码和电话.电话要求必须数字. 注册个1111的电话后,点击查看,返回有1个人电话和我类似,在注册一个为1111的,返回有2人 ...

  3. Web前端-HTML、CSS、JS

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,它是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他, 这样就可以让浏览 ...

  4. Nginx-负载均衡实现解读

    负载均衡在服务端开发中算是一个比较重要的特性.因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就 ...

  5. java正则使用全记录!

    一 开坑! 场景: 将动态uri中{} 替换成 至少出现一次的任意字符进行匹配, 比如 loclahost:8080/{name}/{9527}  -> localhost:8080/.{1,} ...

  6. parzen 窗的matlab实现

    用一下程序简单实现使用parzen窗对正态分布的概率密度估计: (其中核函数选用高斯核) %run for parzen close all;clear all;clc; x=normrnd(0,1, ...

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

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

  8. Kubernetes-Ingress资源详解

    什么是Ingress #阿里云称之为ingress路由!在 Kubernetes 集群中,主要用于接入外部请求到k8s内部,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力 ...

  9. ceph问题

    问题1: [root@admin-node my-cluster]# ceph -s cluster 4ca35731-2ccf-47fb-9f06-41fae858626d health HEALT ...

  10. VS2017/19 在更新之后,.net core项目出一个500的神奇错误

    先说症状: VS 更新升级之后,如果用的是 .net core 的项目的时候,当vs升级时,.net core的sdk或者runtime有跟着升级的话,项目发布之后,覆盖dll到服务器时,会出现这个错 ...