CAP定理是埃里克·布鲁尔(Eric Brewer)在2000年的ACM PODC上提出的一个猜想。
2002年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)对这个定理进行了证明
CAP的理论中指出,一个分布式系统是不可能同时满足一致性(C)、可用性(A)和分区容错性(P)三个基础需求,最多只能同时满足其中的两项。
什么是CAP
C:一致性
分布式环境中,保持一致性意味着数据在不同副本之间保持相同。
一致性要求系统对某一数据进行修改后,一个客户端进行读操作要能保证返回最新的写入结果。
当数据副本分布在不同节点的系统中,如果节点A进行了数据更新,但节点B获取到的仍是旧数据,这将导致数据不一致的情况。
理想情况下,在A完成数据修改后,其他所有节点都应该能够获取到最新的数据。
当系统内部发生问题导致节点无法实现一致性变化时,可能会导致读取请求获取到旧数据或者不同版本的数据。
为了确保分布式系统对外部的数据一致性,有时可能会选择不返回任何数据。这种情况下,系统可能会采取暂时性的数据屏蔽措施,以避免向外部返回不一致或错误的数据。
这种行为旨在维护整个系统的数据一致性,尽管在某些情况下可能会牺牲一部分可用性,但能够确保外部获取的数据是可靠和一致的。
A:可用性
可用性是指非故障节点能够在合理的时间内返回合理的响应,而不是错误或超时的响应。
合理的时间指的是系统在特定时间内能够返回相应的处理结果,若超出设定的时间,则系统被视为不可用。合理的时间是由业务来定的。
返回的响应指系统在完成请求后能够给出正确的响应结果。正常的响应通常清晰地反映了请求的结果,即成功或失败。
P:分区容忍性
分区容忍性是指系统在出现网络分区后依然能够继续履行其职责。
网络分区:在分布式系统中,不同的节点分布在不同的子网络中,由于某些特殊原因导致各个子网络之间无法相互通信,但各自子网络内部的节点可以相互通信,从而使整个网络系统被划分为多个孤立的区域。
所以,即使出现分区问题,整个分布式系统依然要正常工作
CAP的选择
一般来说,P是必然要选择的,不能说一旦出现分区错误整个系统就报废了
C 和 A 的选择说白了就是:想保障外部还是内部
保障外部那就选A,要实现系统的可用性
保障内部那就选C,实现系统的一致性
常见误区
CAP是针对整个分布式系统的,整个系统要么选A,要么选C
CAP理论的权衡在实际系统设计中可能会变化。具体的操作、特定的数据以及个别用户造成的需求差异都可能导致对一致性和可用性(C与A)的微妙权衡反复出现。
CAP理论的定义和解释往往被说成针对整个分布式系统的,这种观点其实是错误的,这让很多人认为整个系统必须选择CP或者AP。
然而,在实际设计过程中,每个系统处理多种数据类型,有些数据要求CP,而有些数据要求AP。如果从整个系统的角度去选择CP还是AP,可能会导致矛盾和问题。
举个例子,在一个简单的用户管理系统中,用户账号数据(如用户ID、密码)这些必须是强一致的,就要考虑CP,而用户信息数据(如昵称、兴趣、爱好)通常选择AP。
如果将整个系统限定为CP,则不符合用户信息数据的应用场景;反之亦然。
因此,在CAP理论实践中,我们需要根据数据的应用场景和要求对系统内的数据进行分类,为每类数据选择不同的策略(CP或AP),而不是强制整个系统所有数据都采取同一策略。
C 是完全保证一执性的
CAP理论未考虑网络延迟。在一致性理论中,并未考虑同步延迟,例如在一个事务提交后,所有数据节点立刻就能同步。然而在实际场景中,从A服务器同步到B服务器必然需要一定时间间隔,尤其是跨机房数据同步,可能需要耗费更长的时间。因此在实际开发中,即使这个时间很短,C在CAP理论中可能无法得到保证,存在数据的短暂不一致。
我们只能在 C 和 A 当中选择一个来进行保障
CAP理论告诉我们在出现分区故障的时时候需要做好提前准备,所以我吗只能在三者中取两个,在分区故障中“牺牲”C或A。但是分区不可能一致故障,因为在系统整个运行周期中,大部分时间都是正常的,分区现象的时间并不长。
BASE理论
BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
基本可用
当系统出现故障时,可以允许失去一部分可用性(但是不是不可用)
比如:之前系统的响应时间是0.1s,那先允许1s进行响应;或者在高峰期时,系统不能正常响应,那就给用户返回一个提示的界面
软状态
软状态指的是:允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性。
数据在某一时刻并不是强一致的,但最终会趋向于一致
最终一致性
系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。
举个简单的例子,假设一份数据在分布式系统中有多个副本,并且系统保证最终一致性。当某个客户端对数据进行更新时,更新可能只会立刻影响到其中一个副本,而其他副本则可能在一段时间内仍保持旧值。系统会异步地通过数据同步的方式,逐渐使得所有副本的数据达到一致状态。在最终一致性的策略下,系统会尽量保证这一过程的快速完成,使得用户在实际使用时感知不到明显的延迟或数据不一致。
END
本文介绍了 CAP 理论以及其延伸出来的 BASE 理论,希望让你有所收获