每天十道面试题-20200329

题目
  • 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(数据节点的管理权限).

  • 回答:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值