浅谈 CAP 理论
2016-02-29 09:31
288 查看
摘要: 本文介绍了介绍了分布式系统著名的 CAP 理论。什么是 CAP 理论?为什么说 CAP 只能三选二?了解 CAP 对于系统架构又有什么指导意义?本文将一一作答。
原文同步至 <http://waylau.com/cap-theorem/>
本文介绍了介绍了分布式系统著名的 CAP 理论。什么是 CAP 理论?为什么说 CAP 只能三选二?了解 CAP 对于系统架构又有什么指导意义?本文将一一作答。
在计算机科学理论,CAP 定理(也称为 Brewer 定理),是由计算机科学家 Eric Brewer 提出的,即在分布式计算机系统不可能同时提供以下全部三个保证:
一致性(Consistency):所有节点同一时间看到是相同的数据;
可用性(Availability):不管是否成功,确保每一个请求都能接收到响应;
分区容错性(Partition tolerance):系统任意分区后,在网络故障时,仍能操作
上面的图显示了在一个网络中,N1 和 N2 两个节点。他们都共享数据块 V,其中有一个值 V0 。运行在 N1 的 A 程序可以认为是安全的、无 bug、可预测的和可靠的。运行在 N2 是 B 程序。这个例子中,A 将写入 V 新值,而 B 从 V 读取值
系统预期执行下面的操作
首先写一个 V 的新值 V1
然后消息(M)从 N1 更新 V 的拷贝到 N2
现在,从 B 读取将返回 V1
如果网络是分区的,当 N1 到 N2 的消息不能传递时,执行上面的第三步,会出现虽然 N2 能访问到 V 的值(可用性),但其实与 N1 的 V 的值已经不一致了(一致性)。
举例:
单站点数据库
集群数据库
LDAP
xFS 文件系统
实现方式:
两阶段提交
缓存验证协议
举例:
分布式数据库
分布式锁定
绝大部分协议
实现方式:
悲观锁
少数分区不可用
举例:
Coda
Web 缓存
DNS
实现方式:
到期/租赁
解决冲突
乐观
"Brewer's CAP Theorem", julianbrowne.com, Retrieved 02-Mar-2010
原文同步至 <http://waylau.com/cap-theorem/>
本文介绍了介绍了分布式系统著名的 CAP 理论。什么是 CAP 理论?为什么说 CAP 只能三选二?了解 CAP 对于系统架构又有什么指导意义?本文将一一作答。
什么是 CAP 理论
在计算机科学理论,CAP 定理(也称为 Brewer 定理),是由计算机科学家 Eric Brewer 提出的,即在分布式计算机系统不可能同时提供以下全部三个保证:
一致性(Consistency):所有节点同一时间看到是相同的数据;
可用性(Availability):不管是否成功,确保每一个请求都能接收到响应;
分区容错性(Partition tolerance):系统任意分区后,在网络故障时,仍能操作
为什么说 CAP 只能三选二
下面分别举例说明了为什么说 CAP 只能三选二。上面的图显示了在一个网络中,N1 和 N2 两个节点。他们都共享数据块 V,其中有一个值 V0 。运行在 N1 的 A 程序可以认为是安全的、无 bug、可预测的和可靠的。运行在 N2 是 B 程序。这个例子中,A 将写入 V 新值,而 B 从 V 读取值
系统预期执行下面的操作
首先写一个 V 的新值 V1
然后消息(M)从 N1 更新 V 的拷贝到 N2
现在,从 B 读取将返回 V1
如果网络是分区的,当 N1 到 N2 的消息不能传递时,执行上面的第三步,会出现虽然 N2 能访问到 V 的值(可用性),但其实与 N1 的 V 的值已经不一致了(一致性)。
CAP 常见模型
牺牲分区(CA 模型)
举例:
单站点数据库
集群数据库
LDAP
xFS 文件系统
实现方式:
两阶段提交
缓存验证协议
牺牲可用性(CP 模型)
举例:
分布式数据库
分布式锁定
绝大部分协议
实现方式:
悲观锁
少数分区不可用
牺牲一致性(AP 模型)
举例:
Coda
Web 缓存
DNS
实现方式:
到期/租赁
解决冲突
乐观
CAP 的意义
在系统架构时,应该根据具体的业务场景,来权衡 CAP。比如,对于大多数互联网应用来说(如门户网站),因为机器数量庞大,部署节点分散,网络故障是常态,可用性是必须需要保证的,所以只有舍弃一致性来保证服务的 AP。而对于银行等,需要确保一致性的场景,通常会权衡 CA 和 CP 模型,CA 模型网络故障时完全不可用,CP 模型具备部分可用性。参考引用
Eric Brewer, "Towards Robust Distributed Systems""Brewer's CAP Theorem", julianbrowne.com, Retrieved 02-Mar-2010
相关文章推荐
- 再谈谈注冊(本质是建立映射)与回调
- C语言_循环语句
- aspcms安装所遇到的问题
- exec
- Android - 计时器
- javascript面试题_2
- 使用vector创建一个二维数组(一)
- 部分上传app store的解决方式(提示Missing ios distribution signing identity 和Missing 64-bit support)
- 语不惊人死不休(171) 人是自己身体的主人
- C++ Super-FAQ 『Deconstructor』
- C语言_运算符的优先级
- ajax 请求二进制流 图片
- 【代码笔记】点击搜索按钮,或放大镜后都会弹出搜索框
- Google Java Style 编程风格指南 中文版
- Windows句柄
- Hadoop Yarn 框架原理及运作机制
- iOS下的实际网络连接状态检测
- 【代码笔记】点击搜索按钮,或放大镜后都会弹出搜索框
- Nagios+NRPE安装备忘录(一)
- 传统解析xml的方式