题目
- 1、ZooKeeper是什么?
- 2、ZooKeeper提供了什么?
- 3、Zookeeper文件系统
- 4、ZAB协议?
- 5、四种类型的数据节点 Znode
- 6、Zookeeper Watcher 机制 – 数据变更通知
- 7、客户端注册Watcher实现
- 8、服务端处理Watcher实现
- 9、客户端回调Watcher
- 10、ACL权限控制机制
解答
题目一
- 题干:ZooKeeper是什么?
- 分析:
-
是一种典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据的发布订阅、负载均衡、命名服务、分布式协调通知、集群管理、Master选举、分布式锁和分布式队列。
- 回答:
-
见分析。
题目二
- 题干:ZooKeeper提供了什么?
- 分析:
-
文件系统+通知机制。
- 回答:
-
参考第三第六题.
题目三
- 题干:Zookeeper文件系统?
- 分析:
-
首先ZK的文件系统核Unix的文件系统类似,但是没有引入目录核文件的概念,在ZK的文件系统里,Znode是最小的数据单元Znode存储节点数据和节点状态信息,每个Znode都可以保存数据和挂在子节点,所构成的层次化命名空间我们称之为树。
- 回答:
-
见分析。
题目四
- 题干:ZAB协议?
- 分析:
-
首先ZAB协议是专门为分布式协调服务ZK设计的一种支持崩溃恢复的原子广播协议,而ZK也主要依赖ZAB协议来实现分布式数据一致性.ZAB的核心是定义了那些可以改变ZK服务器数据状态的事物请求的处理方式:所有请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader,而余下的其他服务器被称为Follower服务器,Leader服务器负责将一个客户端事务请求转成一个事务提议(Proposal),并将该提议分发给集群中的所有Follower服务器,之后Leader服务器等待所有Follower服务器的反馈,如果有超过半数的Follower服务器进行了正确的反馈,那么Leader就会再次向所有的Follower服务器分发Commit消息,要求其将一个事务提议进行提交。
并且需要保证一个全局的变更被顺序应用.
ZAB协议的两种模式:消息广播 崩溃恢复
消息广播:
ZAB协议的消息广播模式类似于2PC.对于客户端的事务请求,Leader服务器会为其生成对应的事务Proposal,并将其发送给集群的其余服务器,然后分别收集各自的选票,最后进行事务提交.区别于2PC的是2PC的提交阶段要求等待所有事务参与者响应Yes在做Commit,而ZAB只要求过半,所以移除了中断逻辑,所有的Follower服务器要么正常反馈Leader提出的事务Proposal,要么抛弃Leader,而我们只需要在过半的Follower响应了Ack之后就开始提交事务Proposal了,而不需要等待集群中所有的Follower服务器都反馈响应.在消息广播过程中,Leader服务器会为每个事务请求生成对应的Proposal来进行广播,并且会为Proposal分配一个全局单调递增的唯一ID,称之为事务ID(ZXID),Leader服务器会为每一个Follower服务器都各自分配一个单独的队列,然后将需要广播的Proposal一次放入这些队列中,这样就保证了消息的严格因果关系.当Leader服务器接受到超过半数Follower的Ack响应后,就会广播一个Commit消息给所有的Follower服务器让其进行事务提交,同时Leader自身也会完成事务提交而每一个Follower在接受到Commit消息后也会完成事务提交.
崩溃恢复:
当整个服务框架在启动的过程中,或者是Leader服务器出现网络中断 崩溃退出 重启 等异常情况时, ZAB协议就会进入恢复模式并选举产生新的Leader服务器,当选举产生新的Leader服务器后同时集群中已经有过半的机器与该Leader服务器完成了状态同步后ZAB协议就会退出恢复模式.
两种恢复模式的情况:
ZAB协议需要确保那些已经在Leader服务器上提交的事务最终被所有服务器都提交
ZAB协议需要丢弃那些只在Leader服务器上提出(不是提交)的事务.
所以Leader选举算法需要保证Leader服务器拥有集群中所有机器的最高编号(ZXID)的事务Proposal,
同步部分
所有正常运行的服务器,要么称为Leader,要么称为Follower并和Leader保持同步,Leader服务器会为每一个Follower服务器准备一个队列,并将那些没有被各Follower服务器同步的事务以Proposal消息的形式逐个发送给Follower服务器然后在发一个Commit消息,来表示该事务已经提交,等到Follower服务器将Leader中的事务都同步过来后,Leader就会将Follower服务器加入到真正的可用的Follower列表. - 回答:
-
见分析。
题目五
- 题干:四种类型的数据节点 Znode?
- 分析:
-
其实总ZK的节点分为持久节点 临时节点 顺序节点三大类,而这三大类又可以组合成下面四种类型的节点:
持久节点:
被创建就一直在ZK的服务器上,直到又删除操作来主动清除这个节点.
持久顺序节点
和持久节点特性基本一致,ZK中每个父节点都会为它的第一级子节点维护一份顺序,用于记录每个子节点创建的先后顺序,节点名+数字后缀(整型的最大值).
临时节点
生命周期和客户但会话绑定在一起,当客户端会话失效,那么这个节点就会被自动清理掉.
临时顺序节点
临时节点+顺序性. - 回答:
题目六
- 题干:Zookeeper Watcher 机制 – 数据变更通知
- 分析:
-
ZK可以实现发布订阅模式,大概分为下面几步:
1 客户端注册
2 将Watcher存储到WatchManger(底层是个Map<String,Set>)
3 服务端事件通知
4 客户端从WatchManger取出Watcher使用process方法进行回调
客户端注册:
在创建ZK客户端对象实例时,可以向构造方法中传入一个默认的Watcher,此Watcher作为整个会话期间的默认Watcher,会一直被保存在客户端ZKWatcherManger的defaultWatcher中,另外getData getChildren exit三个接口都可以向ZK服务器注册Watcher.流程如下:
1 调用客户端API传入Watcher对象
2 标价Request 封装Watcher到WatcherRegistration
3 向服务器发送request
4 响应之后将Watcher注册到WatchManger中进行管理.
注意:将Watcher对象封装到WatcherRegistration中,然后WatcherRegistration又会被封装到Packet中,但是在传输的时候是不会堆WatcherRegistration进行序列化,也就是说我们并没有将Watcher发送给服务端.
服务端处理Watcher:
由于客户端没有传递过来Watcher那么服务端怎么注册,服务端有一个相当于Watcher对象的ServerCnxn并且实现了Watcher接口的process方法,Watch Manger时服务端的Watcher管理者并且还负责Watcher事件的触发,并且移除那些被处罚的Watcher,对于标记了Watcher注册的请求,Watch Manger会将ServerCnxn存储到WatchManger,
回调机制:封装WatchEvent 查询Watcher 调用process触发Watcher这个process是ServerCnxn实现的process逻辑简单就是:不处理客户端Watcher的真正逻辑而是用来传递WatcherEvent真正的客户端Watcher回调和业务逻辑执行都在客户端.
客户端回调Watcher:
服务端触发Watcher事件后,会通过使用serverCnxn对应的TCP连接向客户端发送WatcherEvent事件,
流程如下: 反序列化 - 处理chrootPath - 还原WatcherEvent - 回调Watcher.Event Thread会来处理事件,并调用watcher的process方法. - 回答:
-
参考分析
题目七
- 题干:客户端注册Watcher实现
- 分析:
-
客户端注册:
在创建ZK客户端对象实例时,可以向构造方法中传入一个默认的Watcher,此Watcher作为整个会话期间的默认Watcher,会一直被保存在客户端ZKWatcherManger的defaultWatcher中,另外getData getChildren exit三个接口都可以向ZK服务器注册Watcher.流程如下:
1 调用客户端API传入Watcher对象
2 标价Request 封装Watcher到WatcherRegistration
3 向服务器发送request
4 响应之后将Watcher注册到WatchManger中进行管理.
注意:将Watcher对象封装到WatcherRegistration中,然后WatcherRegistration又会被封装到Packet中,但是在传输的时候是不会堆WatcherRegistration进行序列化,也就是说我们并没有将Watcher发送给服务端. - 回答:
-
参考分析
题目八
- 题干:服务端处理Watcher实现
- 分析:
-
服务端处理Watcher:
由于客户端没有传递过来Watcher那么服务端怎么注册,服务端有一个相当于Watcher对象的ServerCnxn并且实现了Watcher接口的process方法,Watch Manger时服务端的Watcher管理者并且还负责Watcher事件的触发,并且移除那些被处罚的Watcher,对于标记了Watcher注册的请求,Watch Manger会将ServerCnxn存储到WatchManger,
回调机制:封装WatchEvent 查询Watcher 调用process触发Watcher这个process是ServerCnxn实现的process逻辑简单就是:不处理客户端Watcher的真正逻辑而是用来传递WatcherEvent真正的客户端Watcher回调和业务逻辑执行都在客户端. - 回答:
-
参考分析
题目九
- 题干:客户端回调Watcher?
- 分析:
-
服务端触发Watcher事件后,会通过使用serverCnxn对应的TCP连接向客户端发送WatcherEvent事件,
流程如下: 反序列化 - 处理chrootPath - 还原WatcherEvent - 回调Watcher.Event Thread会来处理事件,并调用watcher的process方法.。 - 回答:
-
参考分析
题目十
- 题干:ACL权限控制机制
- 分析:
-
ACL(Access ControlList)权限控制机制包括三方面:权限模式(Scheme) 授权对象(ID) 和权限(Permission)通常使用scheme🆔permission来标识一个有效的ACL信息.
权限模式(Scheme) :
用来确定权限验证过程中使用的检验策略
IP(192.168.0.101)
Digest(username:password)
world(world:anyone)
Super
授权对象(ID):
指的是权限赋予的用户或者一个实体,不同权限模式,授权对象不一样.
权限(Permission):
C(创建权限)D(删除权限)R(读取权限)W(更新权限)A(数据节点的管理权限).
- 回答:
-
。