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

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

         些可能已被提交但新任主节点缺失的日志项.
             经过恢复,新任主节点满足完全性,此时可以向从节点同步日志项.
             ParallelRaft-SE 的规约中使用了如下的常量与变量(仅介绍相对于 Multi-Paxos 模块新引入的部分).
             •   Server 是所有参与共识的节点的集合;
             •   Follower,Candidate,Leader 是服务器的 3 种不同状态;
             •   r1amsgs,r1bmsgs,r2amsgs,r2bmsgs,r3amsgs,negMsgs 是不同类型的消息的集合;
             •   currentTerm[i]为节点 i 所记录的最大的任期;
             •   currentState[i]为节点 i 的状态,在任何时候都是 Follower,Candidate,Leader 之一;
             •   vote[i][n][t]表示节点 i 在任期 t 接受的序号为 n 的日志项.引入 vote 是为了构建 ParallelRaft-SE 到
                Multi-Paxos 的精化,实际协议中不需要 vote;
             •   leaderLog 记录了每个任期的主节点的日志.leaderLog 同样是为了构建 ParallelRaft-SE 到 Multi-Paxos
                的精化,实际协议中不需要.leaderLog[t][n]表示任期 t 的主节点的日志中编号为 n 的日志项.每个日志
                项是形如〈t′,v,b〉的三元组.其中,t′是日志项的任期;v 是提议值;b 是一个布尔值,当且仅当日志项被提交
                时,b 为真;
             •   log[i][n]为节点 i 的日志中编号为 n 的日志项.
             ---------------------------------- MODULE ParallelRaft-SE ----------------------------
             EXTENDS Integers,FiniteSets,Sequences,TLC
             CONSTANTS Server,Follower,Candidate,Leader,Nil,Value

             Quorums=={i\in SUBSET(Server):Cardinality(i)*2>Cardinality(Server)}
             Index==Nat
             Term==Nat

             VARIABLE r1amsgs,r1bmsgs,r2amsgs,r2bmsgs,r3amsgs,negMsgs,
                       currentTerm,currentState,vote,leaderLog,log
             serverVars==〈〈currentTerm,currentState〉〉
             vars==〈〈r1amsgs,r1bmsgs,r2amsgs,r2bmsgs,r3amsgs,negMsgs,log,
                   serverVars,leaderLog,vote〉〉
             ------------------------------------------------------------------------------------------------------
             主要的动作包括:
             •   Timeout(i):从节点或候选节点 i 因未收到来自主节点的消息而超时,则增大自身任期(currentTerm′[i]=
                currentTerm[i]+1),将状态转变为选举者(currentState′[i]=Candidate);
             •   RequestVote(i):候选节点 i 向其他节点发送自身任期,发起选举请求;
             •   HandleRequestVote(i):节点 i 收到选举请求 m,如果 m 携带的任期大于 i 的任期(m[1]>currentTerm[i]),
                则 i 升级任期,接受该选举请求,并将自己的日志发送给候选节点;否则,i 拒绝该选举请求.
             ------------------------------------------------------------------------------------------------------
             Timeout(i)==
               /\currentState[i]\in {Follower,Candidate}
               /\currentTerm′=[currentTerm EXCEPT ![i]=currentTerm[i]+1]
               /\currentState′=[currentState EXCEPT ![i]=Candidate]
               /\UNCHANGED 〈〈r1amsgs,r1bmsgs,log,r2amsgs,r2bmsgs,r3amsgs,
                              negMsgs,leaderLog,vote〉〉
   177   178   179   180   181   182   183   184   185   186   187