Quorum机制是一种分布式系统中常用的,用来保证数据冗余和最终一致性的投票算法 其主要数学思想来源于鸽巢原理1。
Quorum机制定义
我们普遍使用副本(Replication)技术来保证一致的性能和高可用性2,Quorum是一种简单有效的管理副本的机制,我们先建立如下定以([2]中也有描述):
N = 存储数据副本的节点的数量
W = 更新成功所需的副本更新成功的数量
R = 一次数据对象读取要访问的副本的数量
更新时,只有至少W副本更新成功时才算更新操作成功;读取时,至少要读取R个副本的数据。这样当W + R > N时,对于同一个数据对象,更新集合与读取集合一定有重叠,保证了读取的数据中一定有最近更新的值。
WARO (Write All Read One)
WARO是Quorum机制的特例(GFS使用WARO),也就是更新时必须所有的副本都更新成功,而读取 时只需要读取一个副本的数据就可以。
Quorum机制与一致性
Quorum本身无法保证强一致性,除非有一个获取最新成功提交的版本号的metadata服务;假设$N = 5, W = 3, R = 3$,数据V2提交成功但是只在三个副本真正更新了,副本中数据分布是[V2, V2, V2, V1, V1],那么客户端可能读到[V2, V2, V1],也可能读到[V2, V1, V1];注意这里的版本V1,V2是数据本身的版本号不是最新成功提交的版本号,所以无法确认是V1还是V2;如果要保证强一致性必须继续读取副本,来确定最新至少写入的W个副本也就是提交成功的数据。