大数据面试题——Zookeeper篇

前言

Zookeeper,中文名又称为动物园管理员。他属于Hadoop生态圈中重要的组件框架之一。主要是起到分布式协调调度的作用,日常中我们可能经常使用到zookeeper,但是他并不像Hadoop Spark会经常进行应用编程的开发,也不像Hive HBase那样进行数据的交互式查询操作等。
关于Zookeeper,我们更多的是在集群中搭建Zookeeper集群来进行 配置管理 集群管理 或者是分布式锁等。
这篇博客,南国结合自己稀少的实践经历 和看过的知识点 总结出Zookeeper中常见的面试考点。如果对zookeeper不太熟悉的读者,在看这篇博客之前 建议先学习一下Zookeeper的基础知识点 南国此前写过一篇博客一文了解Zookeeper 一点浅见 与大家分享。

1. 简述ZooKeeper的选举机制

这个知识点 在上面提到的博客中 南国其实已经写过。这里 通过一个例子 结合图文 在叙述一下。
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么。
大数据面试题——Zookeeper篇_第1张图片
(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的Leader,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它成为Follower
(5)服务器5启动,同4一样成为Follower

注意,如果按照5,4,3,2,1的顺序启动,那么5将成为Leader,因为在满足半数条件后,ZooKeeper集群启动,5的Id最大,被选举为Leader。

2. 客户端如何正确处理CONNECTIONLOSS(连接断开) 和 SESSIONEXPIRED(Session 过期)两类连接异常?

在ZooKeeper中,服务器和客户端之间维持的是一个长连接,在 SESSION_TIMEOUT 时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送heart_beat),服务器重置下次SESSION_TIMEOUT时间。因此,在正常情况下,Session一直有效,并且zk集群所有机器上都保存这个Session信息。在出现问题的情况下,客户端与服务器之间连接断了(客户端所连接的那台zk机器挂了,或是其它原因的网络闪断),这个时候客户端会主动在地址列表(初始化的时候传入构造方法的那个参数connectString)中选择新的地址进行连接。

以上即为服务器与客户端之间维持长连接的过程,在这个过程中,用户可能会看到两类异常CONNECTIONLOSS(连接断开) 和SESSIONEXPIRED(Session 过期)。

发生CONNECTIONLOSS后,此时用户不需要关心我的会话是否可用,应用所要做的就是等待客户端帮我们自动连接上新的zk机器,一旦成功连接上新的zk机器后,确认之前的操作是否执行成功了。

3. ZooKeeper对节点的watch监听是永久的吗?为什么?

不是。官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。

为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。
一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。
在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

4. ZooKeeper中使用watch的注意事项有哪些?

使用watch需要注意的几点:
① Watche通知是一次性的,必须重复注册。
② 发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。
③ 节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。
④ 对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。
⑤ 同一个zk客户端对某一个节点注册相同的watch,只会收到一次通知。
⑥ Watcher对象只会保存在客户端,不会传递到服务端。

5. ZooKeeper集群中服务器之间是怎样通信的?

Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有F/O的LearnerHandler。

6. 请说明ZooKeeper的通知机制?

ZooKeeper选择了基于通知(notification)的机制,即:客户端向ZooKeeper注册需要接受通知的znode,通过znode设置监控点(watch)来接受通知。

监视点是一个单次触发的操作,意即监视点会触发一个通知。为了接收多个通知,客户端必须在每次通知后设置一个新的监视点。

在下图阐述的情况下,当节点/task发生变化时,客户端会受到一个通知,并从ZooKeeper读取一个新值。
大数据面试题——Zookeeper篇_第2张图片

7. ZooKeeper的监听原理是什么?

在应用程序中,main()方法首先会创建zkClient,创建zkClient的同时就会产生两个进程,即Listener进程(监听进程)和connect进程(网络连接/传输进程),当zkClient调用getChildren()等方法注册监视器时,connect进程向ZooKeeper注册监听器,注册后的监听器位于ZooKeeper的监听器列表中,监听器列表中记录了zkClient的IP,端口号以及要监控的路径,一旦目标文件发生变化,ZooKeeper就会把这条消息发送给对应的zkClient的Listener()进程,Listener进程接收到后,就会执行process()方法,在process()方法中针对发生的事件进行处理。
大数据面试题——Zookeeper篇_第3张图片

8. ZooKeeper使用的ZAB协议与Paxo算法的异同?

Paxos算法是分布式选举算法,Zookeeper使用的 ZAB协议(Zookeeper原子广播),两者的异同如下:
① 相同之处:
比如都有一个Leader,用来协调N个Follower的运行;Leader要等待超半数的Follower做出正确反馈之后才进行提案;二者都有一个值来代表Leader的周期。
② 不同之处:
ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。

9. 请谈谈对ZooKeeper对事务性的支持?

ZooKeeper对于事务性的支持主要依赖于四个函数:zoo_create_op_init, zoo_delete_op_init, zoo_set_op_init以及zoo_check_op_init。

每一个函数都会在客户端初始化一个operation,客户端程序有义务保留这些operations。当准备好一个事务中的所有操作后,可以使用zoo_multi来提交所有的操作,由zookeeper服务来保证这一系列操作的原子性。也就是说只要其中有一个操作失败了,相当于此次提交的任何一个操作都没有对服务端的数据造成影响。Zoo_multi的返回值是第一个失败操作的状态信号。

以上内容是我平日里学习过程中结合自己的学习笔记以及网上的资料总结而成。如有错误,还请看到的读者指出,谢谢~

你可能感兴趣的:(大数据,zookeeper)