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的关系
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的关系
在系统启动时,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的关系
RegionServer以Ephemeral node的方式注册到ZooKeeper中。其中ZooKeeper存储HBase的如下信息:HBase元数据、HMaster地址。
HMaster通过ZooKeeper随时感知各个RegionServer的健康状况,以便进行控制管理。
HBase也可以部署多个HMaster,类似HDFS NameNode,当HMaster主节点出现故障时,HMaster备用节点会通过ZooKeeper获取主HMaster存储的整个HBase集群状态信息。即通过ZooKeeper实现避免HBase单点故障问题的问题。
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设计最初含有Nio包,且不能较好的支持3.5版本后的SSL。为了解决这个问题,Netty被加入到ZooKeeper中。若用户需要使用SSL,启用Netty并设置Server端和Client端的相关参数即可。
ZooKeeper设计最初含有Nio包,且不能较好的支持3.5版本后的SSL。为了解决这个问题,Netty被加入到ZooKeeper中。若用户需要使用SSL,启用Netty并设置Server端和Client端的相关参数即可。