今天来学习Zookeeper了

102 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天(点击查看活动详情)

image.png

今天来学习下 Zookeeper了

Zookeeper是什么?

我们都知道分布式系统中可能有用到zookeeper作为解决方案,比如Dubbo+zookeeper实现分布式服务各个模块的服务应用之间的调用,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。

它是一个为分布式应用提供一致性服务的软件。

Zookeeper有哪些特性呢?

顺序一致性

原子性

单一视图

可靠性

实时性(最终一致性)

Zookeeper实现:

数据发布/订阅、负载均衡、命名服务、分布式 协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。

Zookeeper 下 Server 工作状态有哪些?

zookeeper下server服务器具有四种状态:

  •  LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
  •  FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。
  •  LEADING:领导者状态。表明当前服务器角色是 Leader。
  •  OBSERVING:观察者状态。表明当前服务器角色是 Observer。

# Zookeeper是如何保证有序性的呢?

在zookeeper中所有的更新操作都是全局有序的,每个更新操作的时候都有一个唯一的时间戳zxid(Zookeeper Transaction Id)

而读请求只会相对于更新有序的,也就是读请求的返回结果中会带有这个zookeeper最新的zxid,所以,这样就保证了有序性,有序性是zookeeper中非常重要的一个特性。

Zookeeper中ZAB协议是什么?

有了解到ZAB协议是专门为zookeeper设计的一种协议,有两种模式分别是:崩溃恢复模式和消息广播模式。

当整个zookeeper集群在刚刚启动或者Leader服务器宕机、重启或者网络故障导致不存在过半的服务器与Leader服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式,首先选举产生新的Leader服务器,然后集群中Follower服务器开始与新的Leader服务器进行数据同步, 当集群中超过半数机器与该Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader服务器开始接收客户端的事务请求生成事务提案来进行事务请求处理。

Zookeeper是如何实现服务注册的?

zookeeper提供了一个多级的节点命名空间称为znode,为了保证高可用,低延迟,在内存中维护了一个树状的目录结构,每个节点存放的数据上限为1M.所以每个节点不能存太多的数据。

Zookeeper中 zxid是怎么生成的?

有了解到Zxid(Transaction id)类似MySQL中的表主键ID。为了保证顺序性,该 zkid 必须单调递增的。

在 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议) 协议的事务编号 Zxid 设计中,Zxid 是一个 64 位的数字,其中低 32 位是一个简单的单调递增的计数器,针对客户端每一个事务请求,计数器加 1;

而高 32 位则代表 Leader 周期 epoch 的编号,每个当选产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务的 ZXID,并从中读取epoch 值,然后加 1,以此作为新的 epoch,并将低 32 位从 0 开始计数。

Zookeeper的数据同步有哪几类?

Zookeeper的数据同步通常分为四类:

直接差异化同步(DIFF同步)

先回滚再差异化同步(TRUNC+DIFF同步)

仅回滚同步(TRUNC同步)

全量同步(SNAP同步)

在进行数据同步前,Leader服务器会完成数据同步初始化:peerLastZxid:从learner服务器注册时发送给ACKEPOCH消息中提取lastZxid(该Learner 服务器最后处理的zxid)minCommittedLog:Leader服务器Proposal缓存队列committedLog中最小zxid。

maxCommittedLog:Leader服务器Proposal缓存队列committedLog中最大zxid 直接差异化同步(DIFF同步) 场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间

先回滚再差异化同步(TRUNC+DIFF同步) 场景:当新的Leader服务器发现某个Learner服务器包含了一条自己没有的事务记录,那么就 需要让该Learner服务器进行事务回滚–回滚到Leader服务器上存在的,同时也是最接近于 peerLastZxid的ZXID 仅回滚同步(TRUNC同步) 场景:peerLastZxid 大于 maxCommittedLog

全量同步(SNAP同步) 场景一:peerLastZxid 小于 minCommittedLog 场景二:Leader服务器上没有Proposal缓存队列且peerLastZxid不等于lastProcessZxid

image.png