惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

李锋镝的博客

LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务 codebase-memory-mcp 极简完整使用指南 Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 SchedulingConfigurer详解 踩坑60+次后,我终于搞懂 Claude Skill 怎么写才会真的触发 Everything Claude Code 详细使用文档 配置Jackson使用字段而不是getter/setter来序列化和反序列化 这个域名注册整整十年了,十年时间,真快啊 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用 岁末 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 wordpress增加说说功能 Java 为什么有这么多 “O”? 别再背线程池的七大参数了,现在面试官都这么问 2024年11月1号 农历十月初一 我的第一个WordPress插件:Dylan Custom Plugin上线了 推荐一款比较养眼的Xshell配色方案 hnswlib installation failed 开工啦~ 阳了... MybatisCodeHelperPro激活 @Async注解的坑 新买的笔记本发货啦…… 这个中秋节感觉过的好累啊 IDEA下载源码报:Cannot connect to the Maven process. Try again later. RocketMQ的push消费方式实现详解 看病难~取药难~~ 笑死、腹肌……根本不可能有腹肌的~~ 居家办公了~ C# 11 的这个新特性,我愿称之最强! IntelliJ IDEA 2020.3.x永久白嫖(Windows/Mac) IDEA无限试用方法【2020.3最新亲测有效】 SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询 UUID太长怎么办?快来试试NanoId 忽然发现,在校大学生可以免费领一年有道云笔记会员~ 醒醒~补个税了 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章 来来来,用python画一个冰墩墩儿 SpringBoot整合GraphQL入门教程 办理居住证困难重重啊! 妈呀,昨天晚上睡觉做了一晚上的梦,可累死我了 感觉Typecho很简洁啊…… WordPress的自动更新好烦啊 BeanCopier工具类(性能优化工具类) 内存屏障浅析 居住证可算是申请通过了…… 试了下壁挂炉供暖 关于重阳节 居住证签注... Spring Boot 2.x使用PostgreSQL数据库 十一节后开工头一天,修了个耳机…… 玉楼春·尊前拟把归期说 nginx反向代理配置去除前缀 1931→2021! Navicat Premium数据库账号密码解密 百度的索引量数据现在有点儿太夸张了吧? 哇塞~这个小姐姐实在太惊艳了…… 关于8月29号下午博客故障的一些记录 如何形象的描述反应式编程中的背压(Backpressure)机制? 基于Java8的Either类 海琴烟~~~ JMX监控权限认证配置 IntelliJ IDEA 2019.3.3 永久激活 破解[Windows] SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码) SpringBoot整合Elasticsearch游标查询(scroll) GitLab创建新项目,初次提交命令和流程 吐槽下Google浏览器~ 从零搭建Spring Cloud Gateway网关(一) 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志 博客有logo啦 你的答案 数据库事务的一点简单总结 Spring Boot发展史(Spring Boot介绍) 【漫画】戏说外行对程序员的误会有多深 【收藏】从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议 Git中.gitignore文件不起作用的解决办法 背影 - 朱自清 jmap命令(jdk1.8) 彻底搞懂mysql日志系统binlog,redolog,undolog 出院了~~~ linux中ftp查看不到文件列表的问题 PHP版本怎么更新啊…… 成语接龙 StarUML4.0破解文件 Java SPI详解 WordPress评论框增加自定义表情 因在公司上不正经网站,我没过试用期… 优化了MYSQL大量写入问题,老板奖励了1000块给我 不慌不忙的坚强(林徽因39段最美文字!) ConcurrentHashMap常用方法源码解析(jdk1.8) 我是如何失去团队掌控的? HBASE填坑日志 关闭apache httpclient4.5 DEBUG日志 使用OpenShift搭建k8s集群 SonarQube Scanner的配置与使用简介
Kafka 为什么要抛弃 Zookeeper?
李锋镝 · 2025-10-17 · via 李锋镝的博客

Kafka 抛弃 Zookeeper(引入 KRaft 模式)是为了解决长期依赖 Zookeeper 带来的性能瓶颈、架构复杂度、可扩展性限制等核心问题。这一变革并非否定 Zookeeper 的价值,而是 Kafka 作为高吞吐消息系统,在规模和性能需求爆发式增长后,对自身架构的一次“去耦合”与“性能重构”。

在 Kafka 早期架构中,Zookeeper 承担着元数据存储、集群协调、控制器选举等关键角色:

  • 存储元数据:如主题(Topic)的分区信息、副本分布、 broker 列表等;
  • 集群协调:管理 broker 上线/下线、分区副本再平衡(Rebalance);
  • 控制器选举:当集群中“控制器”(Controller,负责分区leader选举的核心节点)故障时,通过 Zookeeper 重新选举新控制器。

但随着 Kafka 集群规模扩大(如十万级分区、数百个 broker),Zookeeper 的局限性逐渐成为瓶颈:

1. 性能瓶颈:元数据操作效率低下

Zookeeper 本质是一个分布式协调服务,而非为高吞吐元数据管理设计的存储系统,其核心问题在于:

  • 写入性能有限:Zookeeper 采用“主从复制”和“强一致性”设计,所有写入需经过 Leader 节点并同步至 Follower,单集群每秒写入能力通常在 1000-2000 次 级别。而 Kafka 集群在大规模场景下(如频繁创建主题、调整分区、broker 上下线),元数据更新频率可能远超 Zookeeper 承载能力,导致操作延迟飙升(从毫秒级增至秒级)。
  • 元数据膨胀:Kafka 的每个分区都需在 Zookeeper 中存储大量节点(如 /brokers/topics/[topic]/partitions/[p]/state),当分区数达到十万甚至百万级时,Zookeeper 的内存和磁盘压力剧增,甚至出现“节点数超限”(Zookeeper 单节点默认最多存储约 10 万个节点)的问题。
  • 额外网络开销:Kafka broker 需频繁与 Zookeeper 通信(如定期心跳、元数据同步),当集群规模扩大时,这种跨进程通信的网络延迟和带宽消耗不可忽视。

2. 架构复杂度:多系统协同成本高

依赖 Zookeeper 意味着 Kafka 集群的部署、维护、故障排查需同时兼顾两个独立系统:

  • 部署成本:需单独规划 Zookeeper 集群(至少 3 节点),且需保证其与 Kafka broker 的网络连通性和性能匹配;
  • 故障排查难度:当 Kafka 出现“分区不可用”“控制器选举失败”等问题时,需同时排查 Kafka 自身日志和 Zookeeper 日志,定位问题链路长(例如:控制器选举失败可能是 Zookeeper 超时,也可能是 Kafka 与 Zookeeper 通信故障);
  • 版本兼容性:Zookeeper 版本升级需同步验证与 Kafka 的兼容性,增加了系统维护的复杂度。

3. 可扩展性限制:无法适配超大规模集群

Kafka 的核心优势是“高吞吐、高扩展”,但 Zookeeper 的设计限制了其向更大规模演进:

  • 分区数量上限:如前所述,Zookeeper 对节点数量的限制(单集群约 10 万节点)直接限制了 Kafka 的分区总数(每个分区至少对应 1 个 Zookeeper 节点),而现代大数据场景(如实时数仓、日志中台)常需要百万级分区支持;
  • 控制器选举效率低:当控制器故障时,Kafka 需通过 Zookeeper 的“临时节点竞争”机制重新选举控制器,这一过程涉及多次 Zookeeper 读写,在大规模集群下可能耗时 10-30 秒,期间分区 leader 无法选举,影响服务可用性;
  • 再平衡(Rebalance)性能差:当 broker 下线或新增时,Kafka 需通过 Zookeeper 同步分区副本信息并触发再平衡,这一过程在分区数众多时会因 Zookeeper 读写延迟变得极其缓慢(甚至数分钟)。

二、KRaft 模式:Kafka 自研的元数据管理方案

为解决上述问题,Kafka 从 2.8 版本开始引入 KRaft(Kafka Raft Metadata Quorum) 模式,核心是用 Kafka 自身的 Raft 协议替代 Zookeeper,实现元数据的自主管理

KRaft 模式的核心设计是将集群节点分为两类:

  • 控制器节点(Controller Nodes):组成 Raft 集群(通常 3-5 节点),负责元数据存储、一致性维护、控制器选举;
  • broker 节点(Broker Nodes):负责处理消息读写,通过与控制器节点同步元数据(无需再依赖 Zookeeper)。

KRaft 解决了 Zookeeper 的哪些问题?

  1. 元数据管理效率提升 10 倍以上
    KRaft 直接将元数据存储在控制器节点的本地日志中(类似 Kafka 的消息日志),并通过 Raft 协议保证一致性。相比 Zookeeper:

    • 元数据写入不再受限于 Zookeeper 的性能瓶颈,支持每秒 10 万+ 次元数据操作(如创建分区、更新副本状态);
    • 元数据以“日志流”形式存储,天然支持高吞吐和水平扩展(可通过增加控制器节点提升容量);
    • broker 仅需与控制器节点同步元数据,减少了跨系统通信的网络开销。
  2. 架构简化:单一系统运维
    移除 Zookeeper 后,Kafka 集群仅需部署 Kafka 节点(控制器 + broker),无需维护独立的 Zookeeper 集群:

    • 部署步骤减少 50%(无需单独配置 Zookeeper 的 quorum、端口、数据目录等);
    • 故障排查链路缩短(元数据问题仅需分析 Kafka 自身日志);
    • 版本升级仅需关注 Kafka 自身,避免跨系统兼容性问题。
  3. 可扩展性突破:支持百万级分区
    KRaft 取消了 Zookeeper 对节点数量的限制,理论上支持百万级分区

    • 元数据存储不再依赖 Zookeeper 的节点结构,而是采用更紧凑的二进制格式,大幅降低内存占用;
    • 控制器选举基于 Raft 协议,无需 Zookeeper 参与,故障恢复时间从“秒级”缩短至“毫秒级”(通常 < 1 秒);
    • 再平衡过程通过控制器节点直接协调,避免了 Zookeeper 的中间环节,大规模集群下再平衡时间从“分钟级”降至“秒级”。
  4. 更优的一致性模型
    Zookeeper 采用“最终一致性”模型(部分操作如 watch 机制存在延迟),而 KRaft 基于 Raft 协议实现强一致性,元数据更新的可见性更可靠,减少了因元数据不一致导致的“分区不可用”“数据丢失”等问题。

三、从 Zookeeper 到 KRaft:并非一蹴而就的替代

Kafka 团队并未激进地直接删除 Zookeeper 支持,而是采用渐进式迁移策略:

  • 兼容期:Kafka 2.8+ 版本同时支持“Zookeeper 模式”和“KRaft 模式”,用户可根据需求选择;
  • 功能补齐:KRaft 模式在早期版本(2.8-3.0)存在部分功能缺失(如不支持某些安全特性),但在 3.3+ 版本已基本补齐,可覆盖绝大多数生产场景;
  • 迁移工具:提供 kafka-metadata-migrate 工具,支持从 Zookeeper 模式平滑迁移至 KRaft 模式(元数据无缝同步)。

总结:抛弃 Zookeeper 是 Kafka 规模化的必然

Kafka 依赖 Zookeeper 的设计在早期简化了开发,但随着其在大数据场景的普及(从“消息队列”进化为“流处理平台”),Zookeeper 的性能和扩展性限制逐渐成为瓶颈。

KRaft 模式的核心价值在于:让 Kafka 摆脱对外部协调服务的依赖,通过自研的元数据管理方案,实现更高的性能、更强的扩展性和更简单的架构。这一变革不是否定 Zookeeper,而是 Kafka 为适配超大规模、高吞吐场景做出的“自我进化”——就像成年后的系统,不再需要“外部拐杖”,而是依靠自身力量支撑更大的业务规模。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/tool/4517