CAP理论
基本概念
Consistency(一致性):所有节点访问同一份最新数据的副本
Availability(可用性):每次请求都能获得非错误的响应,但是不保证获取的数据为最新数据
Partition Tolerance(分区容错性):分布式系统出现网络分区的时候,仍然能够对外提供服务
什么是网络分区
由于网络故障等原因,将一个分布式系统分割成多个不能互相通信的子系统的情况。例如,在一个分布式数据库系统中,原本相互协作的多个节点,因为网络线路被切断、网络设备故障或者网络拥塞等问题,使得部分节点之间无法进行正常的数据传输和交互,就产生了网络分区。
如图所示:客户端起初写入数据到 Server-1 中,那么这个数据按理就该同步到 Server-2 和 Server-3 中, 它们之间是相互协作的关系。如果这个时候 Server-2 出现网络故障,导致 Server-1 的同步数据无法抵达,就出现网络分区了。
网络分区可能导致以下问题:
- 数据不一致性:当不同节点无法通信时,更新在一个分区上的数据可能无法及时同步到其他分区,导致数据不一致。
- 服务不可用:如果一个节点或一个服务的依赖节点被隔离在一个分区中,那么这个节点或服务可能会变得不可用,从而影响整个系统的可用性。
- 性能下降:在网络分区情况下,系统可能需要等待分区解除,或者采用其他机制来处理分区问题,这可能会导致性能下降。
- 复杂的决策:网络分区会导致分布式系统面临复杂的决策,如何处理分区问题、何时进行故障切换、何时进行数据同步等都需要谨慎考虑。
为什么 CAP 不能同时存在
网上虽然说 CAP 理论只能三选二,现实世界只有 PA 或 PC 可保证:
- 假设一个分布式系统同时满足一致性、可用性和分区容错性。当发生网络分区,将系统分为两个分区 A 和 B。
- 如果有一个写操作在分区 A 执行,为了保证一致性,分区 B 需要在同一时间更新数据。但是由于网络分区,分区 B 无法及时得知这个写操作。如果要保证可用性,分区 B 不能拒绝读请求,那么分区 B 可能会返回旧的数据,这样就破坏了一致性。如果要保证一致性,分区 B 必须等待网络恢复或者从分区 A 同步数据后才能提供服务,这就牺牲了可用性。看来网络分区的不可避免下,让 可用性和一致性互相矛盾了。但如果我们只选择保证一致性或者可用性,那么分区容错性也就可以保证,即分布式系统出现网络分区的时候,仍然能够对外提供服务。
- 所以在分布式系统设计中,由于网络分区不可避免,必须在一致性和可用性之间做出权衡,因此 CAP 理论中只能有 PA 或 PC 两个属性共存。
没有一个分布式系统可以避免网络故障,因此通常必须容忍网络分区的出现。如果存在分区,则会有两个选项:一致性或可用性。当选择一致性而不是可用性时,如果由于网络分区而无法保证特定信息是最新的,系统将返回错误或超时。当选择可用性而不是一致性时,系统将始终处理查询并尝试返回信息的最新可用版本(即当前存储下的最新数据,绝非真正意义上的最新数据),即使由于网络分区,它无法保证信息是最新的。
当然,如果你可以保证 网络分区(P)正常的话,C 和 A 是可以同时存在的。
BASE理论
Basically Available(基本可用):分布式系统在出现不可预见的故障时,允许损失部分可用性,即保证核心功能可用
Soft-state(软状态):系统中的数据状态存在一定的过渡性,这种状态不要求一直保持强一致性,允许系统在不同节点的数据副本之间存在中间状态
Eventually Consistent(最终一致性):系统不要求在所有时刻所有数据副本都保持完全一致,但随着时间的推移,经过一系列的更新操作后,各个数据副本最终会达到一致
什么叫允许损失部分可用性呢?
- 响应时间上的损失: 正常情况下,处理用户请求需要 0.5s 返回结果,但是由于系统出现故障,处理用户请求的时间变为 3 s。
- 系统功能上的损失:正常情况下,用户可以使用系统的全部功能,但是由于系统访问量突然剧增,系统的部分非核心功能无法使用。
软状态举例说明
在分布式缓存系统中,数据可能在更新过程中处于一种既不是旧值也不是新值的中间状态。假设一个缓存节点正在从数据库更新数据,在这个过程中,缓存中的数据可能和数据库中的数据不完全一致,这就是软状态。这种状态是暂时的,系统会在后续的操作中逐渐使数据达到一致。