Write-all-read-one:
-
WARO是一种最简单的副本控制规则,即在更新时写副本所有的副本,只有在所有副本更新成功,才认为更新成功,从而保证所有副本的一致性,这样读取时可以读取任何一个副本上面的数据。
-
需要一种机制当某次更新操作Wi一旦所有副本都成功,全局都能知道这个消息,此后读取操作指定读取数据版本为Vi的数据。
-
在工程实践中,这种机制往往比较难实现或者效率较低,通常方法就是将版本号信息存放在某个或某租元数据服务器上。记录更新成功的版本号Vi的操作将成为关键操作,容易成为瓶颈。因为更新需要全部副本成功才能成功,所有当副本不可用的情况,更新服务就不可用。读服务而言系统可以容忍N-1个副本异常。
Quorum:
-
Quorum是一种简单的副本管理机制,ES中默认就是这种机制。WARO牺牲了更新服务的可用性,最大程度的增强了读服务的可用性。Quorum在WARO之上做了限制而来。
-
约定:
-
更新操作是一系列顺序的过程,通过其他机制确定更新操作的顺序(如primary-secondary架构中的primary),每次更新记录操作记为Wi,i为更新操作单调递增的序号,每个Wi执行成功后副本数据都变化,称为不同数据版本,记为Vi。
-
在Quorum机制下面,当某次更新操作Wi一旦在所有的N个副本都成功,则认为更新操作为“成功提交的更新操作”,对于的数据为“成功提交的数据”。令R>N-W,由于更新在W个副本上面是成功的,所有最多读取R个副本则一定能读到Wi更新后的数据Vi。当W=N,R=1,就得到WARO。
-
仅仅依赖Quorum机制是无法保证强一致性的,因为Quorum机制无法确定最新已经提交的版本号,除非将最新已经提交的版本号作为元数据由特定的元数据服务器或者元数据机器管理。
如何读取最新成功提交的数据:
-
令N=5,W=3,R=3,某个时刻该副本最大版本号为(v2,v2,v2,v1,v1),读取三个副本不能判定v2一定是成功提交的版本。(v2,v2,v2,v1,v1)(v2,v1,v1,v1,v1)。对于强一致性系统,应该始终读取返回最新的成功提交的数据,在Quorum机制下面条件需要进一步限制。
-
2.1 若已经存在W个,则该数据是最新的成功提交的数据 (怎么确定是已经有W个了?)
-
2.2 若存在个数少于W个,为X个,继续读取其他副本,直到读取到W个该版本的副本,则认为是最新提交的数据。
-
1:限制提交的更新操作必须严格递增,即只有在前一个更新操作成功提交之后才可以提交后一个更新操作,从而保证提交的数据版本是连续增加的。
-
2: 读取R个副本,对于R个副本中版本号最高的数据,
基于Quorum机制选择Primary
-
在primary-secondary协议中primary复杂进行更新的同步的操作,限制加入Quorum机制,即primary成功更新W个副本后向用户返回成功。读取数据按照一致性的要求而不同。如果需要强一致性,读取primary本身就返回即可。如何需要会话一致性,根据之前读取到的版本号在各个副本进行选择性读取;如果只需要弱一致性则选择任意副本读取即可。
-
当primary异常需要选择一个新的primary,通常选择primary的工作需要某一个中心节点完成,在引入Quorum机制后,常用的primary选择方式与读取数据方式类似,即中心节点读取R个副本,选择R个副本中版本号最高的副本作为新的primary。新的primary至少与W个副本完成数据同步之后作为新的primary提高读写服务。