分布式高可用算法——统一共识

统一共识——定义

正则共识能够保证任何两个正确的进程都不会商定不同的决策值,但不能保证失败的进程在失败之前不会商定某个不同的决策值。

如算法 8-1 所示,如果进程 p 在商定决策值decision之后就立即失败了,那么它广播的消息[DECIDED,decision]很可能没有被任何进程接收到,因而在下一轮次的建议值集合中就可能没有进程p商定的决策值decision,从而可能导致除进程p以外的其他进程商定了与之不同的决策值。

算法 8-2 也有同样的问题,即当“一把手”进程 p 在商定决策值后就立即失败了,它广播的建议值没有被“二把手”进程q接收到,从而导致进程q和其他进程商定的决策值与进程p不同。

之所以会产生这一现象,主要是因为过早地商定了决策值,从而导致一旦该进程失败,其他进程可能因无法得知该进程所商定的决策值而只能商定其他值作为决策值。

下面要介绍的统一共识可以避免失败的进程商定不同的决策值这一问题。

抽象8-2定义了统一共识的接口和特性。

统一正则与正则共识的不同之处在于统一正则的UC4统一一致特性,该特性可以确保,对于任何两个进程p和进程q,只要它们商定了决策值,即使某个进程在商定后失败了,所商定的决策值也必然相同。

停止型失败算法:泛洪统一共识

算法 8-3基于泛洪实现了统一共识实例uc,适用于停止型失败模型,韧性f小于进程总数N。与算法 8-1的相似之处在于,该算法也需要进程多轮次的交换建议值。但为了满足 UC4 统一一致特性,该算法不再仅因连续两个轮次得到相同的集合receivedfrom,就从所接收到的建议值集合中通过决策函数得到决策值,而是固定地执行N个轮次,且在第N轮次时根据所获得的建议值集合,通过决策函数得到决策值。直观地看,即使每个轮次都有进程失败,最多只需要N个轮次。

由于算法 8-3 不再需要比较不同轮次之间的建议值集合,因此每个进程只需要维护一个本地集合proposalset即可。

正确性证明

(1)证明UC1终止特性。根据尽力广播的BEB1有效特性和完美失败检测的PFD1强完成特性,本地的变量round必然逐步增长到N,从而正确的进程必然会商定某个决策值,故满足UC1终止特性。得证。

(2)证明UC2有效特性。显然,由于决策函数为min函数,必然从各个进程提出的建议值中产生决策值,故满足UC2有效特性。得证。

(3)证明UC3完整特性。显然,当某个进程商定决策值之后,变量decision不再是⊥,因此该进程不会重复商定,故满足UC3完整特性。得证。

(4)证明UC4统一一致特性。采用反证法。记系统中所有进程集合为Π,集合Π的大小为N,集合U中的进程商定了值v(无论商定之后是否失败),集合W中的进程在商定前就失败了。假设存在一个集合V,该集合V中的进程商定的值非v(无论商定之后是否失败)。不失一般性,假设v值小于集合V商定的值(非v值)。

通过这个假设可知,集合U≠∅,集合V≠∅,U∩V=∅,W=Π-U-V,N>2,|W|≤N-2,集合U中的进程接收到了值v,集合V中的进程从未接收到值v。

如果值v是集合U或V中的某个进程的建议值,那么第1轮次之后,所有正确的进程都接收到了值v,因此集合V内的进程也接收到了值v,矛盾。因此,值v不可能是集合U或集合V中某个进程的建议值。

如果值v是集合W中某个进程p1的建议值,那么,即使在第1轮次中进程p1在将值v发送给进程p2之后就失败了;在第2轮次中,进程p2在将值v发送给进程p3之后就失败了;……;在第|W|-1轮次中,进程p|W|-1在将值v发送给进程p|W|之后就失败了;在第|W|轮次中,进程p|W|必然将值v至少发送给集合U或集合V(记为U∪V)中某个进程q之后才失败,否则集合U不会有任何进程商定值v。在第|W|+1轮次中,无论进程q属于集合U或集合V,都将值v广播到集合U和集合V中的所有进程,那么从第|W|+2轮次开始起,集合U和集合V中所有进程的集合proposalset中都已经有了值v。又由于|W|≤N-2,因此从第N轮次开始时,集合U和集合V中所有进程的集合proposalset中都已经有了值v,矛盾。因此值v不可能是集合W中的某个进程的建议值。

而值v不是集合U或集合V或集合W中的进程的建议值,这显然是不可能的。因此不存在这样一个集合V,其中的进程商定的值非v。得证。

性能分析

该算法需要N个轮次,通信次数为N。该算法的消息个数的复杂度为O(N 3)。

为了更好地理解统一一致特性,可以考虑这样一个最极端的情况:在第1轮次中,进程 p1将自己的建议值 v1发送给进程 p2后就立即失败了,那么系统中除了进程 p2的集合proposalset是{v1,v2,…,vn},其他进程的集合proposalset都是{v2,…,vn};在第2轮次中,进程p2将{v1,v2,…,vn}发送给进程p3后就立即崩溃了,那么系统中除了进程p3的集合 proposalset 是{v1,v2,…,vn},其他进程的集合 proposalset 都是{v2,…,vn}。如此下去,在第N-1轮次中,进程pN-1将{v1,v2,…,vn}发送给进程pN后就立即崩溃了,那么系统中除了进程pN的集合proposalset是{v1,v2,…,vn},其他进程都失败了。如果在第N轮次中,进程pN也失败了,则没有进程商定决策值,否则只有进程pN将商定决策值v1。可以看出,为了防止这种极端的情况出现,该算法必须执行N个轮次。

停止型失败算法:等级统一共识

与算法 8-2类似,算法 8-4也采用了基于等级的思想实现了统一共识实例uc,适用于停止型失败模型,韧性f小于进程总数N。但在算法 8-2中,一把手把自己的建议值广播出去之后,未确认其他与会者是否收到它的建议值,就立即商定自己的建议值,这就导致了算法 8-2不满足UC4统一一致特性。

为了满足UC4统一一致特性,在算法 8-4中,一把手不会向所有与会者广播一声“我的建议是1”之后就立即商定决策值1,而是在接收到每个与会者的消息[ACK]或检测到该与会者失败后,将自己的建议值1通过正则可靠广播实例rb再次广播出去,此时通过实例rb 接收到建议值1的所有进程都将商定决策值1。具体算法过程如下。

在开会之前,虽然每个人都有自己内心的建议值,但最终的决策值仍然以级别高的与会者为准。

一把手知道自己是一把手,于是跟在场的所有与会者广播一声“我的建议是 1”(该算法中的消息[PROPOSAL]),然后等待所有与会者的反馈。与会者接收到一把手的广播后,会自觉地把值1作为自己的建议值。如果有的与会者离席了(进程失败了),那么一把手会通过完美失败检测实例P将离席者放入集合detectedranks中;如果接收到与会者发送的消息[ACK],则将该与会者放入集合ackranks中。当detectedranks∪ackranks={1,2,…,N}时,即一把手接收到了除离席者外所有与会者的消息[ACK],就通过实例rb通知所有与会者商定决策值1(该算法中的消息[DECIDED])。所有通过实例rb接收到消息[DECIDED]的进程都将商定决策值1。

如果一把手离席(进程失败)了,可能出现如下的情况。

情况一:一把手尚未向所有与会者广播“我的建议值是 1”。此时,没人接收到一把手的建议值,那么二把手最终会看到一把手的离席(检测到一把手进程失败),于是向所有的与会者广播“我的建议值是2”(该算法中的消息[PROPOSAL])。当二把手接收到除离席者外所有其他与会者发送的消息[ACK]后,就通过实例 rb 通知所有的与会者商定决策值2(该算法中的消息[DECIDED])。所有通过实例rb接收消息[DECIDED]的进程都将商定决策值2。

情况二:部分与会者接收到了一把手广播的“我的建议值是1”的消息,但二把手未接收到。那么二把手会最终看到一把手的离席(检测到一把手进程失败),于是向所有的与会者广播“我的建议值是2”(该算法中的消息[PROPOSAL])。当二把手接收到除离席者外所有其他与会者发送的消息[ACK]后,就通过实例 rb 通知所有的与会者商定决策值 2(该算法中的消息[DECIDED])。所有通过实例 rb 接收到消息[DECIDED]的进程都将商定决策值2。

情况三:二把手接收到了一把手广播的“我的建议值是1”的消息。此时,二把手会默默地把自己的建议值(变量proposal)改成1。当二把手在看到一把手离席(检测到一把手进程失败)之后,向所有的与会者广播“我的建议值是 1”(该算法中的消息[PROPOSAL])。当二把手接收到除离席者外所有其他与会者发送的消息[ACK]后,就通过实例rb通知所有与会者商定决策值1(该算法中的消息[DECIDED])。所有通过实例rb接收到消息[DECIDED]的进程都将商定决策值1。

情况四:一把手通过实例 rb 通知所有与会者商定决策值 1(该算法中的消息[DECIDED])之后。此时,如果有一个与会者商定决策值1,那么它必然通过实例rb接收了消息[DECIDED]。根据正则可靠广播的RB4一致特性可知,其他未离席的与会者终将通过实例 rb 接收消息[DECIDED],进而将商定决策值 1。如果没有任何与会者商定决策值 1,那么可视为一把手尚未通过实例 rb 通知所有的与会者商定决策值1(该算法中的消息[DECIDED]),此时的情况与情况三相同。

无论上述哪种情况,只要有与会者商定了某个决策值,那么其他未离席的与会者都将商定相同的决策值。

正确性证明

(1)证明UC1终止特性。根据尽力广播的BEB1有效特性和完美失败检测的PFD1强完成特性,等级最高的进程要么接收到某个进程发送的消息[ACK],要么检测到该进程的失败,必然满足detectedranks∪ackranks={1,…,N},从而通过实例rb向所有进程发送消息[DECIDED]。又根据正则可靠广播的RB1有效特性可知,每个正确的进程必将商定决策值,故满足UC1终止特性。得证。

(2)证明UC2有效特性。显然,该算法中所有可能的决策值都来源于某个等级高的进程的建议值,故满足UC2有效特性。得证。

(3)证明UC3完整特性。显然,仅当变量decision为⊥时,才有可能商定决策值,而且在商定决策值之前就对变量decision赋值了,因此不可能再次商定决策值了,故满足UC3完整特性。得证。

(4)证明UC4统一一致特性。假设进程p是第一个进行到通过实例rb发送消息[DECIDED]这一步的进程,那么只要有一个进程r商定了决策值v,该进程r必然通过实例rb接收了消息[DECIDED,v]。根据正则可靠广播的RB4一致特性,如果该进程r没有失败,那么其他所有未失败的进程必将通过实例rb接收消息[DECIDED,v],进而商定决策值v,满足统一一致特性。

如果该进程r在商定决策值v之后失败了,那么仅根据正则可靠广播的RB4一致特性,并不能保证其他正确的进程一定会通过实例 rb 接收消息[DECIDED,v]。但在这一轮次中,系统中所有正确的进程都接收到了进程p广播的消息[PROPOSAL,v],并把进程本地的变量proposal赋值为值v了。在下一轮次中,另一个进程q也只能将值v作为自己的建议值广播消息[PROPOSAL],从而系统中其他正确的进程只能商定决策值v,满足统一一致特性。得证。

性能分析

如果不发生进程失败的情况,该算法需要三次通信,第一次是等级最高的进程广播消息[PROPOSAL],第二次是接收消息[ACK],第三次是正则可靠广播,故消息个数的复杂度为O(N)。

如果发生了进程失败,且失败的是等级最高的进程,则每次失败都将额外增加两次通信,一次是广播消息[PROPOSAL],另一次是接收消息[ACK],因此消息个数的复杂度仍为 O(N)。如果进程失败了,但失败的不是等级最高的进程,而只是一个普通的进程,这种情况与不发生进程失败的情况相似,消息个数的复杂度仍为O(N)。

但如果在正则可靠广播阶段出现了进程失败,且失败的是等级最高的进程,由于正则可靠广播的消息个数的复杂度也将升高为O(N 2),从而整个算法的消息个数的复杂度也升高为O(N 2)。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值