CAP理论
简介
由计算机科学家 Eric Brewer提出。其观点为,在分布式计算机系统中不可能同时保证以下三个功能。
- 一致性(Consistency): 同一时间系统中能提供服务(正常工作)的节点的数据是相同的。
- 可用性(Availability): 系统中的所有节点都是可用(提供服务)的,收到请求后都会得到响应并且正常提供服务。
- 分区容错性(Partition Tolerance): 将系统的一些节点与其它节点相隔离(可看做网络故障,节点之间无法同步更新了),整个系统仍能继续服务(即至少保证有一个节点在提供服务)。
CAP理论认为在分布式系统中,无法同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)三个特性的原因是因为网络通信的不可靠性和延迟。
在一个分布式系统中,节点之间的通信是通过网络进行的。由于网络的不可靠性和延迟,节点之间可能会发生通信失败、消息丢失、延迟过高等问题。为了保证一致性,需要在节点之间进行数据同步和协调,确保所有节点具有相同的数据副本。但是,当发生网络分区或节点故障时,节点之间无法通信,无法进行数据同步和协调,从而无法保证一致性。
如果系统追求强一致性,即在任何时间点,系统中的所有节点都具有相同的数据副本,那么在网络分区或节点故障的情况下,必须暂时停止服务或降低可用性,等待问题解决后再继续提供服务。这样会导致系统不可用的时间延长,影响系统的可用性。
相反,如果系统追求高可用性,即在任何时间点,系统都能够继续提供服务,那么在网络分区或节点故障的情况下,可能会导致数据的不一致性。因为在分布式系统中,为了保证高可用性,可能会允许部分节点独立处理请求,而不进行数据同步和协调。这样会导致数据在不同节点上的副本出现差异,破坏了一致性。
而分区容忍性是指分布式系统可以在网络分区的情况下继续运行。即使某些节点无法与其他节点通信,系统仍然可以正常工作。为了实现分区容忍性,系统必须允许部分节点独立运行,但这可能会导致数据的不一致性。
因此,由于网络的不可靠性和延迟,CAP理论认为在分布式系统中无法同时满足一致性、可用性和分区容忍性三个特性。在设计分布式系统时,需要根据具体的需求和场景,权衡这三个特性,并选择适合的设计方案。
那么实际应用中,对于某个具体的系统,只有妥协三者中的某部分。下面介绍三种CAP模型
牺牲分区(CA模型)
想要系统在网络分区时(部分子节点网络不通的时候)也能正常工作,带来那么多问题,那么就不分呗,然而如果不分的话,这还算分布式系统吗?显然不是。
他也失去了分布式系统最重要的伸缩性,冗余性。
CA常见例子:
- 单站点数据库
- 集群数据库(将一组服务器在一起形成集群,当出现问题就一起崩了)
牺牲可用性(CP模型)
部分子节点网络不通,该部分节点的请求失效就失效吧,放弃一定的请求成功。整个系统来说有部分节点还在继续工作,只是暂停了部分损坏节点的问题,可以通过隔离损坏节点来减少损失。
- 分布式数据库
- 绝大多数协议
实现方式:
- 悲观锁
- 少数子节点不可用(然后将其隔离避免无效请求)
牺牲一致性(AP模型)
部分子节点网络不通,没关系,不理它,反正早晚会通的,到时候不就一致了么,现在不一致也不打紧。
- Web缓存
- DNS
实现方式:
- 乐观
- 到期/租赁