CAP是指一致性(consistency)、可用性(Availability)和分区容错(partition-tolerance)。那么CAP从何而来,具体是什么呢,又有什么用呢?
CAP起源
早在1998年,加州大学的计算机科学家Eric Brewer提出,在设计一个分布式系统(一个大规模可扩展的网络服务)时有3个指标,
- Consistency: 一致性指的是所有节点都能在同一时间返回同一份最新的数据副本- Availability: 可用性指的是每次请求都能够返回非错误的响应- Partition tolerance: 分区容错性指的是服务器间的通信即使在一定时间内无法保持畅通也不会影响系统继续运行
这三个指标不能同时满足。这个结论就是CAP定理。
为什么不能同时满足?
先说分区容错性(Partition tolerance)。一个分布式系统部署在不同的网络分区之上(可以理解为部署在不同的地方),它就需要面对和处理由于网络通信问题(中断、丢包)等等,即使网络不通的情况发生也还要能继续运行、提供服务。作为一个分布式系统,这应该是基础的功能,是应该需要支持的。那接下来再看一致性(consistency)和可用性(Availability)。
一致性是说所有节点上的数据是一致的,这就要求当有数据更新时,所有节点上的数据都要同步更新。但此时若网络中断,有些节点数据得不到更新。为了保证数据一致,这些节点只能暂时停止对外服务,直到数据更新。这样就损失了可用性。
可用性时说所有的请求,在任何节点上都能得到及时返回。要满足可用性,就需要所有节点时刻都提供服务,即使由于网络中断造成数据不一致时,这样就损失了一致性。
如果想同时满足一致性和可用性,那意味着所有节点上的数据要能随时保持同步更新,这就不能有网络中断情况的出现,那只能部署在一起,不能分区,也就没有分区容错了。那么在设计产品时,如何在这三者中取舍就是需要权衡的事情。
三者取其二
下图时网上很容易找到的一张图片,它显示了不同的数据库在CAP中是如何取舍的。不过需要注意的是,现在的网络系统,网络应用,大部分都是“牺牲”一致性,来保证系统的可用性。这里牺牲的是强一致性,即不能保证所有节点上时刻都是最新数据,但是最终会达到一致,即所谓的最终一致性。
结论
CAP原理是分布式系统中一个重要原理。理解了CAP才能更好的理解现在各种分布式系统、分布式数据库、分布式缓存等等的设计,才能在面对自己的实际业务问题时,知道如何权衡并给出解决方案。
------------------------------------------------------------------------------------------------------ 分割线 -----------------------------------------------------------------------------------------------------------------
Doris系统临时失效的处理过程时序图。
------------------------------------------------------------------------------------- 分割线 --------------------------------------------------------------------------------------------------------------
第五六周的课堂内容思维导图