CAP定理的理解

Wesley13
• 阅读 752

CAP定理

1.CAP

1.1 定义

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

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

1.2 分区容错性P

1.2.1 为什么有分区容错性

在分布式服务中,如果数据只被保存在一个节点中,如果这个节点不可达(在多个节点中,总有网络问题导致节点不可达),数据就不可以访问,这就是分区没有容错性。

1.2.2 怎么解决?

其中一个办法就是复制到多个节点上。这就是分区容错性。

1.2.3 带来了什么问题?

不同的节点之间数据的一致性问题。为了保证一致性,多个节点之间同步的时间越长,可用性就会下降。

1.3 一致性C

意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
CAP定理的理解
接下来,用户的读操作就会得到 v1。这就叫一致性。
CAP定理的理解
为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
CAP定理的理解
这样的话,用户向 G2 发起读操作,也能得到 v1。
CAP定理的理解
那么我们思考一个问题,如果G1的值已经是v1,想同步给G2时,发现G1和G2之间的网络断开,为了满足一致性,那就需要锁住G2的读写操作,这段时间内,客户端不能访问G2,没有可用性。

1.3 可用性A

1.3.1 再次思考G1和G2之间的网络断开问题

CAP定理的理解
当客户端将G1的数据更新成v1,G1要更新数据到G2,但是发现网络出错了,G2数据不能同步成最新。 这是客户端来读取G2的数据,为了满足可用性,就需要给客户端返回数据,尽管数据不是最新的。这就不满足一致性。 也就是说分区容错性P一定要满足,那一致性C和可用性A就只能二选一。那我们怎么选择呢?

1.4 AP和CP的选择

  • AP(可用性和分区容错性):这种情况一般出现在对数据一致性要求不那么高的场景下。如日志记录,数据投递等。
  • CP(一致性和分区容错性):一致性要求较高的场景,如支付、抢红包等。

1.5 一致性的再次细分

为了保证可用性,那就需要对一致性做一定的牺牲,所以一致性又有以下分类。

1.5.1 强一致

当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。

1.5.2 弱一致性

系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。

1.5.3 最终一致性

弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是一个典型的最终一致性系统。

2.参考文档

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
CAP定理与BASE理论
1\.CAP定理C:Consistency,一致性A:Availability,可用性P:Partitiontolerance,分区容错性CAP定理,指的是在一个分布式系统中,一致性、可用性、分区容错性,三者不可得兼。2\.CAP详解2.1一致性(C)指所有节点访问同一份最新的
Wesley13 Wesley13
2年前
CAP BASE ACID
CAP(理论)Consistency(一致性),数据一致更新,所有数据变动都是同步的Availability(可用性),好的响应性能Partitiontolerance(分区容错性)可靠性定理:任何分布式系统只可同时满足二点,没法三者兼顾。忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Raft分布式一致性算法整理
CAP定理1.Consistency:一致性2.Availability:可用性3.Partitiontolerance:分区容错性CAP定理指出,在异步网络模型中,不存在一个系统可以同时满足上述3个属性。换句话说,分布式系统必须舍弃其中的一个属性。对于需要在分布式条件下运行的系统来说,如何在一致性、可用性和分区容错
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这