一、理论
CAP是分布式系统理论中的一个重要概念,它指的是一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。
CAP定理表明,在一个分布式系统中,无法同时满足这三个特性:
1.1 一致性(C)
在分布式系统中的所有节点上,对于同一份数据的读操作都应该返回最新写入的值。换句话说,所有节点的数据应该保持一致。
1.2 可用性(A)
分布式系统在面对用户请求时,应该保证每个请求都能够得到响应,即系统具有高可用性。
1.3 分区容错性(P)
分布式系统应该能够继续正常运行,即使系统内部发生了网络分区(节点之间无法通信)或者消息丢失等故障。
二、为什么无法同时满足三个?
根据CAP定理,分布式系统只能满足其中的两个特性,无法同时满足三个。
因为在面对网络分区时,系统必须要做出选择,是保证一致性还是可用性。如果选择保证一致性,那么在网络分区期间,系统将无法提供服务;如果选择保证可用性,那么在网络分区期间,系统可能会返回过期的数据。
三、取舍策略
3.1 CA舍弃P
假设不考虑分区(P)的情况下,只有一个分区(副本),副本的一致性自不必说,自然是一致的;可用性方面,一个节点的写入不需要同步到其他节点,可以高效完成。
如果增加多个分区(提高分区容错性),数据的写入需要同步到多个节点(强一致性,所有节点同步成功后再返回用户),增加了同步时间和同步失败的可能性,降低了可用性;如果采用弱一致性,即写入操作在主节点成功后即返回用户结果,再通过异步方式同步到多个分区,那么会增加同步失败和数据丢失的几率,降低了一致性。
3.2 CP 舍弃A
假设不考虑可用性(A)的情况下,多个分区之间可以采用强一致性的机制,保证数据的高度一致性(要么都成功要么都失败)。比如某个分区出现了故障或者分隔,分区没有了响应,由于放弃了可用性,所以可以无限等待并不断重试直到网络恢复,分区可用后将副本数据同步到所有节点。
3.3 AP 舍弃C
不考虑一致性(C)的情况下,多个分区和副本可以提供高可用性。
分区越多,用户越能就近访问,提供响应速度;放弃了一致性后,副本的写入操作可以写入主节点成功后即可返回成功,获得高可用性,然后通过异步的方式将副本同步到多个分区节点上。