zookeeper专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
目录
【前言】
让zookeeper中的每个节点的数据都保持一致,才能对外提供服务。没有进行数据同步的zk节点,可以剔除出服务范围之外。既然要保持数据的一致性,那么这些数据应该是重要的、少量的。本文介绍paxos算法是如何使zookeeper集群保持数据一致性。
参考文章:
图解分布式一致性协议Paxos
Paxos算法详解
如何浅显易懂地解说 Paxos 的算法?
在分布式场景中,要访问相同的值,这个值的存储形式有两种:
1、共享存储(公共的存储地)(并发编程领域:同步数据)
2、消息传递
Paxos算法是Lesile Lamport提出的一种基于消息传递且具有高度容错特性的一致性算法。基于消息传递通信模型的分布式系统,不可避免会发生进程变慢被杀死,消息延迟、丢失、重复等问题,Paxos算法就是在存在以上异常的情况下仍能保持一致性的协议。
参议院 51 提议 赞成票:26
虚拟了一个神话故事:在paxos岛上为了通过某个法律条文模拟的一个投票过程
Paxos算法使用一个希腊故事来描述,在Paxos中,存在三种角色,分别为
Proposer
(提议者,用来发出提案proposal)
Acceptor
(接受者,可以接受或拒绝提案)
Learner
(学习者,学习被选定的提案,当提案被超过半数的Acceptor接受后为被批准)
下面更精确的定义Paxos要解决的问题:
1、决议(value)只有在被proposer提出后才能被批准
2、在一次Paxos算法的执行实例中,只批准(chose)一个value
3、learner只能获得被批准(chosen)的value
所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为leader服务器,而余下的其他服务器则成为follower服务器。leader服务器负责将一个客户端事务请求转换成一个事务proposal,并将该proposal分发给集群中所有的follower服务器。之后leader服务器需要等待所有follower服务器的反馈,一旦超过半数的follower服务器进行了正确的反馈后,那么leader就会再次向所有的follower服务器分发commit消息,要求其将前一个proposal进行提交。
ZAB协议需要确保那些已经在leader服务器上提交的事务最终被所有服务器都提交。ZAB协议需要确保丢弃那些只在leader服务器上被提出的事务。ZAB两种基本的模式:崩溃恢复和消息广播。
如果让leader选举算法能够保证新选举出来的leader服务器拥有集群中所有机器最高编号(ZXID)的事务proposal,那么就可以保证这个新选举出来的leader一定具有所有已经提交的提案。
paxos有很多的变种版本:
1、basic paxos 谷歌的chubby所有采用的paxos
2、fast paxos zookeeper采用的paxos
basic paxos
:
第一个阶段:
当前上线的follower去连接leader的时候,发现根本就没有leader。发起提议来选举leader,首先选举出来的leader只是合适成为leader的备选节点
第二个阶段:
再次投票来决定当前选举出来的比较合适成为真正leader的这个节点,是不是会被超过半数的节点通过
fast paxos
:
提议自己成为leader,让其他节点投票
数据都是最新,发起提议的投票结果的ID也都一致,则决胜的条件:myid