写点什么

CAP 的原理

用户头像
满山李子
关注
发布于: 2020 年 07 月 15 日



分布式系统的最大难点,就是各个节点的状态如何同步。

CAP 定理是这方面的基本定理,也是理解分布式系统的起点。



分布式系统三个指标(1998年,加州大学的计算机科学家 Eric Brewer 提出):

  • Consistency

  • Availability

  • Partition tolerance



CAP就是这个三个单词的首字母;

这三个指标不可能同时做到, 就叫做 CAP 定理



1. Partition tolerance 分区容错



大多数分布式系统都有多个子网络, 每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在英国,这就是两个区,它们之间可能无法通信(物理线路不通, 服务器宕机了, ...)。





上图中, N1 和 N2 是两台夸区域的的服务器. N1 向 N2发一条消息, N2 可能无法收到, 在系统设计的时候, 必须考虑到这一点。



一般来说分区容错是无法避免的, 因此可以认为CAP的P总是成立的。 CAP 就是说 C 和 A 无法同时做到。



2. Consistency(一致性)



一致性(所有节点在同一时间具有相同的数据)





Client向N1发起一个写操作, 把N1中的 v1 改成为 v2,



如果Client从N1读取数据的是V2, 这是一致; 如果Client从N2读取数据还是v1 就是不一致!





为了让 N2 也能变为 v2,就要在 N1 写操作的时候,让 N1 向 N2 发送一条消息,要求 N2 也改成 v2。等N2中v1改为v2后, Client再从N2中读取数据就是N2了,这是一致。

3. Availability(可用性)



Availability (可用性),要求只要收到Client的请求,服务器就必须给出回应。

Client可以选择向 N1 或 N2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉Client,到底是 v1 还是 v2,否则就不满足可用性。



4. Consistency 和 Availability 的矛盾



一致性和可用性,不能同时成立的原因是可能通信失败(即出现分区容错)。



如果保证 N2 的一致性,那么 N1 必须在写操作时,锁定 N2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,N2 不能读写,没有可用性不。



如果保证 N2 的可用性,那么势必不能锁定 N2,所以在N1向N2同步数据时, 一致性不成立。



总之,N2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。



在实际中没有完全的一致性 或 完全的可用性, 都是彼此妥协, 做到尽可能的一致性, 尽可能的可用性; 只不过有些系统可用性要求高一点, 有些系统一致性要求高一点。



用户头像

满山李子

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
CAP的原理