分布式系统中的一致性,数据库的隔离级别,CAP中的C、P,以及数据库的ACID中的C

在分布式系统中

(多副本)一致性,是描述多副本的同步特征。一般从两个角度来研究:

从全局数据的指令执行流角度来看:

  【最强一致性:】

    • 严格一致性(strict):读出的总是最近(wall-time)写入的值

    【强一致性:】    

    • 可线性化一致性(linearizable): 没有绝对时间的概念,只有相对先后关系。任意操作的相对时序位置也不变。
    • 顺序一致性(sequential): 没有绝对时间的概念,只有相对先后关系。同一客户端内部的操作序列顺序不变,客户端之间的操作序列可以在时序上交错插入;一旦交错完成就不能改变(这是最常见的强一致性模型,paxos/raft共识协议可以实现该模型)

    【弱一致性:】

    • 因果一致性(casual): 任意客户端内部的操作顺序不能变,客户端之间的操作序列可以在时序上交错插入,交错完成还可以再重新交错;但不能导致任何客户端的操作顺序的因果关系错乱
    • FIFO一致性: 任意客户端内部的操作顺序不能变,客户端之间的操作序列可以在时序上交错插入,交错完成还可以再重新交错;只要保证任意客户端内部看起来相对顺序不变就行
    • 一般一致性(general):当所有副本都完成了写操作之后,它们上面的数据是同一个值(这是最常见的弱一致性模型)

从客户端角度来看:

    1. "写后读"一致性:同一个客户端session,写入后,读出来的总是不旧于刚刚的写入
    2. "读后写"一致性:同一个客户端session,读出后,写进去的总是在刚才读出的数的基础上(可能比读出的更加新的基础上)
    3. "单调读"一致性:同一个客户端session,每次读出的都不旧于上次读出的
    4. "单调写"一致性:同一个客户端session,每次写入的都是在上次写入基础上(可能比上次写入的更加新的基础上)
    5. 最终一致性:同一个客户端session,做了若干次读写、经过一段时间后,看到一个稳定不变的值

隔离级别,是研究事务之间数据的可见关系,讨论的是“并行的写入过程中、或者有的已写入(提交)而有的尚未真正写入(未提交)这个过程中”发生的事情;而一致性研究的是大家在都写入后发生的事情,而忽略写入过程、将其看做原子操作。隔离级别跟一致性是正交的关系。

CAP定理,是说分布式环境下3个条件不能同时满足,最多只能满足其中2个。

C:Consistency,一致性,这里的一致性含义很广,即包括上文的多副本一致性,也包括分布式业务数据的逻辑一致性,总之就是指分散到不同节点的具有内在逻辑关系的数据,要保持其逻辑一致性。(注:CAP的C原意是指Linearizability这种多副本一致性模型,但这个概念扩展一下也适用的)

A:Availabillity,可用性,服务可用(超时、读写失败,都算不可用)

P:Partition-tolerance,分区容忍性。表示:系统中,是否会出现节点间通信永久失效的情形。容忍分区,意味着普通网络;不容忍分区,意味着没有网络,所有节点是一体化的(例如所有节点在同一个进程中,要挂都挂),或者理想状态的网络。

例如CP、AP,这都好理解; 那么CA能同时满足吗?

按照P的定义:

The network will be allowed to lose arbitrarily many messages sent from one node to another(网络允许节点间丢失任意多的消息)

由此可知,如果不允许P出现(即不支持分区容忍性,也就是说,网络永远能够在指定时间内恢复),那么显然CA可以同时保证(假设C为最常见的顺序一致性,则客户端总可等待有限时间后返回结果)。然而,这只存在于理论世界,现实世界中的网络迟早会出问题,而且网络不保证在有限时间内总可以恢复。这样看来,现实分布式系统中,强一致性的CA是无法同时满足的。

ACID,说的是数据库事务正确执行的四个充要条件。

A:Atomic,原子性,从事务本身的完整性看的,事务中的所有语句作为一个整体执行,要么全成功,要么全回滚,不允许部分成功

C:Consistency,一致性,是指上指的是数据库的约束条件(唯一键、外键、表里自建的约束等...),事务后要保持正确

I:Isolation,隔离性,并发事务运行时,需要一定的隔离性来保障数据在逻辑/语义上的正确性

D:Durability,持久性,事务成功后,造成的影响是持久的,即使重启后、数据库挂掉后也不影响事务的结果