Zookeeper之Zab协议介绍(四)

A.     核心特性

ZooKeeper要求以下特性来维护所有进程的一致性:

完整性:如果某进程采用了<v,z>的状态变化,那么一定存在一个进程Pi∈П,Pi已经广播过了<v, z>的状态变化

全序性(totalorder):如果某进程在采用<v, z>之前先采用了<v’,z’>,那么任何其他进程在采用<v’, z’>时,<v, z>必须已被采用

 

这两个特性保证了任何事物不会被自发创建(created spontaneously)或被破坏,并且进程在处理事务时,必须按照一致的次序采用。然后,全序性的特性,还是可以允许两个进程以不同的事务序列进行采用。为了避免不希望的处理发生,我们进一步要求以下特性:

一致性(agreement):如果进程Pi正在采用<v, z>,另一个进程Pj正在采用<v’, z’>,那么Pi已采用了<v’, z’>或者Pj已采用了<v, z>。

 

需要注意的是,一致性的表述,是和先前的论文是不同的。在先前的论文里,一致性已经被表述成针对原子广播的一个活性(liveness)特性,是一种抽象。而这里,我们把一致性描述成一个安全特性,它保证两个进程的状态不会存在分歧。我们在第四和第五章讨论活性(liveness)。

 

以上三个安全特性保证所有进程的一致性。然而,我们还需要满足一个特性,从而使得来自一个主进程同时处理多个状态变化。由于每个状态变化都是基于前一个状态。如果之前的状态变化被忽略了,那依赖于它的状态变化也必须忽略。我们把这个特性叫做主次序(primary order)。我们把它分成两个部分:

 

本地主次序(Local primaryorder)

如果主进程早于<v’, z’>广播了<v, z>,那么一个进程,如果它采用<v’,z’>,那么它必须早于<v’, z’>已采用了<v, z>。

 

全局主次序(Global primaryorder)

设状态变化<v, z>和<v’, z’>如下:

  • 主进程ρi广播了<v, z>
  • 主进程ρi,ρi < ρi,广播了<v’, z’>

如果进程Pi∈П,它采用了<v, z>和<v’, z’>,那么Pi必须先于<v’, z’>采用了<v, z>。

 

请注意,本地主次序对应于单个主进程的FIFO次序,而全局主次序是为了避免下图出现的情况:

 Zookeeper之Zab协议介绍(四)_第1张图片

最后,主进程必须得保证,所产生的状态更新必须是一致的。因此,主进程只有采用了之前的所有事务,才可以进行下一轮的状态更新广播。这个行为是由下面的特性来保障的:

主完整性(primary integrity)

如果主进程ρe广播<v,z>,有某进程采用<v’, z’>,而<v’,z’>是由另一个主进程ρe广播的,且e’< e,那么ρe必定先采用了<v’,z’>,然后才广播<v,z>。

 

 

 

 


你可能感兴趣的:(Zookeeper之Zab协议介绍(四))