Page 178 - 《软件学报》2021年第6期
P. 178

1752                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

                     如果回复中不包含任何提议,则提议者可以任选一个值(通常是该提议者收到的用户命令);否则,
                     提议者选择编号最大的回复对应的值.设提议者选择的值为 v,则提议者向所有接受者发送内容
                     为〈b,v〉的 Accept 请求;
                 ¾   子阶段 Phase2b:接受者收到编号为 b 的 Accept 请求.如果接受者没有收到过编号大于 b 的请求,
                     则可以接受该 Accept 请求;否则,接受者忽略该 Accept 请求.
         1.4   Multi-Paxos协议
             Multi-Paxos 针对每个日志项运行一个独立的 Paxos 实例,从而支持副本服务器对日志(日志项的序列)达成
         共识.由于各个 Paxos 实例是并行独立运行的,Multi-Paxos 允许乱序提交用户命令.也就是说,它允许副本服务器
         先就编号较大的日志项对应的用户命令达成共识,而无需等待之前的日志项完成共识.
             在实际实现时,常常通过将 phase1 的消息分批(batching)的方式提高性能.此时,系统包含一个恢复阶段,恢
         复阶段本质上是将不同实例的 phase1 消息集中处理的过程.
             模块 MultiPaxos 描述了 Multi-Paxos 协议.其中包括 3 个常量.
             •   Acceptors:所有接受者构成的集合;
             •   Value:所有可能的提议值构成的集合;
             •   Nil:特殊记号,不属于 Value.
             我们使用自然数表示可能的提议编号以及每个实例的编号,即 Ballots Nat,Instances Nat.Quorums 定义了
         一种特殊的议会系统(quorum system):它的每个元素都是由超过半数的接受者构成的集合.
             Multi-Paxos 的规约中包括 6 个变量.
             •   ballot:ballot[a]表示接受者 a 记录的最大的提议编号,也是 a 可以接受的最小的提议编号;
             •   vote:vote[a][i][b]表示接受者 a 对编号为 i 的实例在 a 的提议编号为 b 时接受的提议值.如果 a 在提议
                编号为 b 时,没有对编号为 i 的实例接受任何值,则 vote[a][i][b]=Nil;
             •   leaderVote:leaderVote[b][i]为提议者在提议编号为 b 时,为编号为 i 的实例提出的值与提议编号 b 组成
                的二元组.初始状态下,对所有的提议编号 b 与实例编号 i,leaderVote[b][i]=〈−1,Nil〉;
             •   1amsgs,1bmsgs,2amsgs:不同类型的消息集合.
             ----------------------------- MODULE MultiPaxos -----------------------------------
             EXTENDS Integers, FiniteSets
             CONSTANTS Acceptors, Nil, Value
             Ballots==Nat
             Instances==Nat
             Quorums=={Q\in SUBSET Acceptors: Cardinality(Q)>Cardinality(Acceptors)\2}
             Max(s)==CHOOSE x\in s:\for all y\in s:x\geq y
             VARIABLES ballot, vote, leaderVote, 1amsgs, 1bmsgs, 2amsgs
             -------------------------------------------------------------------------------------------------
             协议定义的主要动作包括:
             •   Phase1a(b):对应 Paxos 的 Phase1a 阶段.提议者选取提议编号 b,并且向其他节点发送 Prepare 请求,提
                议的编号为 b;
             •   Phase1b(a,b):对应 Paxos 的 Phase1b 阶段.节点 a 收到编号为 b 的投票请求.若 b>ballot[a],a 设置
                ballot[a]为 b,并且对于每一个实例编号 i,a 将它接受过的提议编号最大的提议值与提议编号回复给提
                议者.
             --------------------------------------------------------------------------------------------
             Phase1a(b)==
               /\1amsgs′=1amsgs\cup {〈〈b〉〉}
   173   174   175   176   177   178   179   180   181   182   183