浅谈 -- 常见分布式一致性

1 概述

  在分布式系统中,常见的分布式一致性包含严格一致性、顺序一致性、线性一致性、因果一致性、可串行化一致性、强一致性和最终一致性等,详情见:https://en.wikipedia.org/wiki/Consistency_model。

1.1 严格一致性

  严格一致性(strict consistency )是最强的一致性。在分布式系统中,任何节点对数据的写入其他所有节点都能够立即看到。这可以理解为存在一个全局时钟,在该时钟结束时,每个写操作都应反映在所有处理器的缓存中,下一个操作只能在下一个时钟周期内发生。
  这是一种理想的一致性,对于多个要读写同一个数据项来说,一个节点修改了数据项则所有的其他节点在既定的时间必须获知修改动作的发生。而在计算机的硬件体系结构中,一个时钟周期内处理器只能处理一个基本的操作,一个时钟周期是一个最小的读写操作发生的时长,如果跨越了两个时钟周期,则其他处理器可能会读到不同的数据项,从而造成“不同个体读到的数据不一致”现象。

1.2 顺序一致性

  顺序一致性(sequential consistency)是指某一处理器对变量的写入,其他管理器不一定能立即看到。但是不同的处理器对变量的写入必须以相同的顺序被所有处理器看到(一个写操作的结果不能立刻被其他个体感知,但是对于其他个体来说,这个写操作的结果总是能确保被其他个体以相同的顺序所感知,保证对同一会话的结果感知是一致的,即保持会内的因果关系)。
  严格一致性强调的是写事件的结果应该立刻被其他个体所知晓(似乎没有时延,但是分布式架构中,没有不耗时的消息传递),而顺序一致性强调的是“会话些写事件”发生后,需要避免多个观察者观察到不同的现象。因此,顺序一致性是指“会话内的写是有序的且会按序被读到”,因此在顺序一致性下,其他多个观察者看到的结果是一致的。
  如图1a所示,T1和T2都读写数据项X,若P3和P4观察X的过程(两次读X)和结果都是一致的,即先读b后读a,说明该过程符合顺序一致性要求。如图1b所示,T1和T2都读写数据项X,若P3和P4观察X的过程(两次读X)和结果是不一致的,即T3先读b后读a,T4先读a后读b,则该过程符合顺序一致性要求。
浅谈 -- 常见分布式一致性_第1张图片
  对于图1所示,若个体都是先读到b后读到a,则认为该过程具备顺序一致性。由此可见,在顺序一致性下,只关心所有个体的历史事件是否存在唯一的偏序关系,不关心T1和T2写数据项X的偏序关系。在顺序一致性中,绝对时间无关紧要,时间的顺序是重要的,即要保持一个会话内的因果序而不需要全系统遵守实时限制。

1.3 线性一致性

  线性一致性(linearizability,又称原子一致性),强调操作是原子性的,在一个原子操作发生时数据项被修改,之后(带有时间语义)的读操作都能够获取最新的被写过的数据项的最新值。
  在分布式系统中,线性一致性强调的是在涉及的多节点且有多个事件发生时,不管是从哪个节点(副本)执行读操作,都能够读到按时顺序被修改后的值。
  如图1a所示,W(x)a先于W(x)b发生,则T3和T4只有读到的顺序R(x)a R(x)b才符合线性一致性。所以,线性一致性强调了实时排序的因素。

1.4 因果一致性

  因果一致性(causal consistency)是顺序一致性的弱化,它将事件分为因果相关和非因果相关两类。定义了只有因果相关的写操作才需要被所有进程以相同的顺序看到。
  在分布式系统中,最典型的案例是:创建一个用户,然后以此用户登录PostgreSQL系统,这两个动作间存在前后逻辑关系。如果从一个节点先进行登录,但是此节点却不知道用户的密码而导致无法登陆,必然会导致输入密码错误登录无果;事实是其他节点在创建用户的时候已经注册了密码,只是在这个节点上还未接收到来自其它节点注册密码的信息(数据)。

1.5 可串行化一致性

  如果事务调度的结果(例如,生成的数据库状态)等于其串行化的事务的结果,则事务调度是可串行化,也就是其具有可串行化的一致性,也就是说事务具有一致性。
  可串行化一致性是数据库范围内的事务一致性,其和分布式环境、并发环境下的一致性不同,它们也不可简单的放在一起比较。但是事务一致性和分布式一致性可以高度融合,成为一个新的一致性体系。

1.6 强一致性

  强一致性(strong consistency)是指所有访问能够被所有的并行节点(进程、处理器)以相同的顺序看到。
  从并发的角度看, 强一致性会使所有参与者观察到的结果相同,这是通过线性一致性和顺序一致性来保证的。
  强一致性强调的是从一个系统外部的角度看并发系统的数据是否处于一致的状态。所以对于一个分布式数据库系统而言,强一致性需要保证:系统既要满足事务的可串行化一致性又要满足分布式系统的一致性。

1.7 最终一致性

  最终一致性(eventual consistency)是分布式系统中用于实现高可用一致性,它非正式地保证:如果对给定数据项没有新的更新,那么最终对该项的所有访问都将返回最新的数据项。
  最终一致性服务通常被归类为提供BASE(基本可用、软状态、最终一致性),即基本的语义的服务,而不是提供传统的ACID保证。
  强一致性与最终一致性都是站在系统外部视角看待并发系统中的数据是否处于一致状态。但在最终一致性条件下,可能会在某些时间上存在不一致,随着时间的推移,最终会达成一致(比如多副本之间要达成一致,先让半数以上达成一致,剩余部分逐步达成一致)。

参考:分布式数据库原理、架构与实践,李海翔著.
该文为本人原创,转载请表明出处

你可能感兴趣的:(分布式,数据库架构,数据库开发)