JAVA面试题 - ZooKeeper

JAVA面试题 总目录篇

目录

      • 说说zk的四种节点类型。
      • zookeeper怎么保证事务的顺序一致性?
      • Zookeeper有哪几种几种部署模式?
      • 说几个zookeeper常用的命令。
      • zk集群中leader挂了怎么办?
      • 说说ZAB协议吧?
      • zookeeper能用来做什么?
          • 1 命名服务
          • 2 配置中心
          • 3 集群管理
          • 4 分布式锁
          • 5 分布式队列

  • 说说zk的四种节点类型。

1、PERSISTENT-持久节点
除非手动删除,否则节点一直存在于 Zookeeper 上。

2、PERSISTENT_SEQUENTIAL-持久顺序节点
基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。 (创建时加-s参数)

3、EPHEMERAL-临时节点
客户端与zookeeper断开连接后,该节点被删除。(创建时加-e参数)

4、EPHEMERAL_SEQUENTIAL-临时顺序节点
基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。(创建时加-s -e参数)

  • zookeeper怎么保证事务的顺序一致性?

zookeeper采用了递增的事务ID(Zxid)来标识,Zxid是64位的数字,高32位是epoch(纪元),用来标识leader是否改变,如果有新的leader产生,epoch会自增。低32位用来递增计数。

  • Zookeeper有哪几种几种部署模式?

部署模式:单机模式、伪集群模式、集群模式。

  • 说几个zookeeper常用的命令。

常用命令:ls get set create rmr等。

  • zk集群中leader挂了怎么办?

zookeeper会使用ZAB算法快速选出新的leader。

  • 说说ZAB协议吧?

ZAB协议(Zookeeper Atomic Broadcast,zookeeper原子广播)是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。
ZAB协议包括两种基本的模式:崩溃恢复和消息广播。
当整个zookeeper集群刚刚启动或者Leader服务器宕机、重启或者网络故障导致不存在过半的服务器与Leader服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式,首先选举产生新的Leader服务器,然后集群中Follower服务器开始与新的Leader服务器进行数据同步,当集群中超过半数机器与该Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。

  • zookeeper能用来做什么?

1 命名服务

主要的应用场景在于rpc服务,比如dubbo等框架,可以将相应的服务注册在zk上,这样服务调用就可以根据其所命名的服务来提供对外服务等

2 配置中心

主要的一个场景,比如配置中心。把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。

3 集群管理

ZooKeeper的集群管理主要在两点:监控集群是否有机器退出和加入、选举master。
对于第一点,过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题:1)集群中机器有变动的时候,牵连修改的东西比较多。2)有一定的延时。
利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:所有机器约定在父目录(比如/GroupMembers)下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个目录被删除,即有一台机器挂掉了。新机器加入也是类似。
对于第二点,也就是在众多机器或服务中,选举出一个最终“决定权”的领导者,来独立完成一项任务。比如有一项服务是需要对外提供服务,但是要保证高可用,我们就机会进行服务的多项部署,也就是做了一些备份,提高系统的可用性。一旦我们的主服务挂了,我们可以让其它的备份服务进行重新选举,这样我们就能使整个系统不会因服务的挂掉而造成服务不可用。

4 分布式锁

实现思路:当有客户端想要获得锁时,会在zk的某个节点下,创建EPHEMERAL_SEQUENTIAL节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁。如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 该目录下比自己ID小一号的节点的变化,如果此节点消失,说明锁释放了,可以获得锁。释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

5 分布式队列

Zookeeper 可以处理两种类型的队列:FIFO先进先出队列(例如实现生产者和消费者模型)、Barrier分布式屏障(同步队列)。
FIFO队列是一种很典型的队列模型:先进入队列的请求先完成操作后,才会处理后面的请求(可以通过序列节点实现);
Barrier分布式屏障,则是需要将队列元素都集聚之后才进行统一的执行安排,否则只能等待。

你可能感兴趣的:(JAVA面试题)