首页  

ZooKeeper面试题     所属分类 zookeeper 浏览量 968
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 源码要点