指的是在一个分布式系统中, 一致性 (Consistency)、 可用性 (Availability)、 分区容错性 (Partition tolerance)。CAP 原则指的是,这三个 要素 最多只能同时实现两点,不可能三者兼顾。
- 一致性:在集群中,各个节点的数据要保持一致, 在同一时刻每个节点数据一致。这就需要同步数据时需要花费时间。如果系统内部发生了问题从而导致系统的节点无法发生一致性变化会怎么样呢?当我们这样做的时候,就意味着想看到最新数据的读操作时,很可能会看到旧数据,或者说获取到不同版本的数据。此时,为了保证分布式系统对外的数据一致性,于是选择不返回任何数据。
- 强一致性:对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
- 弱一致性:如果能容忍后续的部分或者全部访问不到,则是弱一致性。
- 最终一致性:如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。
- 可用性:保证每个请求不管成功或者失败都有响应,并且是在规定的时间内。
- 如果节点不能正常接收请求了,比如宕机了,系统崩溃了,而其他节点依然能正常接收请求,那么,我们说系统依然是可用的,也就是说,部分宕机没事儿,不影响可用性指标。
- 如果节点能正常接收请求,但是发现节点内部数据有问题,那么也必须返回结果,哪怕返回的结果是有问题的。比如,系统有两个节点,其中有一个节点数据是三天前的,另一个节点是两分钟前的,如果,一个读请求跑到了包含了三天前数据的那个节点上,抱歉,这个节点不能拒绝,必须返回这个三天前的数据,即使它可能不太合理。
- 分区容错性: 系统中任意信息的丢失或失败不会影响系统的继续运作。
- 分区:一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
- 容忍:当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
在分布式系统内,P 是必然的发生的,不选 P,一旦发生分区错误,整个分布式系统就完全无法使用了,这是不符合实际需要的。所以,对于分布式系统,我们只能能考虑当发生分区错误时,如何选择一致性和可用性。
CP:Zookeeper
AP:eureka
引申出来的 BASE
正因为 CAP 以上的种种不足,epay 的架构师 Dan Pritchett 根据他自身在大规模分布式系统的实践经验,总结出了 BASE 理论。BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
