Zookeeper原理入门

一致性

一致性可以初略分为两种,强一致性,在这种情况下从任意主机操作的结果应当可见于在此后的所有操作,弱一致性,也叫最终一致性,保证了从任意主机操作的结果可见于收到数据后所有操作。
Zookeeper使用了特别的选举机制和事务提交协议来保证自己的最终一致性。

选举机制

每个节点可以有四种状态:Looking,Observing,Following和Leading,其中Looking是寻找状态;Observing是观察状态,由配置文件指定;另外两种是参与投票后的节点到达的状态。
Zookeeper有一个线程时刻访问投票接受器。首先它会将自己的一票投入投票接收器中,然后采用以下流程进行选举:每次节点收到新的投票,如果还没投票,自然会将这一票作为自己投票并放入投票箱中;如果已有投票,会将自己的投票和收到的投票进行比较,如果新投票届数低于本票,说明是过期票,直接丢弃,如果新投票届数更高,或和当前投票相同届数更高事务Id,或相同事务Id更高的服务端myId标记,那么会选择发过来的投票作为自己的新票,然后将自己的投票发给所有配置的非Observing服务端节点,并将自己的投票和发过来的投票一起发过去。每次接受最后对自己的投票箱进行统计,如果自己所投服务器,在投票箱中超过1/2的选票,就会停止再次比较后通知其它线程,而是持续比较,等待接收箱再无选票后或者达到最大时间时,停止选票,保存Leader。
每次成为Leader之后,Leader会发送日志给所有Observer和Follower来辅助ZAB完成挂机恢复。

ZAB协议

Zookeeper使用了ZAB协议保证了数据的最终一致性,ZAB是一种两阶段提交协议,用于同步Leader与其它节点的日志状况。首先由Leader将日志发给其它节点,其它节点收到之后发回ACK,在Leader收到超过1/2的ACK回应后会commit自己的日志并且向其它节点发送commit信号。
Zookeeper日志是一种逻辑日志,记录着所有事务型操作,用于重新加载内存数据树,一般而言,会先加载最后持久的快照,然后通过日志补足缺失的操作,因为快照实际上是一种物理日志,保存着节点的所有现有数据,它的加载效率远高于重新执行逻辑日志的命令,但是它有个致命缺陷,就是会导致较长时间的停止执行,用于保证快照的一致性,这个缺陷一般可以通过增量快照来做一定弥补,但还是远久于仅存下一条命令,所以一般经过一个间隔时间才会进行一次快照保存。
接下来将从两个角度来证明Zookeeper的最终一致性,如果在commit之前,Leader发生故障,那么会由于日志没有保存入磁盘,全部服务器保持没有commit的情况;如果是Leader在发送commit请求时挂掉了,如果Leader只自己commit而其它机器都未commit,那么它会由于届数败于选举,最后接受其它机器未commit版本的日志,如果Leader和follower部分commit了,而Leader挂掉了,那么曾经commit的节点就会以更大的zxid取胜,紧接着成为Leader的节点就会开始将自己的数据同步给其它节点。

选择原因

除了高效传输之外,RPC也应该保证高可用,所以采用了Zookeeper。Zookeeper分布式地管理了服务,我们把服务从不同的集群中抽离出来,并在服务名节点下增加了这个集群所有可以调用的主机socket。这里的socket指的是ip和port。这种将服务查询交给Zookeeper有三个好处,一,我们不再需要记录每台主机对应接口,而是根据服务名就直接获得了socket,将服务名和socket进行映射,有效简化了记忆难度;二, Zookeeper使用了集群技术,保证了分区容错性。如果某台Zookeeper主机挂掉了,还可以使用其它Zookeeper进行操作;三,Zookeeper使用2PC的ZAB协议,保证不会出现主机之间出现永久性数据差异,而最后导致集群数据不一致。

第三方框架

客户端框架的使用

为了简化Zookeeper客户端的操作,RPC中采用了第三方提供的Curator框架,除此之外,Curator也提供了一些额外功能,比如其用来向Zookeeper集群发送请求的实例CuratorFrameWorker保证了线程安全;CuratorCache监听器,在向服务器申请监听之后,这个监视器本地缓存了所要监听的节点的内容,并在节点下数据发生变化时异步回调,另外这个监视器并不会一次回调之后就销毁,这是比Zookeeper官方监视器好的地方。

单例原因

下图是对CuratorFrameWork工作流程的一个描述,CuratorFrameWork是一个可以反复对Zookeeper集群操作的线程安全对象(它通过在start() 时候新建一个单线程线程池,然后提交一个循环取操作集的Callable,保证了任务的有序性,这个循环终止条件是curatorFrameWork被关闭),所以在使用中只有一个framwork就足够了。

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值