关于数据一致性的理论
数据一致性是架构师在设计一个企业应用系统数据架构时必须考虑的一个重要问题,尤其在互联网分布式架构环境下,一个完整的业务被拆分到多个分布式的应用系统中,数据一致性的问题就显得尤为突出。
一般来说,数据一致性可以分成三类:时间点一致性、事务一致性、应用一致性。
时间点一致性:也叫作副本一致性,如果所有相关的数据副本在任意时刻都是一致的,那么可以称作时间点一致性。
事务一致性:是指在一个事务执行前和执行后数据库都必须处于一致性状态。如果事务成功完成,那么系统中所有变化将正确地应用,系统处于有效状态;如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
应用一致性:事务一致性代表单一数据源或者狭义上的数据库;广义上的数据可能包括多个异构的数据源,比如数据源有多个数据库、消息队列、文件系统、缓存等,那么就需要应用一致性,这里也称作分布式事务一致性。
使用关系型数据库的本地事务保证数据的一致性,这种事务又被称为 ACID 的 4 个基本要素:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
原子性:一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性。
一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前和执行后,数据库都必须处于一致的状态。
隔离性:事务的隔离性是指在并发环境中,并发的事务是相互隔离的,一个事务的执行会被其他事务干扰。当不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
持久性:一旦事务提交,那么它对数据库中对应数据的状态变更就会永久保存到数据库中。
当多个用户试图同时访问一个数据库时,在它们的事务同时使用相同的数据时,可能会发生以下 4 种情况:丢失更新、脏读、不可重复读和幻读。
丢失更新:是指事务 T1 读取了数据,并执行了一些操作,然后更新数据。事务 T2 也做相同的事,则 T1 和 T2 更新数据时可能会覆盖对方的更新,从而引起错误。
脏读:就是读到了别的事务回滚前的脏数据。
不可重复读:在同一事务中,两次读取同一数据,得到的内容不同。
幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同。
CAP 定理是对一致性(consistency)、可用性(availability)、分区容错性(partitiontolerance)的一种简称 CAP 原则是指在分布式应用系统中,这 3 个要素最多只能同时实现两个,不可能三者兼顾。
一致性(C):在分布式系统中的所有数据备份,在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本。
可用性(A):良好的响应性能、完全的可用性是指在任何故障类型下,服务都会在有限的时间内处理完成并进行响应。
分区容错性(P):大规模分布式数据系统中的网络分区现象,即分区间的机器无法进行网络通信的情况必然会发生,系统应该能够在这种情况下仍然继续工作。
BASE 是基本可用(basically available)、软状态,也作柔性状态(soft state)和最终一致性(eventual consistency)3 个短语的简写。满足 CAP 定理,通过牺牲强一致性获得可用性,一般应用于服务化系统的应用层或者大数据处理系统中,通过达到最终一致性来尽量满足业务的绝大多数需求。其包含三个元素:
基本可用(BA):在绝大多数时间内系统处于可用状态,允许偶尔的失败,所以称为基本可用。
软状态(S):指数据状态不要求在任意时刻都完全保持同步,到目前为止,软状态(柔性状态)并没有一个统一明晰的定义,但是从概念上是可理解的,即处于有状态(state)和无状态(stateless)之间的中间状态。
最终一致性(E):与强一致性相比,最终一致性是一种弱一致性,尽管软状态不要求任意时刻数据保持一致,但是最终一致性要求在给定时间窗口内数据能达到一致状态。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ffac3836d7bb9734f4038725】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论