分布式系统CAP理论和Base理论

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:基本可用

基本可用是指分布式系统出现了不可预知的严重故障(如服务器宕机,部分网络中断),但还是能用的。

相比正常的系统而言:

  1. 响应时间上会延长:正常情况的搜索引擎0.5秒即返回给用户结果,而基本可用的搜索引擎可能需要2秒以上

  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

你可能感兴趣的:(分布式系统CAP理论和Base理论)