一、ACIDRDBMS的理论基石 1、A 原子性(Atomicity) 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 2、C 一致性(
一、ACID——RDBMS的理论基石
1、A —— 原子性(Atomicity)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2、C—— 一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3、I —— 隔离性(Isolation)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
4、D—— 持久性(Durability)
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
二、Brewer的CAP理论
在一个分布式环境下,存在3个核心需求
1、数据的一致性(Consistency)
2、系统的高可用(Aviliability)
3、分区容错性(Partition Tolerance)
CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分布式架构设计时,必须做出取舍。而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值。因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。对于大多数WEB应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是多数分布式数据库产品的方向。 当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。牺牲一致性,只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验,这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则取决于数据复制到一致状态的时间。 最终一致性(EVENTUALLY CONSISTENT) 对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。 从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。 最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为: 因果一致性(CAUSAL CONSISTENCY) 如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问遵守一般的最终一致性规则。“读己之所写(READ-YOUR-WRITES)”一致性。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。会话(SESSION)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。单调(MONOTONIC)读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。单调写一致性。系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。上述最终一致性的不同方式可以进行组合,例如单调读一致性和读己之所写一致性就可以组合实现。并且从实践的角度来看,这两者的组合,读取自己更新的数据,和一旦读取到最新的版本不会再读取旧版本,对于此架构上的程序开发来说,会少很多额外的烦恼。
三、NWR法则
1、N:复制的节点数量
2、R:成功读操作的最小节点数
3、W:成功写操作的最小节点数
从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。对于分布式数据系统: N — 数据复制的份数,W — 更新数据是需要保证写完成的节点数,R — 读取数据的时候需要读取的节点数如果W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。 如果W+R=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。 如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况下,如果W四、BASE理论(弱化的CAP)理论1、Basically Availible ——基本可用
2、Soft-state —— 软状态 柔性事物
3、Eventual Consistency —— 最终一致性
上面提到,在分布式环境中,CAP只能取两者。但是,因为网络分区的情况不可避免,并且它对可用性有着重要影响,所以互联网中的分布式系统多在一致性方面做些折中。虽然不能达到强一致性,但可以根据应用特点采用适用的手段来达到够用的一致性效果。比如,对于微博系统,当用户新增一条消息,能够达到用户能看到刚才发的消息、而他的follower们能在尽快时间看到他新发的消息的效果就可以了。而在实现时,就可以结合同步和异步多种策略、SQL+NOSQL多种存储方案来满足应用需要。
BASE(Basically?Available、Soft?state、Eventually?consistent)是对CAP中的AP的延伸。
在单机环境中,ACID是数据的属性;而在分布式环境中,BASE就是数据的属性。ACID有“尖刻”之含义,所以单机环境的数据有着很高的要求。而因为分布式环境的网络分区性及复杂性,对数据也只能有“基本”的要求了。
从ACID到CAP和BASE,从单机到分布式,从SQL到NOSQL,互联网应用的大规模发展促使不断出现可替代旧方案的新技术。在技术选型方面,重要的是根据自己的应用特点选择自己能驾驭的技术。而现实的应用场景,也大多是多种技术方案的结合。