前言
在大数据应用落地日益成熟的今天,通过网络查阅理解大数据的一些基本概念显得十分重要。
提起大数据,就离不开它的分布式架构,而把握着分布式大门的几把钥匙中无比重要的那一把,就是我们今天要讲的CAP理论(本文主要参考了《大数据日知录:架构与算法》)。
一、什么是CAP定理?
准确来说,CAP 是对“ Consistency/Availability/Partition Tolerance" 的一种简称, 其分别代表:强一致性、可用性和分区容忍性。
强一致性(Consistency): 即在分布式系统中的同一数据多副本情形下, 对千数据的更新操作体现出的效果与只有单份数据是一样的。
可用性(Availability): 客户端在任何时刻对大规模数据系统的读/写操作都应该保证在限定延时内完成。
分区容忍性(Partition Tolerance): 在大规模分布式数据系统中, 网络分区现象, 即分区间的机器无法进行网络通信的情况是必然会发生的, 所以系统应该能够在这种情况下仍然继续工作。
二、为什么“三选二”?
1.三选二的由来
CAP 最初是由Eric Brewer于1999 年首先提出的, 他同时证明了:对于一个大规模分布式数据系统来说, CAP 三要素不可兼得, 同一个系统至多只能实现其中的两个, 而必须放宽第3 个要素来保证其他两个要素被满足。
即要么AP, 要么CP, 抑或AC, 但是不存在CAP, 这就是CAP 原则的精髓所在。
2.定理证明
我们为了证明它的结论可以进行棋盘推演:
情形一: 如果在这个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独本数据不会出现数据不一致的可能。
此时C和P两要素具备 , 但是如果系统发生了网络分区状况或者机器宕机 , 必然导致某些数据不可访问 , 此时可用性条件是不能被满足的, 即在此情形下获得了CP系统, 但CAP不可同时满足。
情形二: 如果系统中数据有副本(见下图) , 假设变量x存在两份副本并分别存储在不同机器上 , 最初数据保持一致, 其值都为v1
。在Time=t1
的时刻, 在机器l上发生对x的数值更新操作 , 此操作要将x的值赋为v2
。时间推移到Time=t2
时刻 , 机器l上的x已经被赋予新值v2
, 如果此时未发生网络分区状况 , 系统可以将x的新值v2
同步到机器2, 达到数据一致性要求。但是如果此时发生了网络分区导致两台机器无法通信, 那么无法将x的新值同步到机器2,这个时刻我们不得不在 C或A之间做个权衡和选择。
如果希望系统高可用(选择A), 那么对于读取机器2上的x的查询请求必须在限定时间内返回值 , 此时返回的并非是最新的值v2
, 所以出现了数据不一致的间题(抛弃 C)。 如果选择强一致性(选择 C) , 那么在两台机器恢复通信并将数据同步到一致状态前, 对于机器2的x读请求必须予以拒绝, 此时无法保证系统的可用性(抛弃A)。所以不论选择哪一个,必然以牺牲另外一 个因素作为代价 , 也就是说要么AP, 要么CP, 但是没有完美的CAP。
3.天然存在的“P”
为什么现在我们都说要么AP,要么CP,而不说AC呢?
其实,在一般的网络环境中,网络出现分区问题是在所难免的,所以我们的分布式系统必须具有分区容忍性,也就是P,所以架构师们往往只能在AP和CP之间进行权衡。
三、解决方案——走出“三选二”的误区
前面我们讲到P是天然存在的,所以我们要么选择A,要么选择C,但实际上,网络出问题的概率还是比较小的,我们不可能为此完全地放弃A或者C。
Eric Brewer提出CAP三者并非是绝对二元式地有或没有、 而是应该将其看作连续变量, 即可以看作在一定程度上的有或没有 , 比如可用性指标中(A)延时长度多少算可用这都是可以看作连续变量的,类似地,C和P也可以如此对待, 在实际进行取舍时并非加以完全舍弃, 而是可以考虑在多大程度上进行舍弃。
在绝大多数 系统未产生网络分区的情形下, 应该尽可能保证AC两者兼得,也即大多数情况下考虑CAP三者兼得, 当发生网络分区时,系统应该能够识别这种状况并对其进行正确处理, 具体而言,应该分为3个步骤:
首先能够识别网络分区发生, 然后在网络分区场景下进入明确的分区模式 , 此时可能会限制某些系统操作 , 最后在网络分区解决后能够进行善后处理, 即恢复数据的一致性或者弥补分区模式中产生的错误。
写在最后
如果以上内容对你有帮助的话,欢迎点赞关注!祝大家都能学有所成。