CAP理论
2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,National University of Singapore的Seth Gilbert和Massachusetts Institute of Technology的Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。
CAP理论概述:
一个分布式系统最多只能同时满足一致性、可用性和分区容错性这三项中的两项。
Consistency:一致性
指的是“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一样,指的是数据的一致性。
对于一致性,可以分为从客户端和服务端两个不同的视觉。从客户端来看,一致性指的是并发访问是更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致性。
一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意考虑并发读写的场景。
从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。
三种一致性策略
对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
如果能容忍后续的部分或者全部访问不到,则是弱一致性。
如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。
CAP中不能同时满足的一致性指的是强一致性。
Availability:可用性
可用性指的是“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。
对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。所以一般衡量一个系统的可用性的时候,都是通过停机时间来计算的。
可用性分类 | 可用水平(%) | 年可容忍停机时间 |
---|---|---|
容错可用性 | 99.9999 | <1 min |
极高可用性 | 99.999 | <5 min |
具有故障自动恢复能力的可用性 | 99.99 | <53 min |
高可用性 | 99.9 | <8.8h |
商品可用性 | 99 | <43.8 min |
淘宝的系统可用性可达5个9,意思是可用性水平为99.999%,即全年停机时间不超过 (1-0.99999)*365*24*60 = 5.256 min
,
好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等不好体验。一个分布式系统,上下游设计很多系统如负载均衡、web服务器、应用代码、数据库服务器、网络等等都会影响可用性。
Partition tolerance:分区容错性
分区容错性是指“the system continues to operate despite arbitrary message loss or failure of part of the system”。即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
分区容错性和拓展性紧密相关。在分布式应用中,可能因为一些分布式的原因导致系统无法正常运转。好的分区容错性要求应用虽然是分布式应用,但运行起来像一个整体。比如有个别的web服务器或者数据库服务器宕机了,各部分的系统仍能正常运行。
CAP取舍
CA without P
即舍弃分区容忍性,这个是不存在的。因为分布式环境,网络分区是一个事实。关系型数据库就是保证了可用性和数据一致性。一旦关系型数据库要主备同步(异地灾备),集群部署等就要把P考虑进来。
所以对于一个分布式系统,P是一个基本的要求,CAP三者之间只能在CA之间做权衡。
CP without A
如果一个分布式系统不要求强的可用性,即容许系统停机或者长时间无响应的话,就可以在CAP三者中保障CP而舍弃A。
一个保证了CP而舍弃了A的分布式系统,一旦发生网络故障或者消息丢失等情况,就要牺牲用户体验,等到所有数据一致后再让用户访问。比如Redis、HBase和Zookeeper也是优先保障CP的。
AP without C
需要高可用并允许分区,则需要放弃一致性。一旦网络问题发生,节点之间可能会失去联系。为了保证高可用,需要在用户访问时可以马上得到返回,则每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。
这种情况会发生在淘宝、京东、12306的购买商品上,查看的时候显示有商品,到实际下单的时候却发现商品买完了。
按实际业务进行取舍
技术有没孰优孰劣之分,需要根据实际业务与业务相契合的方案。
Base理论
Base是Ebay的架构师Dan Pritchett于2008年在CAP的基础上提出的理论。Base理论的核心思想是即便无法做到强一致性,但每个应用都可以根据自身业务的特点,使用适当的方法来使系统达到最终一致性。
Base理论是由Basically Available(基本可用)、Soft State(软状态)和Eventually Consistent(最终一致性)缩写而成。
Basically Available:基本可用
基本可用是指分布式系统出现了不可预知的严重故障(如服务器宕机,部分网络中断),但还是能用的。
相比正常的系统而言:
响应时间上会延长:正常情况的搜索引擎0.5秒即返回给用户结果,而基本可用的搜索引擎可能需要2秒以上
功能上的损失:比如在双11等电商促销期遇到服务器宕机了,只能保证80%的客户能正常访问。(现在有kubernetes云服务器的自动扩容技术,这种故障会越来越少见)
Soft State:软状态
软状态是相对ACID中的原子性而言的。
原子性要求多个节点的数据副本都是一致的,这是一种“硬状态”。比如关系型数据库,集群中的redis和Zookeeper,每个节点中的数据副本都是强一致性的。
软状态是指:允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本不一致,存在数据延时。比如mysql的异步复制(Asynchronous replication)
Eventual Consistency:最终一致性
上面说的软状态不能一直是软状态,必须有一个时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间期限取决于网络延时、系统负载、数据复制、方案设计等因素。
因果一致性 Causal consistency
因果一致性指:如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。与此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。
读己之所写Read your writes
读己之所写指:节点A在更新完一个数据,它自身总是能访问到自身更新过的最新值,而不会看到旧值。
会话一致性Session consistency
会话一致性指:对系统数据的访问过程框定了在一个会话当中;系统能保证在同一个有效会话中实现“读己之所写”的一致性。也就是说,执行更新操作后,客户端能够在同一个会话中始终读取到该数据的最新值。
单调读一致性Monotonic read consistency
单调读一致性指:如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不会返回更旧的值。
单调写一致性Monotonic write consistency
单调写一致性指:系统能够保证来自同一个节点的写操作被顺序地执行。
总结:互联网商城主要以Base理论作为分布式的基础理论
参考资料:
[1] Towards Robust Distributed Systems, Eric Brewer, 2000 (CAP理论起源原文)
[2] Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web, Seth Gilbert&Nancy Lynch, 2002 (CAP验证原文)
[3] Base: An Acid Alternative In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability, Dan Pritchett, 2008 (Base理论原文)
[4] [分布式系统的CAP理论], Hollis,2015