基于Quorum机制的强一致性存储方案

在线上生成环境用一台服务器提供数据服务时,我们会担心这台服务器停机,造成服务不可用或数据丢失,通常我们对数据进行冗余存储,保障数据服务的高可用性。

 

但加入更多的机器,会带来数据一致性的问题,下面我们来了解一个基于Quorum机制的强一致性存储方案。

 

三机Quorum机制

Quorum即多数派原则,与投票选举的方式类似,被多数同意的一项操作即可获得通过。

 

本文讨论基于三机的Quorum机制,我们称这三台机为A机、B机、C机。其中A、B机用于数据存储,称为数据机。当写请求落到A机时,是否能真正写入数据,至少需要获得B机或C机一方的认可;当请求同时落到A、B机,这时需要第三方仲裁,这就是C机的作用。

 

读写操作需要在最新的一份数据上进行,为标识哪一台数据机上的数据为最新,我们引入版本号,每一条数据记录,不单存储数据本身,同时存储本机和另一台数据机的相应版本信息:

基于Quorum机制的强一致性存储方案

当各机上的verA = verB时,认为各机数据一致并且都是最新数据;当verA > verB时,则认为A机上的数据最新。实际应用中通过提议、协商、同步和广播四个过程维护数据与版本信息,以数据写入A机为例,我们来看具体的写入过程。

 

提议与协商

对key写请求落到A机,将经历以下流程:

  1. 首先A检查key对应的版本号,当满足verA >= verB时,数据写入A机的请求获得自己的通过,并向B机、C机发送请求询问是否可以进行写入(提议)
  2. B机(C机)检查本地key对应的版本号,也满足verA >= verB时,告知A机可进行写入(协商)
  3. A机获得B机或C机一方通过,即可进行数据写入,同时提升各机key相应的版本号verA

 

经过以上步骤,A机上key相应的数据B机上的不一致,并且各机上verA > verB。进一步地,我们通过同步与广播更新B机、C机信息。

 

同步与广播

A机数据更新后,将对B机同步数据;B机完成数据更新后会提升本机版本号,还会将该变动同步给A机、C机,具体过程如下:

  1. B检查本地key对应的版本号,当满足verA > verB时,允许同步数据写入本地、提升verB;当verA = verB时,交由C机仲裁,C.verA > C.verB时,同样允许数据写入本地、提升verB,否则返回错误(同步)
  2. 更新成功后,B广播自己的版本号,A.verB、C.verB都将得到提升,之后三机恢复平衡状态(广播)

同步与广播用图示表示如下:

基于Quorum机制的强一致性存储方案

 

读流程

三机Quorum下读流程较写流程简单,但也有一个问询过程,具体如下:

  1. 读请求落到A机时,如果A.verA < B.verB,则返回错误
  2. 如果A.verA >= B.verB,还需要询问B、C机,是否同意verA为最新,为最新则返回数据

 

小结

三机Quorum提供了两数据机存储冗余的实现方案,一次写操作后,读将获取到最新数据,因而它符合强一致性。Quorum机制也可以进行扩展,例如3数据机+5版本机,以满足更多份数据冗余存储需求。

你可能感兴趣的:(一致性)