ZooKeeper面试题总结

目录

1 ZAB协议

2  ZAB和Paxos算法的联系与区别?

3 四种类型的数据节点Znode

4 ACL权限控制机制

5 服务器角色

6 ZooKeeper是如何保证事务的顺序一致性的

7 Zookeeper对节点的watch监听通知是永久的吗?


1 ZAB协议

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


2  ZAB和Paxos算法的联系与区别?

  • 相同点:
    • 两者都存在一个类似于Leader进程的角色,由其负责协调多个Follower进程的运行。
    • Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交。
    • ZAB协议中,每个Proposal中都包含一个 epoch 值来代表当前的Leader周期,Paxos中名字为Ballot。
  • 不同点:
    • ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。

3 四种类型的数据节点Znode

  • PERSISTENT-持久节点:除非手动删除,否则节点一直存在于Zookeeper上。
  • EPHEMERAL-临时节点:临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。
  • PERSISTENT_SEQUENTIAL-持久顺序节点:基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
  • EPHEMERAL_SEQUENTIAL-临时顺序节点:基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

4 ACL权限控制机制

  • 权限模式
    • Super:超级用户
    • World:最开放的权限控制方式,是一种特殊的digest模式,只有一个权限标识“world:anyone”
    • Digest:最常用,用类似于 username:password 的权限标识来进行权限配置,便于区分不同应用来进行权限控制
    • IP:从IP地址粒度进行权限控制
  • 权限
    • CREATE:数据节点创建权限,允许授权对象在该Znode下创建子节点
    • DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点
    • READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等
    • WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作
    • ADMIN:数据节点管理权限,允许授权对象对该数据节点进行ACL相关设置操作

5 服务器角色

  • Leader

    • 事务请求的唯一调度和处理者,保证集群事务处理的顺序性
    • 集群内部各服务的调度者
  • Follower

    • 处理客户端的非事务请求,转发事务请求给Leader服务器
    • 参与事务请求Proposal的投票
    • 参与Leader选举投票
  • Observer

    • 处理客户端的非事务请求,转发事务请求给Leader服务器
    • 不参与任何形式的投票

6 ZooKeeper是如何保证事务的顺序一致性的

ZooKeeper采用了递增的事务id来标识,所有的proposal都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch用来标识leader是否发生改变,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。


Zookeeper对节点的watch监听通知是永久的吗?

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

你可能感兴趣的:(ZooKeeper,面试题总结)