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

谷晓松  等:支持乱序执行的 Raft 协议                                                           1751


         定性质.然而有些分布式系统包含无穷的状态,比如 TLA+规约中常常包含自然数,而自然数是无穷的.为了验证
         这样的系统,TLA+引入模型(model).模型所有的集合都是有穷的,因此系统的状态数目是有穷的.模型检验常常
         面临组合爆炸的问题,为此,TLC 可以利用模型中的对称性缩减状态空间.例如,假设 CONSTANTS Server 定义了
         系统中所有进程的集合.在进行模型检验时,我们需要将它实例化为一个有穷的集合,比如 Server={S 1 ,S 2 ,S 3 }.如
         果 S 1 ,S 2 ,S 3 之间的任意排列(比如 S 1 替换 S 2 ,S 2 替换 S 3 ,S 3 替换 S 1 )都不会影响系统规约满足给定的性质,那么我们
         可以将 Server 设置为对称集(symmetry set)   [13,21] .
             在 TLA+中,精化(refinement)关系  [12] 用来描述模块之间的逻辑蕴含(logical implication)关系     [18] .精化关系由
         精化映射(refinement mapping)定义.比如,一个由模块 ImplModule 中的 ImplSpec 规约到模块 AbsModule 中的
         AbsSpec 规约的精化映射φ将 AbsSpec 中的每个变量 v 对应于一个表达式 ,vv 由 ImplSpec 中的变量定义.对于
         ImplSpec 的每一个状态 s,精化映射φ定义了 AbsSpec 的状态 ,s s 中的每个变量 v 的值由 s 中的 v 定义.若σ为
         ImplSpec 的行为 s 1 →s 2 →…,我们定义 AbsSpec 的行为 σ    : s →  s →  ... .ImplSpec 在精化映射φ下实现/精化了
                                                         1   2
         AbsSpec(ImplSpec⇒AbsSpec)当且仅当对于任何一个满足 ImplSpec 的行为σ,行为σ 满足规约 AbsSpec           [14] .为了使
         用 TLC 检验在精化映射φ下,ImplSpec 到的精化关系,我们在模块 ImplModule 中添加了定义 AbsSub INSTANCE
         AbsModule,并检验定理 THEOREM ImplSpec⇒AbsSub!AbsSpec   [18] .
         1.2   分布式共识

             分布式共识要求多个副本服务器节点保持状态一致.每个服务器节点可以建模为一个复制状态机,通过执
         行用户命令进行状态转换.
             通常使用复制日志的机制实现复制状态机.每个服务器保存一份日志.日志由按顺序编号(通常是自然数)
         的日志项组成.每个日志项存储了一条来自用户的命令.服务器每次按顺序从日志中读取下一条已经取得共识
         的命令,在状态机上执行,并将结果返回给用户.由于服务器按照编号顺序执行一条命令,我们称此为顺序执行.
         传统的分布式共识协议(Multi-Paxos,Raft)都是顺序执行.在此条件下,我们假设副本服务器上的复制状态机具
         有相同的初始状态,那么只需要保证日志之间的一致性,就可以保证服务器之间的状态一致.因此,分布式共识
         问题可以转化为保证不同副本服务器节点上日志之间的一致性.具体而言,它要求:
             •   非平凡性(nontriviality):只能对用户发出的命令取得共识;
             •   一致性(consistency):每个位置最多只能对一条命令取得共识.
             服务器通过运行共识协议保证日志的一致性.本文考虑异步消息传递系统中的共识协议,其故障模型
         (failure model)如下.
                                                              [8]
             •   服务器可能终止执行(fail by stop),但不会出现拜占庭错误 ;
             •   消息可能被延时、乱序到达、丢失或重复,但消息的内容不会被篡改.
         1.3   Paxos协议
             Paxos 协议是解决分布式共识问题的经典协议,它允许一组服务器对单个值(即单个日志项)取得共识,是
         Multi-Paxos 的基础.Paxos 中定义了 3 种角色:提议者(proposer)、从节点(acceptor)和学习者(learner).提议者提出
                                                                                      [8]
         值(value),接受者选择值,学习者学习被选中的值.Paxos 包括两个阶段,每个阶段又包括两个子阶段 .
             •   准备(prepare)阶段(也称第 1 阶段,Phase1)
                 ¾   子阶段 Phase1a:提议者选择一个全局唯一的编号 b(通常是自然数),向所有接受者发送编号为 b
                     的 Prepare 请求;
                 ¾   子阶段 Phase1b:接受者收到编号为 b 的 Prepare 请求.如果它之前收到过编号大于 b 的 Prepare
                     请求,则忽略该编号为 b 的请求;否则,接受者将自己接受过的提议(包括编号与值)中编号最大的
                     回复给提议者;
             •   接受(accept)阶段(也称第 2 阶段,Phase2)
                 ¾   子阶段 Phase2a:提议者收到来自超过半数的接受者发送的针对编号为 b 的 Prepare 请求的回复.
   172   173   174   175   176   177   178   179   180   181   182