CAP 的原理
分布式系统的最大难点,就是各个节点的状态如何同步。
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 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。
在实际中没有完全的一致性 或 完全的可用性, 都是彼此妥协, 做到尽可能的一致性, 尽可能的可用性; 只不过有些系统可用性要求高一点, 有些系统一致性要求高一点。
评论