Zab vs Paxos

2019-08-08  本文已影响0人  GongMeng

1. 分布式一致性

分布式一致性大体上意味着, 在多个分散的机器上, 如何保证状态(key value tuple)是完全一致的.

HDFS非常粗暴的使用写入后三备份来保证, 如果三备份中的一个坏掉了. 另外两个发生silent corrupition 同时恰好发生位置是文件校验码, 那么程序就无法判断剩下的两个备份哪个是正确的. 因为IBM和微软会每隔一段时间联合发布Disk Silent Corruption的概率, 所以这种极端情况是可以计算概率.

同时在HDFS中有唯一的NameNode来协调保持元数据一致,元数据是单点写入的.
在某些系统里所有工作节点是平权的, 任何节点挂掉都要保证数据的一致性, 就需要更复杂的算法


2. 拜占庭将军

https://people.eecs.berkeley.edu/~luca/cs174/byzantine.pdf

这个问题抽象的理解为, 指挥官需要在战场上给分散在各处的将军下命令. 让他们处于进攻状态或者防守撤退状态, 所有的将军必须尽可能是统一状态的, 才能保证战争胜利.

在以上情况下, 如何保证将军们, 至少是绝大多数将军们状态是一致的?

最早的思路认为所有的将军是全联通的, 两两都可以通信, 在这种情况下. 实际上就是采用了投票机制, 大家相互交换自己对情况的看法. 是攻还是守, 少数服从多数. 如果一个意见无法形成绝对多数就不动. 相当于本地投票没有有效结果.

这种实现效率极低, 无法解决现实中的问题. 后续对拜占庭问题有了几种抽象优化来解决.

3. Paxos

http://lamport.azurewebsites.net/pubs/paxos-simple.pdf

3.1 Paxos核心场景

所以其实Paxos目标是解决了拜占庭问题的一个侧面, 并不是完全语义下的拜占庭问题. Paxos算法实际上解决了希腊Paxos岛上的法律制定者们, 如何协调意见, 通过法条的问题.每个希腊参议员, 有自己的法律条目记事簿. 通过书记团队传递自己对于法条的修订. 参议员会随机离开大厅, 书记团队也有可能不靠谱, 丢了纸条呀, 忽然离开呀之类的. 和拜占庭问题非常类似, 但是参议员不会伪造信息, 书记员不会递送一部分信息. 这是显著的不同.

Paxos是Google Chubby

3.2 Paxos的提交模式

  1. "我们当前准备好就这个法律进行讨论了, 坚决拥护代表的选择" . 说明当前参与讨论的节点状态一致
  2. "这个提议的编号明明是 aaa, 你那里怎么会是xxx? 大雄消息真不灵通呢.jpg" 说明Proposer有落后的信息, 它只能在同步最新信息后再次提议
  3. "一个比你牛逼的哥们已经提议 yyy了, 我不参与你的讨论, bye~" 说明另外一个Proposer同时发起了相同的key-value对, 且根据策略, 它优先获得了大多数人口头支持, 相当于成为了执政党, 本次提议只能作废.

3.3 Node的策略说明

4. Zab

http://img.bigdatabugs.com/Zab%20High-performance%20broadcast%20for%20primary-backup%20systems@www.bigDataBugs.com.pdf

4.1 Zab协议和Paxos的共性包括:

4.2 Zab和Paxos的不同

Zab协议关注的是主从备份问题(primary backup)
Paxos协议关注的是状态机的备份(state machine replication)

4.3 state machine replication

作为图灵机的数学模型, state machine作为一条无限长的纸袋. 任何两条纸袋, 只要接收相同的action queue, 一定达到相同的结果.
一个state machine replication需要保证每个状态机都按照特定的顺序执行客户端发过来的action.
即使client端是并发发送的这些action(本身无序), 网络拓扑无法保证消息的传递按照发送的先后熟顺序(中间件不保序列), 部分action可能会重发(幂等性)
当leader挂掉, 新的leader可以为那些尚未提交的action进行任意重排序, 这不会影响最终结果的语义正确性. \

核心问题是如何让所有节点对客户端请求理解一致

海洋法系系统: 一群大法官无论以任何顺序讨论法条, 无论同时讨论多少个法条, 只要在某个最终时刻, 所有法官对法条的理解一致就可以了. 如果在讨论过程中, 发起讨论的法官去吃饭了. 接手的法官其实并不需要理解刚才那位的想法, 他只要保证讨论能继续, 并且最终一致就完了.

4.4. primary backup

在这种系统里, Follower Node接收到的是从Primary Node发过来的排好序的增量更新. 这里的增量更新必须严格和primary执行顺序一致, 每个follower也必须严格的和leader处于完全相同的初始状态. 如果leader宕机了, 新选举的leader不能随意的安排未提交操作的顺序, 也不能从一个不同的初始状态来更新.

核心问题是如何让主从保持完全一致

大陆法系系统: 人大作出了最终的法律决策, 投票通过了一个法条. 所有省级人民法院, 市级人民法院层层递推, 把法条落实到自己的工作中. 因为某次停电故障, 人大不得不换了个地方重新开会. 停电前的投票计数不能终止, 已经计数的结果不能丢失.

4.5 Paxos的局限性

例如议长先后发起的两个语义正交的议案, 酒醉驾车违法, 家暴违法. 然后去吃饭了, 新来的哥们主持后边的会议是没有问题的.

但如果前任议长发起的议案在语义上不正交, 必须保序. 比如 F91必须在WCS上穿女装, F91必须在WCS上换一次衣服. 根据继任者的理解不同, 可能F91会先女装,然后换装, 偏离了初衷.

4.6 Zab协议

论文中的Zab的解释图


加上选举阶段, 可以认为正常流程包含4个阶段, 依次为

4.7 选举 Fast Leader Election

在老leader掉线后, 整个集群必须在有限时间内选举出一个新leader, 并且这个新leader必须和老leader的数据完全一致. 这里的状态一致不但包含了已经commit的数据, 甚至还要求哪些Propose了但没Commit的部分也要有记录.这样它才能继承前者的遗志, 把队伍带好

根据抽屉原理, 只要整个系统还活着(存活peers大于一半), 必然有一个peer满足条件, 然后我们要把这个点选出来做话事人

由于所有的Propose带唯一递增编号, 所以peers就可以相互交换自己已经知道的历史. 如果一个peers发现自己记录的历史信息比其它人都要全, 它投票给自己, 并把自己置位到leader状态,反之, 置位到folower状态.
在投票中可以制定一个规则, 在历史记录不同的情况下, 谁记录的多我就投给谁(most update). 在历史记录一样的情况下, 谁年轻(max peer id), 我就投给谁.

由于网络可能存在时延\掉包, 整个选举过程可能要来上几轮. 在peer与peer交换信息的过程, 一个peer会使用 (vote, id, state, round)来描述自己投给谁, 自己是谁, 自己的装填, 自己当前所在的投票轮数. 经过多轮投票后, 只要整个系统中有多数peer存活, 且这些存活的多数peer均可以和真正的leader通信(无网络分区错误), 最终会有leader被选出, 然后正常的后续流程.

上一篇 下一篇

猜你喜欢

热点阅读