开发

架构第7章 CAP

2019-08-09  本文已影响0人  小螺丝钉cici

分布式系统的三个指标:CAP理论
CAP的具体细节
ACID /BASE 理论
本文来自于《极客时间》- 从0开始学架构

Consistency 一致性:
写操作之后的读操作,必须返回该值

Availability 可用性:
只要收到用户的请求,服务器就必须给出回应

Partition tolerance 分区容错:
区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。

image.png

CAP理论

CAP理论定义是三个要素中只能取两个。
分布式系统中,网络本身无法做到100%可靠,有可能出故障,所以P(分区容忍)是一个必然的现象,总是成立。
CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。
因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。

CP

如图所示,为保证一致性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。
这时客户端C访问N2时,N2需要返回Error,提示客户端C“系统现在发生了错误”,这种处理方式违背了可用性(Availability)的要求,因此CAP三者只能满足CP。

image.png

AP

如图所示,为保证可用性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。
这时客户端C访问N2时,N2将当前自己拥有的数据x返回给客户端C了,而实际上当前最新的数据已经是y了,这就不满足一致性(Consistency)的要求了,因此CAP三者只能满足AP
注 意:这里N2节点返回x,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为x是旧数据,并不是一个错乱的值,只是不是最新的数据而已。

image.png

综上所述,无法同时做到一致性和可用性。
系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

问题:在什么场合,可用性高于一致性?
举例来说,发布一张网页到 CDN,多个服务器有这张网页的副本。后来发现一个错误,需要更新网页,这时只能每个服务器都更新一遍。
一般来说,网页的更新不是特别强调一致性。短时期内,一些用户拿到老版本,另一些用户拿到新版本,问题不会特别大。
当然,所有人最终都会看到新版本。所以,这个场合就是可用性高于一致性。

CAP的具体细节

image.png

这样的设计有一个很明显的问题就是某个节点故障时,这个节点上的用户就无法进行读写操作了,但站在整体上来看,这种设计可以降低节点故障时受影响的用户的数量和范围,毕 竟只影响20%的用户肯定要比影响所有用户要好。
这也是为什么挖掘机挖断光缆后,支付宝只有一部分用户会出现业务异常,而不是所有用户业务异常的原因。

ACID:了保证事务的正确性

1.原子性 Atomicity
2.一致性 Consistency
3.隔离性 Isolation
4.持久性Durability

1.Atomicity(原子性)
一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。
事务在执行过程中发生错误,会被回滚到事务开始前状态,就像这个事务从没有执行过一样。
2.Consistency(一致性)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
3.Isolation(隔离性)
数据库允许多个并发事务同时对数据进行读写和修改的能力。
隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
4.Durability(持久性)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
可以看到,ACID中的A(Atomicity)和CAP中的A(Availability)意义完全不同,而ACID中的C和CAP中的C名称虽然都是一致性,但含义也完全不一样。
ACID中的C是指数据库的数据完整性,而CAP中的C是指分布式节点中的数据一致性。
再结合ACID的应用场景是数据库事务,CAP关注的是分布式系统数据读写这个差异点来看。
其实CAP和ACID的对比 就类似关公战秦琼,虽然关公和秦琼都是武将,但其实没有太多可比性。

BASE

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
核心思想是即使无法做到强一致性(CAP的一致性就是强一致 性),但应用可以采用适合的方式达到最终一致性。

1.基本可用(Basically Available)
分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
这里的关键词是“部分”和“核心”,具体选择哪些作为可以损失的业务,哪些是必须保证的业务,是一项有挑战的工作。
例如,对于一个用户管理系统来说,“登录”是核心功能,而“注册”可以算作非核心功能。
因为未注册的用户本来就还没有使用系统的业务,注册不了最多就是流失一部分用户,而且这部分用户数量较少。
如果用户已经注册但无法登录,那就意味用户无法使用系统。例如,充了钱的游戏不能玩了、云存储不能用了......这些会对用户造成较大损失,而且登录用户数量远远大于新注册用户,影响范围更大。

2.软状态(Soft State) 允许系统存在中间状态,而该中间状态不会影响系统整体可用性。
这里的中间状态就是CAP理论中的数据不一致。

3.最终一致性(Eventual Consistency)
系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。
这里的关键词是“一定时间” 和 “最终”,“一定时间”和数据的特性是强关联的,不同的数据能够容忍的不一致时间是不同的。
案例:微博系统
用户账号数据最好能在1分钟内就达到一致状态,因为用户在A节点注册或者登录后,1分钟内不太可能立刻切换到另外一个节点,但10分钟后可能就重新登录到另外一个节点了;
用户发布最新微博,可以容忍30分钟内达到一致状态,对于用户来说,看不到某个明星发布的最新微博,用户无感知,会认为明星没有发布微博。
“最终”的含义就是不管多长时间,最终还是要达到一 致性的状态。

BASE理论本质上是对CAP的延伸和补充,更具体地说,是对CAP中AP方案的一个补充。
前面在剖析CAP理论时,提到了其实和BASE相关的两点:
1)CAP理论是忽略延时的,而实际应用中延时是无法避免的。
这一点就意味着完美的CP场景是不存在的,即使是几毫秒的数据复制延迟,在这几毫秒时间间隔内,系统是不符合CP要求的。
因此CAP中的CP方案,实际上也是实现了最终一致 性,只是“一定时间”是指几毫秒而已。
2)AP方案中牺牲一致性只是指分区期间,而不是永远放弃一致性。
这一点其实就是BASE理论延伸的地方,分区期间牺牲一致性,但分区故障恢复后,系统应该达到最终一致性。
总结:
ACID是数据库事务完整性的理论,CAP是分布式系统设计理论,BASE是CAP理论中AP方案的延伸。

案例:
一个电商网站核心模块有会员,订单,商品,支付,促销管理等。
1)会员模块,包括登录,个人设置,个人订单,购物车,收藏夹等,这些模块保证AP,数据短时间不一致不影响使用。
2)订单模块的下单付款扣减库存操作是整个系统的核心,CA都需要保证,在极端情况下牺牲P是可以的。
3)商品模块的商品上下架和库存管理保证CP/CA, 搜索功能因为本身就不是实时性非常高的模块,所以保证AP就可以了。
4)促销是短时间的数据不一致,结果就是优惠信息看不到,但是已有的优惠要保证可用,而且优惠可以提前预计算,所以可以保证AP 现在大部分的电商网站对于支付这一块是独立的系统,或者使用第三方的支付宝,微信。
其实CAP是由第三方来保证的,支付系统是一个对CAP要求极高的系统,C是必须要保证的,AP中A相对 更重要,不能因为分区,导致所有人都不能支付

区分不同数据:对关键信息采用ca,非关键信息采用ap,最终达到base即可
比如:商品信息显示可细分为关键商品信息(如价格,库存) CA和非关键信息(商品介绍,用户评论)AP

上一篇下一篇

猜你喜欢

热点阅读