在大数据存储系统中,为了增加系统高可用性,往往会将同一数据存储多份副本,工业界的常规做法是三备份。将数据复制成多份除了增加存储系统高可用性外还可以增加读操作的并发性,但是这样也会引入数据一致性问题: 因为同一数据存在多 个副本,在并发的众多客户端读/写请求下如何维护数据-致视图非常重要,即在存储系统外部使用者看起来即使是多副本数据,其表现也和单份数据一样。
CAP原则
CAP是对“Consistency/AvailabilityPatition Tolerance" 的一种简称,其分别代表:强一致性、可用性和分区容忍性,三特性的内在含义如下。
●强一致性:即在分布式系统中的同- -数据多副本情形下,对于数据的更新操作体现出的效果与只有单份数据是一样的。
●可用性:客户端在任何时刻对大规模数据系统的读/写操作都应该保证在限定延时内完成。
●分区容忍性:在大规模分布式数据系统中,网络分区现象,即分区间的机器无法进行网络通信的情况是必然会发生的,所以系统应该能够在这种情况下仍然继续工作。
CAP最初是由Eric Brewer 于1999年首先提出的,他同时证明了:对于一个大规模分布式数据系统来说,CAP三要素不可兼得,同一个系统至多只能实现其中的两个,而必须放宽第3个要素来保证其他两个要素被满足。即要么AP,要么CP,抑或AC,但是不存在CAP,这就是CAP原则的精髓所在。- -般在网络环境下,运行环境出现网络分区是不可避免的,所以系统必须具备分区容忍性特性,于是一般在此种场景下设计大规模分布式系统时,架构师往往在AP和CP中进行权衡和选择,有所强调,有所放弃。
为何在分布式环境下CAP三者不可兼得?对此问题可做棋盘推演,这样问题的关键转换为:假设存在网络分区的情形,若已得到P,即容忍网络分区的存在,那么C和A是否可以兼得。
可以分为两种情形来进行进一步推演。
情形一:如果在这个分布式系统中数据无副本,那么系统必然满足强一致性条件, 因为只有独本数据,不会出现数据不一致的可能。此时C和P两要素具备,但是如果系统发生了网络分区状况或者机器宕机,必然导致某些数据不可访问,此时可用性条件是不能被满足的,即在此情形下获得了CP系统,但CAP不可同时满足。
情形二:如果系统中数据有副本,假设变量x存在两份副本并分别存储在不同机器上,最初数据保持一致,其值都为v1。在Time=tl的时刻,在机器1上发生对x的数值更新操作,此操作要将x的值赋为v2。时间推移到Time=t2时刻,机器1上的x已经被赋予新值v2,如果此时未发生网络分区状况,系统可以将x的新值v2同步到机器2,达到数据- -致性要求。但是如果此时发生了网络分区导致两台机器无法通信,那么无法将x的新值同步到机器2,这个时刻我们不得不在C或A之间做个权衡和选择。如果希望系统高可用(选择A),那么对于读取机器2上的x的查询请求必须在限定时间内返回值,此时返回的并非是最新的值v2,所以出现了数据不一致的问题(拋弃C)。如果选择强-致性(选择C),那么在两台机器恢复通信并将数据同步到-致状态前,对于机器2的x读请求必须予以拒绝,此时无法保证系统的可用性(抛弃A)。所以不论选择哪一个,必然以牺牲另外-个因素作为代价,也就是说要么AP,要么CP,但是没有完美的CAP。
ACID原则
数据库采纳ACID原则,获得高可靠性和强一致性。
BASE原则
数据库系统采纳ACID原则,获得高可靠性和强一致性。而大多数大数据环境下的云存储系统和NoSQL系统则采纳BASE原则,这种原则与ACID原则差异很大,具体而言,BASE原则是指:
基本可用( Basically Available) 。在绝大多数时间内系统处于可用状态,允许偶尔的失败,所以称为基本可用。
软状态或者柔性状态(Soft State) ,是指数据状态不要求在任意时刻都完全保持同步,到目前为止软状态并无-个统- -明晰的定义,但是从概念上是可理解的,即处于有状态( State )和无状态( Stateless )之间的中间状态。
最终一致性( Eventual Consistency)。与强- -致性相比, 最终-致性是一 -种弱一致性,尽管软状态不要求任意时刻数据保持-致同步,但是最终一致性 要求在给定时间窗口内数据会达到-致状态。
BASE原则与ACID原则不同,前者是通过牺牲强- -致性 来获得高可用性。尽管现在大多数的NoSQL系统采纳了BASE 原则,但是有- .点值得注意: NoSQL 系统与云存储系统的发展过程正在向逐步提供局部ACID特性发展,即从全局而言符合BASE原则,但是从局部支持ACID原则,这样就可以吸取两者各自的好处,在两者之间建立平衡,从Google的MegaStore便可以看出这种发展趋势。
CAP/ACID/BASE三者的关系
ACID和BASE原则是在明确提出CAP理论之前关于如何对待可用性和强- -致性的两种完全不同的设计哲学。ACID更强调数据一致性, 这是传统数据库设计的思路。而BASE更强调可用性,弱化数据强一致性的概念,这是互联网时代对于大规模分布式数据系统的一-种需求,尤其是其中的软状态和最终一致性, 这两者是在容忍网络分区情形下强调可用性的具体手段。
由以上所述可知,CAP与BASE两者的一致性显而易见;但相比较而言,CAP和ACID的关系就稍显复杂了。这主要是出于两个原因,首先因为CAP和ACID两者都包含了A和C,但是其具体含义和所指是不同的,所以易混淆。另外如果CAP中选择A的话,在一定程度上是会影响ACID中的部分要求和保证的。具体而言,CAP 和ACID的明显差异包括如下。
1.首先两者中尽管都包含一致性,但是两者含义不同,ACID中的C指的是对操作的- 致性约束,而CAP中的C指的是数据的强一致性(多副本对外表现类似于单副本),所以可以将CAP中的C看作一致性约束的一 -种,即CAP中的C是ACID中的C所涵盖语义的子集。在出现网络分区情形下,很明显ACID中的C所要求的一致性约束是 无法保证的,所以在网络分区解决后需要通过- -定手段来恢复ACID中要求的-一致性。
2.当出现网络分区时, ACID中的事务独立(1)只能在多个分区中的某个分区执行,因为事务的序列化要求通信,而当网络分区时明显无法做到这点,所以只能在某个分区执行。
3.当出现网络分区时,多个分区都可以各自进行ACID中的数据持久化(D)操作,当网络分区解决后,如果每个分区都提供持久化记录,则系统可以根据这些记录发现违反ACID一致性约束