ZooKeeper面试题:从基础到深入

基础概念

  1. 什么是ZooKeeper?它的主要用途是什么?

    • ZooKeeper是一个分布式的、开源的协调服务,用于分布式应用程序
    • 主要用途:配置管理、命名服务、分布式同步、集群管理等
  2. ZooKeeper的数据模型是怎样的?

    • 采用类似文件系统的层次化命名空间(树形结构)
    • 每个节点称为znode,可以存储数据和子节点
    • 分为持久节点和临时节点
  3. ZooKeeper中的节点(znode)有哪些类型?

    • 持久节点(PERSISTENT):创建后一直存在,直到显式删除
    • 临时节点(EPHEMERAL):客户端会话结束时自动删除
    • 持久顺序节点(PERSISTENT_SEQUENTIAL):持久节点+顺序编号
    • 临时顺序节点(EPHEMERAL_SEQUENTIAL):临时节点+顺序编号
  4. ZooKeeper的Watch机制是什么?

    • 客户端可以在znode上设置watch来监听节点变化
    • 当znode发生变化时,ZooKeeper会通知客户端
    • Watch是一次性的,触发后需要重新设置

架构与原理

  1. ZooKeeper集群中的角色有哪些?

    • Leader:负责处理所有写请求和事务性操作
    • Follower:处理读请求,参与Leader选举和提案投票
    • Observer:与Follower类似,但不参与投票,用于扩展读性能
  2. ZooKeeper如何保证数据一致性?

    • 使用ZAB协议(ZooKeeper Atomic Broadcast)
    • 所有写请求都通过Leader处理,并广播给所有Follower
    • 只有多数节点确认后,写操作才会提交
  3. ZAB协议的工作原理是什么?

    • 分为两个阶段:

      1. 发现阶段:选举Leader并同步数据
      2. 广播阶段:Leader将更新广播给Follower
    • 使用两阶段提交确保数据一致性
  4. ZooKeeper的选举过程是怎样的?

    • 每个节点都有唯一的myid和zxid(最后事务ID)
    • 节点投票给zxid最大的节点,zxid相同则投给myid大的
    • 获得多数票的节点成为Leader

高级特性

  1. ZooKeeper如何处理脑裂问题?

    • 通过"多数派"原则解决
    • 只有获得多数节点认可的Leader才能提供服务
    • 少数派分区中的节点无法选举出有效Leader
  2. ZooKeeper的会话(Session)机制是怎样的?

    • 客户端与服务器建立TCP连接时创建会话
    • 会话有超时时间(sessionTimeout)
    • 心跳机制保持会话活跃
    • 会话过期时,临时节点会被删除
  3. ZooKeeper的ACL权限控制是如何工作的?

    • 每个znode可以设置访问控制列表(ACL)
    • ACL由(scheme:expression, permissions)组成
    • 常用scheme:world, auth, digest, ip等
    • 权限:CREATE, READ, WRITE, DELETE, ADMIN
  4. ZooKeeper的读写性能特点是什么?

    • 读性能高:所有服务器都可处理读请求
    • 写性能较低:所有写请求必须通过Leader处理
    • 适合读多写少的场景

实际应用

  1. 如何使用ZooKeeper实现分布式锁?

    • 创建临时顺序节点
    • 检查自己是否是最小序号的节点
    • 如果是则获取锁,否则监听前一个节点
    • 释放锁时删除自己的节点
  2. ZooKeeper如何实现配置管理?

    • 将配置信息存储在持久znode中
    • 客户端watch该znode的变化
    • 配置更新时,所有客户端会收到通知并获取新配置
  3. ZooKeeper如何实现服务注册与发现?

    • 服务提供者创建临时znode(如/services/service1/node1)
    • 服务消费者watch父znode(/services/service1)的子节点变化
    • 当服务提供者上线/下线时,消费者会收到通知
  4. ZooKeeper如何实现Leader选举?

    • 所有候选节点创建临时顺序znode
    • 序号最小的节点成为Leader
    • 其他节点watch比它小的节点
    • 当Leader失效时,下一个序号的节点成为新Leader

性能优化与运维

  1. 如何优化ZooKeeper的性能?

    • 合理设置sessionTimeout
    • 使用Observer节点扩展读能力
    • 避免过多watch和频繁的小数据量写入
    • 适当增加snapshot和log清理频率
  2. ZooKeeper的监控指标有哪些关键点?

    • 节点数量和数据大小
    • 请求延迟和吞吐量
    • Watch数量
    • 连接数和会话数
    • 领导者状态和选举次数
  3. 如何诊断ZooKeeper的性能问题?

    • 检查四字命令如stat, mntr
    • 分析日志中的WARN和ERROR
    • 监控网络延迟和磁盘I/O
    • 检查是否有过多的watch或大znode
  4. ZooKeeper的备份和恢复策略是什么?

    • 定期备份事务日志和快照文件
    • 可以通过恢复快照+重放事务日志来恢复
    • 重要数据建议多重备份机制

与其他技术对比

  1. ZooKeeper与etcd有何异同?

    • 相同点:都是分布式一致性协调服务
    • 不同点:
      • etcd使用Raft协议,ZooKeeper使用ZAB
      • etcd提供HTTP/gRPC接口,ZooKeeper有自己的客户端API
      • etcd更简单轻量,ZooKeeper功能更丰富
  2. 为什么Kafka早期版本依赖ZooKeeper,新版本要移除?

    • 早期用于broker注册、topic配置、ISR管理等
    • 依赖ZooKeeper增加了复杂度
    • 新版本使用Kafka内部共识协议(KRaft)替代
  3. ZooKeeper适合哪些场景,不适合哪些场景?

    • 适合场景:配置管理、服务发现、分布式锁、Leader选举
    • 不适合场景:大数据量存储、高频写操作、需要强一致性读

【ZooKeeper面试题】从基础到深入的更多相关文章

  1. ZooKeeper 面试题

    高强度训练第二十一天总结 1. ZooKeeper 面试题 ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群 中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终 ...

  2. 2019年面试官最喜欢问的28道ZooKeeper面试题

    前言 ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. ZooKeeper 的 ...

  3. 2020年最新ZooKeeper面试题(附答案)

    2020年最新ZooKeeper面试题 1. ZooKeeper 是什么? ZooKeeper 是一个开源的分布式协调服务.它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zooke ...

  4. Zookeeper 面试题(持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  6. 最新整理的spring面试题从基础到高级,干货满满

    最新整理的spring面试题从基础到高级,干货满满 前言: 收藏了一些关于Spring的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的理论知识. spring ...

  7. [Linux]经典面试题 - 网络基础 - TCP三次握手

    [Linux]经典面试题 - 网络基础 - TCP三次握手 目录 [Linux]经典面试题 - 网络基础 - TCP三次握手 一.TCP报文格式 1.1 TCP报头 1.2 报文图例 二.TCP三次握 ...

  8. Python自动化测试面试题-Python基础篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  9. 29道Zookeeper面试题超详细(附答案)

    原文链接 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件 ...

  10. C/C++笔试题(基础题)

    为了便于温故而知新,特于此整理 C/C++ 方面相关面试题.分享,共勉. (备注:各题的重要程度与先后顺序无关.不断更新中......欢迎补充) (1)分析下面程序的输出(* 与 -- 运算符优先级问 ...

随机推荐

  1. mac zsh终端 goframe gf 别名冲突

    前言 如果你使用的是 zsh 终端,可能会存在 gf 别名冲突( git fetch 快捷指令) 解决 终端运行 alias gf=gf,gf 工具会自动修改 .zshrc 中的别名设置,source ...

  2. linux的zip命令详解 | Linux文件打包成Zip的命令和方法

    zip 命令用来压缩文件 参数: -A:调整可执行的自动解压缩文件: -b<工作目录>:指定暂时存放文件的目录: -c:替每个被压缩的文件加上注释: -d:从压缩文件内删除指定的文件: - ...

  3. 如何避免VMware平台ESXi主机CPU使用率的“坑”?

    https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650636818&idx=1&sn=c43f3a3146092f ...

  4. TJSON的烦人的泄漏

    System.Json中的JSON应该说还是好用的,因为相关superObject的json使用,转换过来概念思路上有点混淆搞不清. 正题:老是泄漏.一会儿是TJSONArray,一会儿是TJSONO ...

  5. mysql分区自动维护(SpringBoot+MybatisPlus)

    1.环境 SpringBoot + MybatisPlus + MySQL 2.简介 通过定时器@Scheduled每日触发,查询当前库中所有分区表(这里以时间段进行分区) 判断剩余分区是否小于自定义 ...

  6. leetcode001 两数之和

    问题描述:两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答 ...

  7. VMware平台的Ubuntu部署完全分布式Hadoop环境

    前言: 此文章是本人初次部署Hadoop的过程记录以及所遇到的问题解决,这篇文章只有实际操作部分,没有理论部分.因本人水平有限,本文难免存在不足的地方,如果您有建议,欢迎留言或私信告知于我,非常感谢. ...

  8. SpringMVC的执行过程

    环境准备 package org.example.springmvclearn; public record Greeting(long id, String content) { } package ...

  9. 为什么 Java 新生代被划分为 S0、S1 和 Eden 区?

    为什么 Java 新生代被划分为 S0.S1 和 Eden 区? 在 Java 的 垃圾回收(GC)机制中,新生代 被进一步划分为 Eden 区 和两个 Survivor 区(S0 和 S1).这种划 ...

  10. kettle介绍-Step之If field value is null

    If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换,也可以指定一种类型下的空值进行替换,还可以指定一个字段下的空值进行替换 三种替换NULL模式 ...