【ZooKeeper面试题】从基础到深入
ZooKeeper面试题:从基础到深入
基础概念
什么是ZooKeeper?它的主要用途是什么?
- ZooKeeper是一个分布式的、开源的协调服务,用于分布式应用程序
- 主要用途:配置管理、命名服务、分布式同步、集群管理等
ZooKeeper的数据模型是怎样的?
- 采用类似文件系统的层次化命名空间(树形结构)
- 每个节点称为znode,可以存储数据和子节点
- 分为持久节点和临时节点
ZooKeeper中的节点(znode)有哪些类型?
- 持久节点(PERSISTENT):创建后一直存在,直到显式删除
- 临时节点(EPHEMERAL):客户端会话结束时自动删除
- 持久顺序节点(PERSISTENT_SEQUENTIAL):持久节点+顺序编号
- 临时顺序节点(EPHEMERAL_SEQUENTIAL):临时节点+顺序编号
ZooKeeper的Watch机制是什么?
- 客户端可以在znode上设置watch来监听节点变化
- 当znode发生变化时,ZooKeeper会通知客户端
- Watch是一次性的,触发后需要重新设置
架构与原理
ZooKeeper集群中的角色有哪些?
- Leader:负责处理所有写请求和事务性操作
- Follower:处理读请求,参与Leader选举和提案投票
- Observer:与Follower类似,但不参与投票,用于扩展读性能
ZooKeeper如何保证数据一致性?
- 使用ZAB协议(ZooKeeper Atomic Broadcast)
- 所有写请求都通过Leader处理,并广播给所有Follower
- 只有多数节点确认后,写操作才会提交
ZAB协议的工作原理是什么?
- 分为两个阶段:
- 发现阶段:选举Leader并同步数据
- 广播阶段:Leader将更新广播给Follower
- 使用两阶段提交确保数据一致性
- 分为两个阶段:
ZooKeeper的选举过程是怎样的?
- 每个节点都有唯一的myid和zxid(最后事务ID)
- 节点投票给zxid最大的节点,zxid相同则投给myid大的
- 获得多数票的节点成为Leader
高级特性
ZooKeeper如何处理脑裂问题?
- 通过"多数派"原则解决
- 只有获得多数节点认可的Leader才能提供服务
- 少数派分区中的节点无法选举出有效Leader
ZooKeeper的会话(Session)机制是怎样的?
- 客户端与服务器建立TCP连接时创建会话
- 会话有超时时间(sessionTimeout)
- 心跳机制保持会话活跃
- 会话过期时,临时节点会被删除
ZooKeeper的ACL权限控制是如何工作的?
- 每个znode可以设置访问控制列表(ACL)
- ACL由(scheme:expression, permissions)组成
- 常用scheme:world, auth, digest, ip等
- 权限:CREATE, READ, WRITE, DELETE, ADMIN
ZooKeeper的读写性能特点是什么?
- 读性能高:所有服务器都可处理读请求
- 写性能较低:所有写请求必须通过Leader处理
- 适合读多写少的场景
实际应用
如何使用ZooKeeper实现分布式锁?
- 创建临时顺序节点
- 检查自己是否是最小序号的节点
- 如果是则获取锁,否则监听前一个节点
- 释放锁时删除自己的节点
ZooKeeper如何实现配置管理?
- 将配置信息存储在持久znode中
- 客户端watch该znode的变化
- 配置更新时,所有客户端会收到通知并获取新配置
ZooKeeper如何实现服务注册与发现?
- 服务提供者创建临时znode(如/services/service1/node1)
- 服务消费者watch父znode(/services/service1)的子节点变化
- 当服务提供者上线/下线时,消费者会收到通知
ZooKeeper如何实现Leader选举?
- 所有候选节点创建临时顺序znode
- 序号最小的节点成为Leader
- 其他节点watch比它小的节点
- 当Leader失效时,下一个序号的节点成为新Leader
性能优化与运维
如何优化ZooKeeper的性能?
- 合理设置sessionTimeout
- 使用Observer节点扩展读能力
- 避免过多watch和频繁的小数据量写入
- 适当增加snapshot和log清理频率
ZooKeeper的监控指标有哪些关键点?
- 节点数量和数据大小
- 请求延迟和吞吐量
- Watch数量
- 连接数和会话数
- 领导者状态和选举次数
如何诊断ZooKeeper的性能问题?
- 检查四字命令如stat, mntr
- 分析日志中的WARN和ERROR
- 监控网络延迟和磁盘I/O
- 检查是否有过多的watch或大znode
ZooKeeper的备份和恢复策略是什么?
- 定期备份事务日志和快照文件
- 可以通过恢复快照+重放事务日志来恢复
- 重要数据建议多重备份机制
与其他技术对比
ZooKeeper与etcd有何异同?
- 相同点:都是分布式一致性协调服务
- 不同点:
- etcd使用Raft协议,ZooKeeper使用ZAB
- etcd提供HTTP/gRPC接口,ZooKeeper有自己的客户端API
- etcd更简单轻量,ZooKeeper功能更丰富
为什么Kafka早期版本依赖ZooKeeper,新版本要移除?
- 早期用于broker注册、topic配置、ISR管理等
- 依赖ZooKeeper增加了复杂度
- 新版本使用Kafka内部共识协议(KRaft)替代
ZooKeeper适合哪些场景,不适合哪些场景?
- 适合场景:配置管理、服务发现、分布式锁、Leader选举
- 不适合场景:大数据量存储、高频写操作、需要强一致性读
【ZooKeeper面试题】从基础到深入的更多相关文章
- ZooKeeper 面试题
高强度训练第二十一天总结 1. ZooKeeper 面试题 ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群 中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终 ...
- 2019年面试官最喜欢问的28道ZooKeeper面试题
前言 ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. ZooKeeper 的 ...
- 2020年最新ZooKeeper面试题(附答案)
2020年最新ZooKeeper面试题 1. ZooKeeper 是什么? ZooKeeper 是一个开源的分布式协调服务.它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zooke ...
- Zookeeper 面试题(持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Java面试题之基础篇概览
Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...
- 最新整理的spring面试题从基础到高级,干货满满
最新整理的spring面试题从基础到高级,干货满满 前言: 收藏了一些关于Spring的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的理论知识. spring ...
- [Linux]经典面试题 - 网络基础 - TCP三次握手
[Linux]经典面试题 - 网络基础 - TCP三次握手 目录 [Linux]经典面试题 - 网络基础 - TCP三次握手 一.TCP报文格式 1.1 TCP报头 1.2 报文图例 二.TCP三次握 ...
- Python自动化测试面试题-Python基础篇
目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...
- 29道Zookeeper面试题超详细(附答案)
原文链接 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件 ...
- C/C++笔试题(基础题)
为了便于温故而知新,特于此整理 C/C++ 方面相关面试题.分享,共勉. (备注:各题的重要程度与先后顺序无关.不断更新中......欢迎补充) (1)分析下面程序的输出(* 与 -- 运算符优先级问 ...
随机推荐
- mac zsh终端 goframe gf 别名冲突
前言 如果你使用的是 zsh 终端,可能会存在 gf 别名冲突( git fetch 快捷指令) 解决 终端运行 alias gf=gf,gf 工具会自动修改 .zshrc 中的别名设置,source ...
- linux的zip命令详解 | Linux文件打包成Zip的命令和方法
zip 命令用来压缩文件 参数: -A:调整可执行的自动解压缩文件: -b<工作目录>:指定暂时存放文件的目录: -c:替每个被压缩的文件加上注释: -d:从压缩文件内删除指定的文件: - ...
- 如何避免VMware平台ESXi主机CPU使用率的“坑”?
https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650636818&idx=1&sn=c43f3a3146092f ...
- TJSON的烦人的泄漏
System.Json中的JSON应该说还是好用的,因为相关superObject的json使用,转换过来概念思路上有点混淆搞不清. 正题:老是泄漏.一会儿是TJSONArray,一会儿是TJSONO ...
- mysql分区自动维护(SpringBoot+MybatisPlus)
1.环境 SpringBoot + MybatisPlus + MySQL 2.简介 通过定时器@Scheduled每日触发,查询当前库中所有分区表(这里以时间段进行分区) 判断剩余分区是否小于自定义 ...
- leetcode001 两数之和
问题描述:两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答 ...
- VMware平台的Ubuntu部署完全分布式Hadoop环境
前言: 此文章是本人初次部署Hadoop的过程记录以及所遇到的问题解决,这篇文章只有实际操作部分,没有理论部分.因本人水平有限,本文难免存在不足的地方,如果您有建议,欢迎留言或私信告知于我,非常感谢. ...
- SpringMVC的执行过程
环境准备 package org.example.springmvclearn; public record Greeting(long id, String content) { } package ...
- 为什么 Java 新生代被划分为 S0、S1 和 Eden 区?
为什么 Java 新生代被划分为 S0.S1 和 Eden 区? 在 Java 的 垃圾回收(GC)机制中,新生代 被进一步划分为 Eden 区 和两个 Survivor 区(S0 和 S1).这种划 ...
- kettle介绍-Step之If field value is null
If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换,也可以指定一种类型下的空值进行替换,还可以指定一个字段下的空值进行替换 三种替换NULL模式 ...