1、什么是zookeeper?

1、zookeeper是一个分布式协调技术,是分布式数据一致性解决方案的典型代表,力求做到强一致性但最终实现的是最终一致性,采用CAP理论的AP,用来构建高可用分布式主备系统

2、zookeeper能干什么?

1、数据发布/订阅
2、命名服务
3、集群管理
4、Master选举
5、分布式锁
6、分布式队列
7、负载均衡

3、zookeeper提供了什么?

1、文件系统
2、消息广播

4、简单说一下zookeeper的文件系统?

1、zookeeper集群是有一个叫做命名节点空间的概念,其中节点就是znode,在zookeeper的文件系统中有两种节点,一是数据节点,二是目录节点,但是只有数据节点能存放数据
2、zookeeper集群为了维护高吞吐和低延迟的特性,就维护了这样树状的目录结构,而且数据节点的存储量不能太大,最多为1M

5、说一下ZAB协议?

1、ZAB协议是为分布式协调技术zookeeper提供的一个支持崩溃回复的原子广播协议
2、ZAB包括两种模式即崩溃回复和消息广播
3、首先当服务刚启动的时候或者leader节点宕机或者集群内有一半以上机器不能正常工作,此时会进入leader选举状态,然后再向其它服务器同步数据(采用的是两阶段提交),只要有一般以上返回成功的结果,此时便进入消息广播模式,整个zookeeper集群就可以对外提供服务并处理客户端的请求

6、zookeeper有几种数据节点?分别是什么?

1、7种
持久节点 除非手动删除,否则数据一直存在
临时节点 临时节点的生命周期与客户端会话绑定,当会话关闭,数据才会丢失
持久顺序节点 和持久节点类似,只是多了顺序性,该特性是由父节点维护的一个自增整型数字
临时顺序节点 和临时节点类似,只是多了顺序性,该特性是由父节点维护的一个自增整型数字
容器节点 当节点的最后一个子节点删除之后,该容器节点会被自动删除
TTL节点 在节点上加了过期时间
TTL顺序节点 和TTL节点类似,只是多了顺序性,该特性是由父节点维护的一个自增整型数字

7、简单说一下zookeeper Watcher机制(zookeeper数据变更通知)?

1、客户端注册Watcher
2、服务端触发Watcher
3、客户端回调Watcher
首先客户端会向服务端注册一个Watcher监听,当服务端的某些指令触发了这个Watcher的话,服务端就会向客户端返回一个消息通知,客户端接收到消息之后便可以做出业务上的改变

8、客户端注册Watcher是如何实现的?

1、首先会访问getData()/getChildren()/exist()三个API,传入Watcher对象
2、标记请求request,将Watcher封装成WatcherRegistration对象
3、再封装成Packet对象,服务端发送request
4、接收到服务端的request请求之后,将Watcher注册到zkWatcherManager中进行管理
5、将结果返回给客户端,注册成功

9、服务端处理Watcher是怎样实现的?

1、首先根据客户端的请求判断是否需要注册Watcher
2、比如服务端触发了setData()/delete()/create()方法,会触发一个叫做NodeDataChanged()的事件
3、服务端会将触发的事件类型、节点的路径封装成一个叫做WatchedEvent的对象
4、再向zkWatcherManager中的WatcherTable中根据节点路径查找
若找不到,说明客户端没有注册过Watcher
若找到,将Watcher从WatcherTable中删除(说明Watcher监听是一次性的)
5、调用process方法触发Watcher,主要是通过Servercnxn的TCP连接来通知客户端

10、客户端回调Watcher是怎样实现的?

1、客户端有个SendThread来接收Watcher通知的线程,接收的通知之后会交由EventThread线程处理
2、客户端的Watcher监听也是一次性的,一旦触发也会被删除

11、说一下你对zookeeper权限控制列表的认识(ACL)?

1、zookeeper的权限控制列表包含三个部分
a、授权模式
· IP:授权模式精确到IP粒度
· Digest:相当于username:password,最常用的一种授权模式
· World:相当于最特殊的Digest模式world:everyone,最开放的一种授权模式
· Super:超级用户
b、授权对象:被授予权限的用户例如某个IP
c、权限
· Create:创建
· Delete:删除
· Read:读
· Write:写
· Admin:管理

12、你知道Chroot属性是用来干什么的吗?

1、zookeeper新版本提出的一种特性,类似与namespace的说法,就是每个客户端与zookeeper的服务端之间的交互都保存在自己的namespace下
2、在目前的分布式系统中,很多都是多个应用共用一个zookeeper集群,如果设置了chroot属性,那么不同应用之间就可以起到很好的隔离效果

13、zookeeper的会话管理是怎样的?

1、分桶策略:即将类似的会话分到同一个区内进行管理,这样做可以起到不同区块的分批处理以及同一区块的统一处理
2、分桶原则:下次会话超时时间点
3、计算公式:{[(当前时间+session超时时间)/(tickTime)]+1}*tickTime (其中tickTime是会话超时检查时间间隔)

14、zookeeper中的服务器角色都有哪些?分别是干什么的?

1、leader
a、事务的执行和调度者,保证事务的顺序性
b、集群内部各服务的调度者
2、follower
a、处理非事务请求,将事务请求转发给leader处理
b、参与集群内Proposal(提议)的投票
c、参与leader选举的投票
3、observer
a、处理非事务请求,将事务请求转发给leader
b、在不影响事务处理能力的基础上增加了处理非事务请求的能力
c、不参与任何形式的投票

15、zookeeper中Server的工作状态?

1、looking:集群中leader选举的状态
2、leading:说明当前服务器角色是leader节点
3、following:说明当前服务器角色是follower节点
4、observing:说明当前服务器角色是observer节点

16、zookeeper数据同步的实现方式?

1、zookeeper实现数据同步有4种方式,即直接差异化同步、先回滚再差异化同步、仅回滚同步、全量同步
2、首先先从learner(follower和observer节点的统称)节点获取最后一次操作数据的zxid,再从leader节点中获取最小的minZxid和最大的maxZxid
3、a、如果minZxid<zxid<maxZxid -->采用直接差异化同步
b、如果leader服务器发现learner服务器包含了自己不存在的数据,那么learner服务器需要回滚到leader包含的数据然后在差异化处理 -->先回滚再差异化同步
c、如果zxid>maxZxid -->仅回滚同步即可
d、如果zxid<minZxid -->全量同步

17、zookeeper是如何保证事务的顺序一致性的?

1、zookeeper采用全局递增的事务id(zxid)来保证事务的顺序一致性的
2、所有的提议在被提出的都会携带这个zxid,zxid是一个64位的数字;高32位是个epoch(时期,纪元,世,新时代)值,表示leader选举周期,每进行一次leader选举,该数字就会+1;后32位用来表示递增计数,当产生新的提议时,会依据数据库的两阶段提交过程,首先会像其它节点发送执行请求,如果超过半数以上的机器正确执行,那么该事务就可以被执行

18、分布式集群中为什么会有Master节点?

1、因为在分布式环境中,某些场景下你只需要计算一次,所有的节点都可以共享这个结果,避免重复计算,减少性能开销,所以就有了Master节点

19、zookeeper节点宕机了怎么办?

1、因为zookeeper本身也是一个集群,并且推荐配置集群机器不少于3台
2、如果低于三台,挂了一台(无论是leader还是follower节点),集群都不能正常工作
3、如果集群机器>=3台,如果挂的是follower节点,不影响集群正常工作,如果挂的是leader节点,需要重新选举leader节点,选举完成之后还能正常工作

20、zookeeper负载均衡和nginx负载均衡的区别?

1、zookeeper的负载均衡可以调控,nginx的负载均衡只能调权重,其它可调控的方面都需要自己手写
2、但是nginx的吞吐量远大于zookeeper,所以要根据不同的场景选择合适的负载均衡方案

21、zookeeper有哪几种部署模式?

1、单机
2、伪集群
3、集群

22、zookeeper集群至少需要几台机器?集群规则是怎样的?

1、至少需要3态机器
2、规则是:2n+1(n>0的整数)

23、zookeeper集群支持动态添加机器吗?

1、动态添加机器说白了就是水平扩容,动态添加机器有以下两种方案
2、全部重启:先把集群中所有的服务都关掉,修改完配置之后再全部重启,不影响之前客户端的会话
3、逐个重启:因为zookeeper集群只要有半数以上的机器存活时,集群就能对外提供服务,因此我们可以逐个关闭机器,然后修改配置再重启

24、zookeeper集群的Watcher监听是永久的吗?为什么?

1、不是永久的(一次性的)
2、因为一旦是永久的话,服务端的每次更改数据都会发送一个消息通知给客户端,这对于网络开销和服务器端的压力都是非常大的,而且我们一般都是需要最新的一次数据,不需要每次变更数据的结果,所以zookeeper在Watcher监听这一块设置一次性的,一旦触发了Watcher,监听就会被移除,下次想触发还需要重新注册

25、zookeeper的java客户端有哪些?

1、zookeeper自带的zkClient
2、apache开源的Curator

26、chubby是什么?与zookeeper比你怎么看?

1、chubby是google的一个完全采用Paxos算法的项目,不开源
2、zookeeper可以说是chubby开源的版本,采用ZAB协议,开源

27、说几个zookeeper常用的命令?

1、set /liulong 123
2、get /liulong
3、ls /
4、update /liulong 456
5、delete /liulong
6、stat /liulong

28、ZAB协议和Paxos算法的联系(相同点和不同点)?

1、相同点:
a、都有一个leader进程,并且该leader进程负责调控lollower进程的运行
b、leader节点都需要经过半数以上的follower节点作出正确的反馈后,才会将一个提议提交
c、在ZAB中每个提议都有一个epoll值,在Paxos中称为Ballot
2、不同点:
a、ZAB采用AP,用来构建高可用分布式主备系统;Paxos采用CP,用来构建分布式一致性状态机系统

29、Zookeeper的典型应用场景有哪些?

1、消息发布与订阅    -->发布者发送消息供订阅者消费消息
2、命令服务 -->采用全局路径,每个路径对应一个名称用来指定相应的服务
3、master选举
4、集群管理
5、负载均衡
6、分布式锁 -->两种(保持独占/控制时序)
保持独占:每个znode都可以看作一把锁,在createZnode的时候,每个客户端都去创建/distribute_lock,最终创建成功的那个客户端就拥有了这把锁,用完之后删除/distribute_lock即可
控制时序:在/distribute_lock下面创建临时顺序节点,编号最小的拥有这把锁,用完删除
7、分布式队列: -->两种(同步队列/FIFO队列)
同步队列:当一个队列的所有成员都聚集时,这个队列才可用;只需要在约定目录下创建一个Watcher监听,当达到指定数量时,就触发Watcher通知机制
FIFO队列:与分布式锁差不多,入队时有编号,出队时按编号依次出队

zookeeper面试题分析的更多相关文章

  1. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  2. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  3. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  4. Zookeeper 源码分析-启动

    Zookeeper 源码分析-启动 博客分类: Zookeeper   本文主要介绍了zookeeper启动的过程 运行zkServer.sh start命令可以启动zookeeper.入口的main ...

  5. Zookeeper ZAB 协议分析[转]

    写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...

  6. 分布式系统的一致性级别划分及Zookeeper一致性级别分析

    最近在研究分布式系统的一些理论概念,例如关于分布式系统一致性的讨论,看了一些文章我有一些不解.大多数对分布式系统一致性的划分是将其分为三类:强一致性,顺序一致性以及弱一致性.强一致性(Strict C ...

  7. 使用java理解程序逻辑 试题分析

      1.编译Java Applet源程序文件产生的字节码文件的扩展名为() A:.java B..class C:Html D:Exe 正确答案:B 试题分析: 本题考查的是Java程序的开发过程.J ...

  8. ZooKeeper 面试题

    高强度训练第二十一天总结 1. ZooKeeper 面试题 ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群 中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终 ...

  9. 2019年面试官最喜欢问的28道ZooKeeper面试题

    前言 ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. ZooKeeper 的 ...

随机推荐

  1. springboot设置过滤器、监听器、拦截器

    其实这篇文章算不上是springboot的东西,我们在spring普通项目中也是可以直接使用的 设置过滤器: 以前在普通项目中我们要在web.xml中进行filter的配置,但是只从servlet 3 ...

  2. java读源码之 Queue(ArrayDeque,附图,希望能一起交流)

    除了并发应用(并发包下的代码我之后会专门写),Queue在JavaSE5中仅有的两个实现是LinkedList和PriorityQueue,它们的差异在于排序行为而不是性能.1.6时新增了一个实现Ar ...

  3. Spring学习笔记(八)Spring Data JPA学习

    ​ jpa简单的命名规则如下,这个不多做介绍,放在这里也是给自己以后查找起来方便,这篇文章主要介绍之前一直忽略了的几个点,像@NoRepositoryBean这个注解,以及怎么自定义Repositor ...

  4. 201771030117-祁甜 实验一 软件工程准备—<阅读《现代软件工程——构建之法》提出的三个问题>

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...

  5. 基础JS遇到的一些题01

    1.两种数组去重方法 const unique = arr =>{ let mySet = new Set(arr); /!* let newArr =[]; for (let i = 0 ;i ...

  6. 如何发挥Visual Studio 2019强大的编辑功能轻松编辑Keil项目

    本文地址:https://www.cnblogs.com/jqdy/p/12565161.html 习惯了VS的强大编辑功能,对Keil 5越来越深恶痛绝.查阅网络文章后按图索骥初步实现了VS编辑Ke ...

  7. Leetcode_236. 二叉树的最近公共祖先

    求二叉树的LCA code /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *le ...

  8. C:单链表的简单实现

    前言 今天整理资料的时候翻出来的文件,发现是以前学习数据结构的时候写的代码,当初是看郝凯老师的视频学习的C语言的数据结构,下面是对于一个单链表的简单的实现. /** ***************** ...

  9. TC SRM498 Div1 1000PT(容斥原理+DP)

    [\(Description\)] 网格中每步可以走\((0,\cdots M_x,0\cdots M_y)\)中任意非零向量,有\(K\)种向量不能走,分别是\((r_1,r_1),(r_2,r_2 ...

  10. 自动扫雷 python

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. // 2018.8.10更新 代码已上传至GitHub https://gith ...