系统分布式下的分布式一致性与复制

    作者:课课家教育更新于: 2018-03-20 11:13:11

      随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。

      小编今天要讲的就是分布式一致性与复制相关内容~~

    系统分布式下的分布式一致性与复制_数据库_系统分布式_数据复制_课课家教育

      一、数据复制的好处

      分布式系统中数据的复制是为了提高系统的可靠性、性能。

      实现数据复制的难点:保持各个副本间的一致性。

      首先:数据复制可以提高系统可靠性,一个副本失效后,可以转换到另一个副本继续运行;通过多个副本可以对数据提供更好的保护。

      第二:提供性能,利用不同地理位置的副本迅速响应;利用不同的副本分担工作负荷。

      二、数据复制付出的代价

      复制带来的多个拷贝可能导致一致性方面的问题。

      多个拷贝间要保持一致性,需要进行数据同步,要付出代价。

      三、以数据为中心的一致性模型

      一致性模型实质上是进程和数据存储之间的一个约定。正常情况下,一个数据项上执行读操作时,它期待该操作返回的是该数据在其最后一次写操作之后的结果。

      在没有全局时钟的情况下,精确的定义哪次写操作是最后一次写操作是十分困难的。于是就产生了一系列用其他方式定义的一致性模型。

      1.严格一致性:对于数据X的读操作,将返回最近一次对X进行写操作的结果所对应的值。严格一致性依赖于绝对时间,在分布式系统中不可能实现。

      2.顺序一致性:与严格一致性相比,顺序一致性要求稍弱。

      数据存储满足一下条件时,称为顺序一致:任何执行结果都是相同的,好像所有进程对数据存储的读、写操作是按某种序列顺序执行的,并且每个进程的操作都是按照程序所制定的顺序出现在这个序列中。

      3.因果一致性,一种弱化的顺序一致性

      如果数据存储是因果一致性的,必须满:所有进程必须以相同的顺序看到潜在因果关系的写操作,不同机器上的进程可以不同的顺序被看到并发的写操作。

      4.FIFO一致性

      在因果一致性模型上的进一步弱化,要求由某一个使用者完成的写操作可以被其他所有的使用者按照顺序的感知到,而从不同使用者中来的写操作则无需保证顺序,就像一个一个的管道一样。相对来说比较容易实现。

      5.弱一致性

      要求对共享数据结构的访问保证顺序一致性。对于同步变量的操作具有顺序一致性,是全局可见的,且只有当没有写操作等待处理时才可进行,以保证对于临界区域的访问顺序进行。在同步时点,所有使用者可以看到相同的数据。

      6.释放一致性

      弱一致性无法区分使用者是要进入临界区还是要出临界区,释放一致性使用两个不同的操作语句进行了区分。需要写入时使用者acquire该对象,写完后release,acquire-release之间形成了一个临界区,提供释放一致性也就意味着当release操作发生后,所有使用者应该可以看到该操作。

      7.入口一致性

      入口一致性要求每个普通的共享数据项都要与某种同步变量关联。

      数据存储满足下列条件,那么它符合入口一致性:

      在一个进程获取一个同步变量签,所有由此同步变量保护的共享数据的更新都必须已经由相应进程执行完毕。

      在一个进程对一个同步变量的独占访问被允许前,其他进程不可以拥有这个同步变量,也不能以非独占方式拥有这个同步变量

      一个进程对一个同步变量执行独占访问之后,对该同步变量的所有者进行检查之前,任何其他的进程都不能执行下一个独占访问。

      四、以客户为中心的一致性模型

      前面的以数据为中心的一致性模型:目的在于从数据存储角度提供系统级别的一致性。一个重要的假设是并发进程可能同时更新数据存储,在发生这种并发更新时,必须提供一致性。

      维护共享数据的顺序一致性的同时能够处理共享数据上的并发操作,对于分布式系统而言非常重要。可能只有在使用诸如事物处理和锁一类的同步机制时,系统才能保证顺序一致性。

      下面我们讨论的数据存储的特点是:不会同时发生更新操作,或者同时发生更新操作时,可以很容易的化解。

      一种很弱的一致性模型:最终一致性。

      最终一致性:如果很长一段时间内没有更新操作,那么所有的副本将最终成为一致。没有更新操作时,所有副本逐渐变成相互完全相同的拷贝。实现开销通常较小。

      问题:客户访问同一副本,没有不一致性,如果客户访问不同副本,可能出现不一致。

      1.单调读:

      单调读一致性:如果一个进程读取数据项X的值,那么该进程对X执行的任何后续读操作总是得到第一次读取的那个值或更新的值。

      2.单调写

      写操作以正确顺序传播到所有拷贝。单调写一致性的数据存储满足一下条件:

      一个进程对数据项X执行的写操作必须在该进程对X执行任何后续写操作前完成。

      3.写后读一致性:

      一个进程对数据项X执行一次写操作的结果总是会被该进程对X执行的后续读操作看见。

      4.读后写一致性:

      同一进程对数据项X执行的读操作之后的写操作,保证发生在于X读取值相同或比其更新的值上。

      五、副本放置

      1.放置的三个方法

      永久副本(Permanentreplica)也就是选几个固定位置放置副本,或者说做镜像

      服务端发起(Server-initiated)也就是服务端决定什么时候向什么地方分发副本,或者pushcache

      客户端发起(Client-initiated)也就是客户端缓存(clientcache)

      2.更新传播

      ①传播什么?

      可以是更新的通知(客户自己来取)

      可以是更新后的数据

      可以是更新的操作

      ②谁来传播

      服务器push或客户pull

      ③传播协议?

      保证最终会收敛到一致

      3.复制协议(ReplicationProtocols)

      ①远程写(Remote-Write)协议

      对于数据x有一个主副本,当没有x副本的服务器操作x的时候就会得到一个x的副本。而有x副本的服务器响应客户读请求的时候可以立刻返回。而当客户进行写操作的时候,写操作首先在主副本完成,然后再通知其他副本更新。

      ②本地写(Local-Write)协议

      和远程写比较类似,不同点是当一个服务器得到了副本以后就成了新的主副本,以后的写操作首先在本地完成,然后再通知其他的副本,本地写的名字由此而来。

      ③主动复制(ActiveReplication)

      对于副本的操作要设计到另外一个单一对象。比如,n个副本代理对象C的一个接口,如果向所有副本发出请求,每个副本都会发一个请求到C,那么同样的操作就执行了n次。所以需要一个协调者。另外,多副本返回值的时候也会有同样的情况。所以这种只执行一次的动作需要副本种有一个协调者,保证操作只被执行一次或者只返回一次。

      ④基于候选团(Quorum-Based)协议

      也就是读操作要得到Vr个服务器的同意,写操作要得到Vw个进程的同意。总共有V个进程。Vr和Vw要满足以下条件:

      Vr+Vw>V这样就不可能同时发生读写,并且读到的server肯定有一个以上被更新过的

      Vw>V/2这样就不可能同时发生两个写

      也就是类似于投票获得读写的锁。另外就是雀巢原理保证总会看到最新的版本。

课课家教育

未登录