您的位置:首页 > 其它

Zookeeper之Zab协议介绍(二)

2012-08-11 08:54 344 查看

系统模型

一个Zab系统由一组进程组成II = {p1, p2, ..., pn},每个进程都配有一个稳定的存储设备。进程以一个不停的循环方式进行处理,并通过交换消息方式进行相互通信。分布式情况下,进程可能不断地崩溃,恢复。只要不崩溃,我们认为进程处于up状态,否则就处于down状态。我们假定,最终会有足够多的进程处于up状态,并持续足够长的时间。事实上,只要超过多数的进程处于up状态足够长时间,并且能相互传递消息以进行通信,那么系统就能开始工作了。对于基于II的法定人数系统,其定义如下:



进程之间通过双向的信道来交换消息。更准确地说,位于进程Pi和Pj之间信道Cij,对于Pi和Pj中任何一个都有一对缓存,即输入缓存和输出缓存。事件send(m,Pj),表示将消息m发送给进程Pj。消息m会被插入到Pi的信道Cij的输出缓存。消息以被发送的次序传送,并被插入到Pj的输入缓存。事件recv(m,Pi),表示进程Pi从它的输入缓存读取下一个消息m。

为了描述信道的特性,我们采用词汇-循环(iterations),因为其算法是采用循环来进行处理。每个循环都有三个阶段(phases)。让S(i,j,k,k')表示进程Pi在第k循环发时,发送给处于第k'循环的进程Pj的所有消息的系列。我们假定,Pi和Pj之间的信道满足一下特性:

完整性(Integrity):

仅当进程Pi发送了消息m,进程Pj才会从与Pi通信的信道接收到消息m。

前缀性(Prefix):

如果进程Pj接收到了消息m,并且存在消息m',也同属于消息序列S(i,j,k,k'),且m'的序列号小于m,那么消息m'必定先于消息m被Pj接收。

单次循环性(Single iteration):

对于信道Cij,进程Pj的输入缓存只包含一次循环处理的消息。

信道的实现

为了实现以上的特性,我们为信道定义其状态,保证其活性(liveness)。实际上,我们采用TCP连接。在一个新的循环开始,我们会建立Pi和Pj之间的连接。这么做,我们就保证只有被Pi发送的消息才会被Pj接收(完整性);消息序列的前缀一定会被接收;每次创建新的TCP连接,以保证一个消息序列只在一个循环里被处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: