1.什么是CAP定理
一个分布式系统不可能同时满足一致性,可用性和分区容错性这三个基本需求,最多只能同时满足其中的2个。
一致性(C:Consistency) 指数据在多个副本之间能够保持一致的特性。
可用性(A: Availability) 指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。
分区容错性(P:Partition tolerance) 分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。
2.为什么不能同时满足CAP?
假设有如下一个系统:
整个系统由两个节点配合组成,之间通过网络通信,当节点 A 进行更新数据库操作的时候,需要同时更新节点 B 的数据库(这是一个原子的操作)。
上面这个系统怎么满足 CAP 呢?C:当节点A更新的时候,节点B也要更新,A:必须保证两个节点都是可用的,P:当节点 A,B 出现了网络分区,必须保证对外可用。
可见,根本完成不了,只要出现了网络分区,A 就无法满足,因为节点 A 根本连接不上节点 B。如果强行满足 C 原子性,就必须停止服务运行,从而放弃可用性 C。
组合 | 分析结果 |
---|---|
CA | 满足原子和可用,放弃分区容错。说白了,就是一个整体的应用。 |
CP | 满足原子和分区容错,也就是说,要放弃可用。当系统被分区,为了保证原子性,必须放弃可用性,让服务停用。 |
AP | 满足可用性和分区容错,当出现分区,同时为了保证可用性,必须让节点继续对外服务,这样必然导致失去原子性。 |
3.能不能同时满足CAP?
比如 C 使用弱一致性,可以先将数据存起来,稍后再更新,实现 “最终一致性”。