CAP理论

在基于微服务架构构建分布式系统时,需要考虑分布式系统的八个谬论。总结来说,分布式系统谬论强调网络的不可靠性(节点、延迟、带宽、安全、拓扑、异构、传输成本、多管理员)。对于分布式系统,除了考虑网络因素,还需考虑系统自身的可用性、一致性等因素。CAP理论就是一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个因素的权衡。

什么是CAP理论

对于一个分布式系统来说,可用性、一致性和分区容忍性三个要素不能同时并存。这三个要素的详细描述是:
(1) C:Consistency,一致性,在同一时间,多个副本或实例中存储的数据或获取的数据完全相同;
(2) A:high Availability,高可用性,无论请求成功或失败,服务器都有响应;
(3) P:tolerance to network Partition,分区容忍性,无论是否有信息丢失或部分节点失效,整个系统仍可正常工作。

CAP理论的发展

CAP理论最早只是一个猜想,由Eric Brewer 教授在2000年,在 PODC(Priciples of Distributed Computing,分布 式计算原理)会议上提出。
CAP 猜想提出后迅速获得学术界广泛关注。2002 年,MIT 的两位学生 Gilbert 和 Lynch 从理论上证明了该猜想的正确性,CAP 由此从猜想上升为理论。
伴随 NoSQL 运动兴起,CAP 理论得到广泛应用。在 CAP 理论应用过程中存在一种常见认知误区:CAP 中三要素是一个三选二局面。CAP 理论正确理解是:CAP 在三选二后,余下的那个并非放弃而只是不能完美的支持。Eric Brewer 教授(CAP理论提出者)在 2012 年也发表文章引导学术界和产业界正确理解 CAP 理论。

正确理解CAP理论

既然对于分布式系统来说,可用性一致性分区容忍性三个要素不能同时并存,那么在设计分布式系统时,该如何选择?对于分布式系统来说,网络分区必然存在(参考分布式系统八大谬论)。因为如果系统没有分区容忍性,就能跨网络运行。换句话说,只能在本地运行一个单独的进程。所以,对于分布式系统来说,网络分区必然存在。既然网络分区必然存在,且CAP理论必然成立,那么只能考虑实现一个AP或CP的分布式系统。

牺牲可用性

在分区存在的情况下,如果节点间彼此不能通信,则无法协调并保证这些节点的一致性。由于无法保证一致性,所以唯一的选择就是拒绝响应请求。换句话说,这里牺牲了可用性。此时,该系统是一致性的和分区容错的,即CP系统。在这种模式下,我们的服务必须考虑如何做到功能降级,直到分区恢复或节点间数据重新同步。
保持多个节点之间的一致性是非常困难的,在分布式系统中,其难度更大。举例来说,有一个场景,需要跨多个数据库节点读取数据已确保一致性。因为事务读取很慢,需要使用锁,一个读取操作可能阻塞整个系统。该场景的一致性维护涉及到分布式事务,这里不展开介绍。
注意,牺牲可用性,不是放弃可用性,只能为保证强一致性,无法在网络分区存在的情况下,保证高可用性。
对于基于微服务架构构建的分布式系统,当服务依赖的服务不可用时,其处理策略是拒绝响应请求,也就是说,牺牲了可用性,按照CAP理论,该系统是一个CP系统。

牺牲一致性

在分区存在的情况下,如果系统仍然能够提供服务,换句话说,系统仍然可用,会牺牲一致性。此时,该系统是可用的和分区容错的,即AP系统。在这种系统下,如果每个分区继续提供服务,那就需要接受一个事实,即在将来的某个时候,不得不重新同步,分区时间越长,这个重新同步就越困难。
可以看到,这里是牺牲了一致性,但是不是放弃一致性。在产业界,Werner Vogels 从系统对读写响应角度对一致性进行分类:
(1) 强一致性(Strong Consistency):系统保证更新数据后,在后续的读操作中都 可读到更新后的新值。为达到强一致性,存储同一份数据的多个副本上的操作必 须同步进行。也就是说:在执行一次更新操作时系统必须被阻塞,所有的副本在 操作完成前都会被锁定。
(2) 弱一致性(Weak Consistency):系统不强制要求数据更新后,在后续读操作中 都可读到更新后的新值,即允许在更新后的一段时间内才读到新值。这里将从该 数据开始更新到后续读操作读取到该数据最新值的延时称为“不一致性窗口” (inconsistency window)。
(3) 最终一致性(Eventual Consistency):系统保证对后续不再更新的数据,在一 次更新后,能在有限的时间内最终读取到该数据的最新值。大多数 NoSQL 数据库都是基于最终一致性模型构建,如Redis。

AP还是CP

在构建系统时,选择AP还是CP呢?现实中要视情况而定。对于AP系统,其扩展更容易,而且构建更简单,而CP系统由于要支持分布式一致性会遇到更多的挑战,需要更多的工作。所以,在构建系统时,一定要根据上下文,选择合适的类型系统。需要说明的是,系统作为一个整体,不需要全部是AP或CP的,个别特性甚至不需要保证CP或AP。

总结

综上所述,对于分布式系统来说,无法同时保证可用性、一致性和分区容忍性三个要素。同时,由于分布式系统中网络分区不可避免,所以 CAP 理论的进一步描述是:“由于网络分区必然存在,分布式系统无法同时保证数据强一致性和高可用性。不同强度等级的数据一致性对应不同程度的系统可用性”。

参考

Fallacies of Distributed Computing Explained Arnon Rotem Gal
https://blog.csdn.net/peterwanghao/article/details/81293461 分布式计算中的八大谬论
微服务设计 Sam Newman 著, 崔力强 等 译
基于Redis的一致性分析与改进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值