ZooKeeper简介

ZooKeeper是一个开源的,高可靠的,分布式一致性协调服务。在大数据产品中主要提供两个功能:

  • 帮助系统避免单点故障,建立可靠的应用程序。
  • 提供分布式协作服务和维护配置信息。

ZooKeeper结构

ZooKeeper结构

ZooKeeper结构

ZooKeeper集群中的节点分为三种角色:Leader、Follower和Observer,其结构和相互关系如图所示。通常来说,需要在集群中配置奇数个(2N+1)ZooKeeper服务,至少(N+1)个投票才能成功的执行写操作。

  • Leader
  • 在ZooKeeper集群中只有一个节点作为集群的Leader,由各Follower通过ZooKeeper Atomic Broadcast(ZAB)协议选举产生,主要负责接收和协调所有写请求,并把写入的信息同步到Follower和Observer。

  • Follower
  • Follower的功能有两个:

    1、每个Follower都作为Leader的储备,当Leader故障时重新选举Leader,避免单点故障。

    2、处理读请求,并配合Leader一起进行写请求处理。

  • Observer
  • Observer不参与选举和写请求的投票,只负责处理读请求、并向Leader转发写请求,避免系统处理能力浪费。

  • Client
  • ZooKeeper集群的客户端,对ZooKeeper集群进行读写操作。例如HBase可以作为ZooKeeper集群的客户端,利用ZooKeeper集群的仲裁功能,控制其HMaster的“Active”和“Standby”状态。

ZooKeeper原理

写请求:

1、Follower或Observer接收到写请求后,转发给Leader。

2、Leader协调各Follower,通过投票机制决定是否接受该写请求。

3、如果超过半数以上的Leader、Follower节点返回写入成功,那么Leader提交该请求并返回成功,否则返回失败。

4、Follower或Observer返回写请求处理结果。

只读请求:

客户端直接向Leader、Follower或Observer读取数据。

ZooKeeper与其他组件的关系

ZooKeeper和HDFS的关系

ZooKeeper和HDFS的关系

ZKFC(ZKFailoverController)作为一个ZooKeeper集群的客户端,用来监控NameNode的状态信息。ZKFC进程仅在部署了NameNode的节点中存在。HDFS NameNode的Active和Standby节点均部署有ZKFC进程。


  • HDFS NameNode的ZKFC连接到ZooKeeper,把主机名等信息保存到ZooKeeper中,即“/hadoop-ha”下的znode目录里。先创建znode目录的NameNode节点为主节点,另一个为备节点。HDFS NameNode Standby通过ZooKeeper定时读取NameNode信息。


  • 当主节点进程异常结束时,HDFS NameNode Standby通过ZooKeeper感知“/hadoop-ha”目录下发生了变化,NameNode会进行主备切换。

ZooKeeper和YARN的关系

ZooKeeper和YARN的关系

在系统启动时,ResourceManager会尝试把选举信息写入ZooKeeper,第一个成功写入ZooKeeper的ResourceManager被选举为Active ResourceManager,另一个为Standby ResourceManager。Standby ResourceManager定时去ZooKeeper监控Active ResourceManager选举信息。


  • Active ResourceManager还会在ZooKeeper中创建Statestore目录,存储Application相关信息。当Active ResourceManager产生故障时,Standby ResourceManager会从Statestore目录获取Application相关信息,恢复数据。

ZooKeeper和HBase的关系

ZooKeeper和HBase的关系

RegionServer以Ephemeral node的方式注册到ZooKeeper中。其中ZooKeeper存储HBase的如下信息:HBase元数据、HMaster地址。


  • HMaster通过ZooKeeper随时感知各个RegionServer的健康状况,以便进行控制管理。


  • HBase也可以部署多个HMaster,类似HDFS NameNode,当HMaster主节点出现故障时,HMaster备用节点会通过ZooKeeper获取主HMaster存储的整个HBase集群状态信息。即通过ZooKeeper实现避免HBase单点故障问题的问题。

ZooKeeper和Kafka的关系

ZooKeeper和Kafka的关系

Broker端使用ZooKeeper来注册broker信息,并进行partition leader选举。


  • Consumer端使用ZooKeeper来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息。

ZooKeeper开源增强特性

  • 日志增强

    安全模式下,Ephemeral node(临时节点)在session过期之后就会被系统删除,在审计日志中添加Ephemeral node被删除的审计日志,以便了解当时Ephemeral node的状态信息。

    安全模式下,Ephemeral node(临时节点)在session过期之后就会被系统删除,在审计日志中添加Ephemeral node被删除的审计日志,以便了解当时Ephemeral node的状态信息。

  • ZooKeeper SSL通信(Netty连接)

    ZooKeeper设计最初含有Nio包,且不能较好的支持3.5版本后的SSL。为了解决这个问题,Netty被加入到ZooKeeper中。若用户需要使用SSL,启用Netty并设置Server端和Client端的相关参数即可。

    ZooKeeper设计最初含有Nio包,且不能较好的支持3.5版本后的SSL。为了解决这个问题,Netty被加入到ZooKeeper中。若用户需要使用SSL,启用Netty并设置Server端和Client端的相关参数即可。