Raft
html
Paxos偏向于理论、对如何应用到工程实践说起较少。理解的难度加上现实的骨感,在生产环境中基于Paxos实现一个正确的分布式系统很是难[1]:web
There are significant gaps between the description of the Paxos algorithm and the needs of a real-world system. In order to build a real-world system, an expert needs to use numerous ideas scattered in the literature and make several relatively small protocol extensions. The cumulative effort will be substantial and the final system will be based on an unproven protocol.微信
Raft[2][3]在2013年提出,提出的时间虽然不长,但已经有不少系统基于Raft实现。相比Paxos,Raft的买点就是更利于理解、更易于实行。网络
为达到更容易理解和实行的目的,Raft将问题分解和具体化:Leader统一处理变动操做请求,一致性协议的做用具化为保证节点间操做日志副本(log replication)一致,以term做为逻辑时钟(logical clock)保证时序,节点运行相同状态机(state machine)[4]获得一致结果。Raft协议具体过程以下:app
Client发起请求,每一条请求包含操做指令分布式
请求交由Leader处理,Leader将操做指令(entry)追加(append)至操做日志,紧接着对Follower发起AppendEntries请求、尝试让操做日志副本在Follower落地ide
若是Follower多数派(quorum)赞成AppendEntries请求,Leader进行commit操做、把指令交由状态机处理大数据
状态机处理完成后将结果返回给Clientui
指令经过log index(指令id)和term number保证时序,正常状况下Leader、Follower状态机按相同顺序执行指令,得出相同结果、状态一致。atom
宕机、网络分化等状况可引发Leader从新选举(每次选举产生新Leader的同时,产生新的term)、Leader/Follower间状态不一致。Raft中Leader为本身和全部Follower各维护一个nextIndex值,其表示Leader紧接下来要处理的指令id以及将要发给Follower的指令id,LnextIndex不等于FnextIndex时表明Leader操做日志和Follower操做日志存在不一致,这时将从Follower操做日志中最初不一致的地方开始,由Leader操做日志覆盖Follower,直到LnextIndex、FnextIndex相等。
Paxos中Leader的存在是为了提高决议效率,Leader的有无和数目并不影响决议一致性,Raft要求具有惟一Leader,并把一致性问题具体化为保持日志副本的一致性,以此实现相较Paxos而言更容易理解、更容易实现的目标。
Zab
Zab[5][6]的全称是Zookeeper atomic broadcast protocol,是Zookeeper内部用到的一致性协议。相比Paxos,Zab最大的特色是保证强一致性(strong consistency,或叫线性一致性linearizable consistency)。
和Raft同样,Zab要求惟一Leader参与决议,Zab能够分解成discovery、sync、broadcast三个阶段:
discovery: 选举产生PL(prospective leader),PL收集Follower epoch(cepoch),根据Follower的反馈PL产生newepoch(每次选举产生新Leader的同时产生新epoch,相似Raft的term)
sync: PL补齐相比Follower多数派缺失的状态、以后各Follower再补齐相比PL缺失的状态,PL和Follower完成状态同步后PL变为正式Leader(established leader)
broadcast: Leader处理Client的写操做,并将状态变动广播至Follower,Follower多数派经过以后Leader发起将状态变动落地(deliver/commit)
Leader和Follower之间经过心跳判别健康状态,正常状况下Zab处在broadcast阶段,出现Leader宕机、网络隔离等异常状况时Zab从新回到discovery阶段。
了解完Zab的基本原理,咱们再来看Zab怎样保证强一致性,Zab经过约束事务前后顺序达到强一致性,先广播的事务先commit、FIFO,Zab称之为primary order(如下简称PO)。实现PO的核心是zxid。
Zab中每一个事务对应一个zxid,它由两部分组成:<e, c>,e即Leader选举时生成的epoch,c表示当次epoch内事务的编号、依次递增。假设有两个事务的zxid分别是z、z',当知足 z.e < z'.e 或者 z.e = z'.e && z.c < z'.c 时,定义z先于z'发生(z < z')。
为实现PO,Zab对Follower、Leader有如下约束:
有事务z和z',若是Leader先广播z,则Follower需保证先commit z对应的事务
有事务z和z',z由Leader p广播,z'由Leader q广播,Leader p先于Leader q,则Follower需保证先commit z对应的事务
有事务z和z',z由Leader p广播,z'由Leader q广播,Leader p先于Leader q,若是Follower已经commit z,则q需保证已commit z才能广播z'
第一、2点保证事务FIFO,第3点保证Leader上具有全部已commit的事务。
相比Paxos,Zab约束了事务顺序、适用于有强一致性需求的场景。
Paxos、Raft、Zab再比较
除Paxos、Raft和Zab外,Viewstamped Replication(简称VR)[7][8]也是讨论比较多的一致性协议。这些协议包含不少共同的内容(Leader、quorum、state machine等),于是咱们不由要问:Paxos、Raft、Zab和VR等分布式一致性协议区别到底在哪,仍是根本就是一回事?[9]
Paxos、Raft、Zab和VR都是解决一致性问题的协议,Paxos协议原文倾向于理论,Raft、Zab、VR倾向于实践,一致性保证程度等的不一样也致使这些协议间存在差别。下图帮助咱们理解这些协议的类似点和区别[10]:
相比Raft、Zab、VR,Paxos更纯粹、更接近一致性问题本源,尽管Paxos倾向理论,但不表明Paxos不能应用于工程。基于Paxos的工程实践,须考虑具体需求场景(如一致性要达到什么程度),再在Paxos原始语意上进行包装。
小结
以上介绍分布式一致性协议Raft、Zab的核心思想,分析Raft、Zab与Paxos的异同。实现分布式系统时,先从具体需求和场景考虑,Raft、Zab、VR、Paxos等协议没有绝对地好与很差,只是适不适合。
[1] Paxos made live - An engineering perspective, Tushar Chandra, Robert Griesemer and Joshua Redstone, 2007
[2] In Search of an Understandable Consensus Algorithm, Diego Ongaro and John Ousterhout, 2013
[3] In Search of an Understandable Consensus Algorithm (Extended Version), Diego Ongaro and John Ousterhout, 2013
[4] Implementing Fault-Tolerant Services Using the State Machine, Fred B. Schneider, 1990
[5] Zab:High-performance broadcast for primary-backup systems, FlavioP.Junqueira,BenjaminC.Reed,andMarcoSerafini, 2011
[6] ZooKeeper's atomic broadcast protocol: Theory and practice, Andr´e Medeiros, 2012
[7] Viewstamped Replication A New Primary Copy Method to Support Highly-Available Distributed Systems, Brian M.Oki and Barbar H.Liskov, 1988
[8] Viewstamped Replication Revisited, Barbara Liskov and James Cowling, Barbara Liskov and James Cowling ,2012
[9] Can’t we all just agree? The morning paper, 2015
[10] Vive La Difference: Paxos vs. Viewstamped Replication vs. Zab, Robbert van Renesse, Nicolas Schiper and Fred B. Schneider, 2014


有收获就点个「在看」吧 ▼
本文分享自微信公众号 - 老蒙大数据(simon_bigdata)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。