分布式系统的 CAP 定理

分布式系统的 CAP 定理CAP定理指出,在一个分布式系统中,对于一致性、可用性、分区容错这三个特性,不可能同时满足,而是必须有所舍弃。我们设计分布式系统时,必须在三者之间(尤其是一致性和可用性之间)有所取舍和平衡。作者:王克锋出处:https://kefeng.wang/2018/07/26/distributed-cap/版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。1概述…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

CAP定理指出,在一个分布式系统中,对于一致性、可用性、分区容错这三个特性,不可能同时满足,而是必须有所舍弃。我们设计分布式系统时,必须在三者之间(尤其是一致性和可用性之间)有所取舍和平衡。

作者:王克锋
出处:https://kefeng.wang/2018/08/01/distributed-cap/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 概述

1.1 概念

CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),是分布式系统中的一个基本定理。
它指出任何分布式系统(Distributed System)中,最多具有一致性、可用性、分区容错这三个特性中的两个。
也就是说,三个特性无法兼顾,必须有所取舍。
分布式系统的 CAP 定理

1.2 历史

  • 1998年,加州大学(University of California)的计算机科学家埃里克·布鲁尔(Eric Brewer)提出该原理,并于次年出版;
  • 2000年,Eric Brewer 在的分布式计算原则研讨会(Symposium on Principles of Distributed Computing)上提出该猜想;
  • 2002年,麻省理工学院(MIT)的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为一个定理。

2 三个特性

2.0 初始状态

我们假定一个非常简易的、只有 G1/G2 两台服务器构成的分布式系统:
G1/G2 之间可以相互通信,两者都有相同的变量v,初始值都是v0。
客户端 C 与 G1/G2 都可以通信,读写操作可以从 G1/G2 中任选。

初始状态,如下图:
分布式系统的 CAP 定理

客户端读取,如下图:
分布式系统的 CAP 定理

客户端写入,如下图:
分布式系统的 CAP 定理

2.1 一致性(Consistence)

一致性是指,各节点的数据保证一致(每次成功写入之后,无论从哪个节点读取,都能读取到最新数据),相当于向所有节点的写操作是原子操作(要么全部失败要么全部成功)。一致性有三种策略(CAP指的是强一致性):

  • 强一致性:写操作完成后,后续的读操作都能看到最新数据;
  • 弱一致性:能容忍部分或全部都看不到最新数据;
  • 最终一致性:经过一段时间后,都能看到最新数据。

不一致的情形,写操作至G1,但未(或尚未)同步至G2,就从G2读读取。如下图:
分布式系统的 CAP 定理

一致的情形,写操作至G1,成功同步至G2之后,才允许进行读操作。如下图:
分布式系统的 CAP 定理

2.2 可用性(Availability)

可用性是指,每次向未崩溃的节点发送请求,总能保证收到响应数据(允许不是最新数据)。
参照前面“一致性”中的两种情形,可见一致性和可用性无法兼顾:

  • 若要保证一致性:则必须进行节点间数据同步,同步期间数据锁定,导致期间的读取失败或超时,破坏了可用性;
  • 若要保证可用性:则不允许节点间同步期间锁定,这又破坏了一致性。

2.3 分区容错(Partition tolerance)

分区容错是指,容许节点 G1/G2 间传递消息的差错(延迟或丢失),而不影响系统继续运行。
分布式系统中,必须满足 CAP 中的 P,此时只能在 C/A 之间作出取舍。

CAP 经常被误解为“三选二”,但实际上必须满足P,然后在 C/A 之间做出选择。

3 CAP 的证明

反证法。假设可以同时满足一致性、可用性、分区容错这三个特性,由于满足分区容错,可以切断 G1/G2 的连线,如下图:
分布式系统的 CAP 定理

  • 当 C 把 v1 写入 G1 后,由于可用性,G1 必须成功响应(由于 G1/G2 不通,G2 仍旧是 v0);
  • 然后,C 向 G2 读取数据,由于可用性,G2 必须成功响应,但响应的值是陈旧的 v0;
  • 可见,C 写入了 v1,但读到了 v0,没有满足一致性,可见三个特性不可能同时满足。

4 CAP 的应用

CAP 理论,被看成分布式系统(尤其是分布式存储)的理论基础。

  • 舍弃P(选择C/A):单点的传统关系型数据库 DBMS(MySQL/Oracle),但如果采用集群就必须考虑P了;
  • 舍弃A(选择C/P):是分布式系统要保证P,而且保证一致性,如 ZooKeeper / Redis / MongoDB / HBase;
  • 舍弃C(选择A/P):是分布式系统要保证P,而且保证可用性,如 CoachDB / Cassandra / DynamoDB。

对于一个分布式系统来说,CAP三者中,

  • P是基本要求,只能通过基础设施提升,无法通过降低 C/A 来提升;
  • 然后在 C/A 两者之间权衡。

一个还不错的策略是:保证可用性和分区容错,舍弃强一致性,但保证最终一致性,比如一些高并发的站点(秒杀、淘宝、12306)。最终近似于兼顾了三个特性。

5 参考资料

WikiPedia – CAP theorem
CAP理论十二年回顾:”规则”变了
An Illustrated Proof of the CAP Theorem
Gilbert and Lynch’s paper – Perspectives on the CAP Theorem

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/213560.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mse均方误差计算公式_视觉SLAM十四讲实践之真实轨迹和估计轨迹均方根误差「建议收藏」

    mse均方误差计算公式_视觉SLAM十四讲实践之真实轨迹和估计轨迹均方根误差「建议收藏」为了理解RMSE首先介绍一些统计学的概念,然后介绍SLAM领域里面的计算精度ATE和RPE的用法。中位数一组数据按大小顺序排列,位于最中间的一个数据(当有偶数个数据时,为最中间两个数据的平均数)叫做这组数据的中位数。用中位数作为一组数据的代表,可靠性不高,但受极端数据影响的可能性小一些,有利于表达这组数据的“集中趋势”。众数几组数据中出现次数最多的那个数据,叫做这批数据的众数。用众…

  • 免费版(个人家庭免费使用)xshell7 和 xftp7 下载

    免费版(个人家庭免费使用)xshell7 和 xftp7 下载xshell6、xftp6个人免费版:百度云下载地址:https://pan.baidu.com/s/19mTPpYgXo65u9SCI1IINPQ密码:9wr0安装完毕,启动时会有弹出框,关闭即可缺点:一个xshell中shell窗口个数最多四个,有限制,可以下载下面xmanager5套件,使用不受限制xmanager5[包含xshell,xftp5]:xman…

    2022年10月12日
  • 阿里云如何申请免费ssl证书_https证书部署

    阿里云如何申请免费ssl证书_https证书部署本文SSL证书相关申请管理员扫描微信公众号方式登录:https://cloud.tencent.com工作台->搜索SSL证书->申请免费证书部署申请完毕后,在列表下载证书,解压后找到tomcat文件夹,有两个文件keystorePass.txt存放秘钥,www.njpingpang.com.jks为证书。把www.njpingpang.com.jks证书放入服务器tomcat/conf文件夹下。更改server.xml文件keystorePass:keystore

  • spring源码分析-spring与tomcat整合原理

    spring源码分析-spring与tomcat整合原理

  • python中矩阵的转置_[转]Python中的矩阵转置[通俗易懂]

    python中矩阵的转置_[转]Python中的矩阵转置[通俗易懂]Python中的矩阵转置via需求:你需要转置一个二维数组,将行列互换.讨论:你需要确保该数组的行列数都是相同的.比如:arr=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]列表递推式提供了一个简便的矩阵转置的方法:print[[r[col]forrinarr]forcolinrange(len(arr[0]))][[1,4…

  • mqttnet消息推送与接收[通俗易懂]

    mqttnet消息推送与接收[通俗易懂]创建windows服务网上有很多,不多述;服务端做好后一定要写bat安装卸载文件install.bat@echo.请稍等,MqttNetServiceAddUserAndPassword服务安装启动中…………@echooff@title安装windows服务:MqttNetServiceAddUserAndPassword@sccreateMqttNetServiceAdd…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号