ZooKeeper面试题
所属分类 zookeeper
浏览量 1097
ZooKeeper是什么
提供了什么
文件系统
ZAB 协议
四种类型的节点
Watcher 机制
客户端注册 Watcher 实现
服务端处理 Watcher 实现
客户端回调 Watcher
ACL 权限控制机制
Chroot 特性
会话管理
服务器角色
Server 工作状态
数据同步
如何保证事务的顺序一致性
分布式集群中为什么需要 Master
节点宕机如何处理
zk 负载均衡和 nginx 负载均衡区别
有哪几种几种部署模式
集群最少要几台机器,集群机制
是否支持动态添加机器
对节点的 watch 监听通知是永久的吗?为什么不是永久的?
java 客户端有哪些
chubby 是什么,与zk的比较
常用的命令
ZAB 和 Paxos 的联系与区别
典型应用场景
ZooKeeper 是什么
开源分布式协调服务
分布式应用可基于 ZK 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能
保证如下分布式一致性特性
顺序一致性
原子性
单一视图
可靠性
实时性(最终一致性)
读请求可以被集群中的任意节点处理
可在节点上注册监听器 watch
写请求转发给 leader 处理
节点增多,读吞吐能力提高但是写请求吞吐能力下降
有序性 全局有序 zxid(Zookeeper Transaction Id)
ZooKeeper 提供了什么
文件系统
通知机制
文件系统
多层级的节点命名空间 节点 znode , 可设置关联的数据
在内存中维护 树状的目录结构
不能用于存放大量的数据,每个节点存放数据上限为1M
ZAB 协议
支持崩溃恢复的原子广播协议
两种模式:崩溃恢复和消息广播
集群刚启动或者 Leader 服务器宕机、重启或者网络故障导致集群失效
崩溃恢复模式 选举leader
follower从leader 同步数据 , 超过半数机器 数据同步完成后 ,进入消息广播模式
Leader 开始接收客户端的事务请求生成事务提案进行事务请求处理
节点4种类型
PERSISTENT 持久节点
除非手动删除,否则一直存
EPHEMERAL 临时节点
临时节点生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zk连接断开不一定会话失效),那么这个客户端创建的临时节点都会被移除
PERSISTENT_SEQUENTIAL 持久顺序节点
节点名会追加由父节点维护的自增整型数字
EPHEMERAL_SEQUENTIAL 临时顺序节点
Watcher机制 数据变更通知
在节点上注册 Watcher 监听 , 节点数据或子节点发生变化时 ,服务端通知客户端
客户端注册
服务端处理
客户端回调
Watcher 特性
一次性 , 避免频繁变更的节点一直发送通知 减轻压力
客户端串行执行
客户端 Watcher 回调的过程是一个串行同步的过程。
轻量 通知事件不包含具体数据
通知事件
异步 只保证最终的一致性,无法保证强一致性
可注册监听的操作
getData exists getChildren
触发的操作
create delete setData
客户端注册 Watcher 实现
调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象
标记请求 request,封装 Watcher 到 WatchRegistration
封装成 Packet 对象,往服务端发送 request
收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中
服务端处理 Watcher 实现
接收 Watcher 并存储
数据节点路径 和 ServerCnxn 存储在WatcherManager 的 WatchTable 和 watch2Paths 中
ServerCnxn 代表一个客户端和服务端的连接,实现了 Watcher 的 process 接口,可以看成一个 Watcher 对象
public abstract class ServerCnxn implements Stats, Watcher
Watcher 触发
以服务端接收到 setData() 事务请求触发 NodeDataChanged 事件为例
封装 WatchedEvent
将通知状态 事件类型 节点路径封装成一个 WatchedEvent 对象
查询 Watcher
从 WatchTable 根据节点路径查找 Watcher
没找到说明没有客户端在该数据节点上注册过 Watcher
获取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher( Watcher 在服务端是一次性的,触发一次就失效了)
调用 process 方法来触发 Watcher
通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知
客户端回调 Watcher
EventThread 线程回调 Watcher
客户端的 Watcher 也是一次性的,一旦触发后,该 Watcher 就失效了
ACL权限控制
unix/linux
UGO(User/Group/Others)
ACL(Access Control List)访问控制列表
包括三个方面
权限模式(Scheme) 授权对象 权限 Permission
权限模式(Scheme)
IP:从 IP 地址粒度进行权限控制
Digest:最常用,用类似于 username:password 的权限标识来进行权限配置,便于区分不同应用来进行权限控制
World:最开放的权限控制方式,是一种特殊的 digest 模式,只有一个权限标识“world:anyone”
Super:超级用户
授权对象指的是权限赋予的用户或一个指定实体,例如 IP 地址
权限 Permission
CREATE:数据节点创建权限,允许授权对象在该 Znode 下创建子节点
DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点
READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等
WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作
ADMIN:数据节点管理权限,允许授权对象对该数据节点进行 ACL 相关设置操作
Chroot特性
3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。
如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。
会话管理
分桶策略
每个会话的 下次超时时间点 ExpirationTime
ExpirationTime_ = currentTime + sessionTimeout
ExpirationTime = (ExpirationTime_ / ExpirationInrerval + 1) *
ExpirationInterval , ExpirationInterval 是指 Zookeeper 会话超时检查时间间隔,默认 tickTime
服务器角色
Leader
事务请求的唯一调度和处理者,保证集群事务处理的顺序性
集群内部各服务的调度者
Follower
处理客户端的非事务请求(读请求),转发事务请求(写请求)给 Leader 服务器
参与事务请求 Proposal 的投票
参与 Leader 选举投票
Observer
3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提升集群的非事务处理能力
处理客户端的非事务请求,转发事务请求给 Leader 服务器
不参与任何形式的投票
Server 工作状态
四种状态 LOOKING FOLLOWING LEADING OBSERVING
LOOKING
寻找 Leader 状态 ,当前集群中没有 Leader,需要进入 Leader 选举状态
FOLLOWING
跟随者状态 ,表明当前服务器角色是 Follower
LEADING
领导者状态,表明当前服务器角色是 Leader
OBSERVING
观察者状态,表明当前服务器角色是 Observer
数据同步
集群完成 Leader 选举之后,Learner(Follower 和 Observer 的统称)向Leader 进行注册。
完成注册后,进入数据同步环节。
Learner 向 Learder 注册
数据同步
同步确认
数据同步通常分为四类
直接差异化同步(DIFF 同步)
先回滚再差异化同步(TRUNC+DIFF 同步)
仅回滚同步(TRUNC 同步)
全量同步(SNAP 同步)
leader 数据同步初始化
peerLastZxid
从 learner 注册时发送的 ACKEPOCH 消息中提取 lastZxid(该Learner 服务器最后处理的 ZXID)
minCommittedLog
Leader Proposal 缓存队列 committedLog 中最小 ZXID
maxCommittedLog
Leader 服务器 Proposal 缓存队列 committedLog 中最大 ZXID
直接差异化同步(DIFF 同步)
peerLastZxid 介于 minCommittedLog 和 maxCommittedLog之间先回滚再差异化同步(TRUNC+DIFF 同步)
TRUNC 同步
Leader 发现某个 Learner 包含了一条自己没有的事务记录,那么就需要让该 Learner 进行事务回滚
回滚到 Leader服务器上存在的,同时也是最接近于 peerLastZxid 的 ZXID仅回滚同步
peerLastZxid 大于 maxCommittedLog
全量同步(SNAP 同步)
场景一 peerLastZxid 小于 minCommittedLog
场景二 Leader 上没有 Proposal 缓存队列且 peerLastZxid 不等于 lastProcessZxid
如何保证事务的顺序一致性
全局递增的事务Id zxid
64位
高32位epoch( 时期; 纪元; 新时代)用来标识 leader 周期
新 leader 产生 ,递增
低 32 位用来递增计数
proposal 提议
两阶段提交
向其他 server 发出事务执行请求,超过半数机器执行成功,提交事务
分布式集群中为什么要有 Master
zk 节点宕机如何处理
2N+1 奇数个节点
集群至少3个节点
超过半数节点正常,集群就能正常提供服务
3 个节点的 cluster 可以挂掉 1 个节点
部署模式
单机模式 伪集群模式 集群模式
如何添加节点
修改配置后,重启集群
逐个重启 ,过半存活即可用 ,一个节点重启不影响集群功能
为何 对节点的 watch 监听 是一次性的
避免频繁变更的节点一直发送通知 减轻压力
java 客户端都有哪些
官方自带的client
Apache 开源的 Curator
chubby 与 zk 比较
chubby google 完全实现 paxos 算法
zk 使用 zab 协议,paxos 算法的变种
常用的命令
ls get set create delete
ZAB 和 Paxos 联系与区别
相同点
两者都存在一个类似于 Leader 的角色,由其负责协调多个 Follower 运行
Leader 会等待超过半数的 Follower 反馈后,才会提交提案
ZAB 协议中,每个 Proposal 中都包含一个 epoch 值来代表当前的 Leader周期,Paxos 中名字为 Ballot
不同点
ZAB 用来构建高可用的分布式数据主备系统
Paxos 用来构建分布式一致性状态机系统
典型应用场景
分布式数据管理与协调
Watcher 事件通知机制
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群管理
Master 选举
分布式锁
分布式队列
上一篇
下一篇
springboot 构造注入实例
zookeeper配置参数
dubbo面试题
springboot 读取中文配置乱码
jmx_prometheus_javaagent 使用
jmx_exporter JmxCollector 源码要点