6. 常见面试题
6.1.ZAB 协议是什么?
ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。
ZAB 协议包括两种基本的模式:崩溃恢复和消息广播。
当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障导致不存在过半的服务器与 Leader 服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式,首先选举产生新的 Leader 服务器,然后集群中 Follower 服务器开始与新的 Leader 服务器进行数据同步,当集群中超过半数机器与该 Leader 服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。
6.2.Znode 有哪几种类型
PERSISTENT-持久节点:除非手动删除,否则节点一直存在于 Zookeeper 上;
EPHEMERAL-临时节点:临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除;
PERSISTENT_SEQUENTIAL-持久顺序节点:基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
EPHEMERAL_SEQUENTIAL-临时顺序节点:基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
6.3.ACL 权限控制机制
UGO(User/Group/Others):目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。
ACL(Access Control List)访问控制列表:包括三个方面:
权限模式(Scheme):
IP:从 IP 地址粒度进行权限控制
Digest:最常用,用类似于 username:password 的权限标识来进行权限配置,便于区分不同应用来进行权限控制
World:最开放的权限控制方式,是一种特殊的 digest 模式,只有一个权限标识“world:anyone” Super:超级用户
授权对象:
授权对象指的是权限赋予的用户或一个指定实体,例如 IP 地址或是机器灯
权限 Permission:
CREATE:数据节点创建权限,允许授权对象在该 Znode 下创建子节点
DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点
READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等
WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作
ADMIN:数据节点管理权限,允许授权对象对该数据节点进行 ACL 相关设置操作
6.4.ZK 的角色有哪些
Leader:
1.事务请求的唯一调度和处理者,保证集群事务处理的顺序性
2.集群内部各服务的调度者
Follower:
1.处理客户端的非事务请求,转发事务请求给 Leader 服务器
2.参与事务请求 Proposal 的投票
3.参与 Leader 选举投票
Observer:
1. 3.3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提升集群的非事务处理能力
2.处理客户端的非事务请求,转发事务请求给 Leader 服务器
3.不参与任何形式的投票
6.5.ZK Server 的工作状态有哪些,能否具体描述
服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。
LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。
LEADING:领导者状态。表明当前服务器角色是 Leader。
OBSERVING:观察者状态。表明当前服务器角色是 Observer。
6.6.ZK 的 watch 机制是否永久
否,不是永久的。
6.7.ZK 的常见客户端有哪些
java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator
6.8.分布式锁用 zk 怎么实现
有两种实现方式,具体看代码
6.9.Zk 默认的通信框架是什么
Nio,可以改成 netty
6.10. 消息广播的流程
Leader 接收到消息请求后,将消息赋予一个全局唯一的 64 位自增 id,叫做:zxid,通过 zxid 的大小比较即可实现因果有序这一特性。
Leader 通过先进先出队列(通过 TCP 协议来实现,以此实现了全局有序这一特性)将带有 zxid 的消息作为一个提案(proposal)分发给所有 follower。
当 follower 接收到 proposal,先将 proposal 写到硬盘,写硬盘成功后再向 leader 回一个 ACK。
当 leader 接收到合法数量的 ACKs 后,leader 就向所有 follower 发送 COMMIT 命令,会在本地执行该消息。
当 follower 收到消息的 COMMIT 命令时,就会执行该消息。
6.11. 领导选举的流程
每个 Server 会发出一个投票,第一次都是投自己。投票信息:(myid,ZXID)
收集来自各个服务器的投票
处理投票并重新投票,处理逻辑:优先比较 ZXID,然后比较 myid
统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定 leader
改变服务器状态
网友评论