Kafka - Kafka 为啥抛弃 Zookeeper?

news/2024/11/29 23:42:00/

Kafka 为什么要抛弃 ZooKeeper?取代方案是怎样的?因为确实有优化空间。

Zookeeper加kafka 的架构,有三层角色:

  • zookeeper ,提供基础的状态持久化和状态通知服务

  • controller ,基于zookeeper提供的服务,给松散的broker提供统一的状态服务,但它本身没有状态服务,它是依赖zookeeper 的服务来做主控

  • 一层是broker ,无状态服务,因为他们无状态,无法自发组织起来,所以需要controller为他们做主控。其中有一个broker 兼职了controller 角色

这架构本没问题,但要优化也可以。zookeeper本来提供状态服务,但它不是kafka一部分,所以kafka不得不设计一个controller做主控。

假如controller本身就可提供状态服务,那三层架构就可简化成两层:

Kafka 抛弃zookeeper 就是做这优化,自己开发基于raft 共识算法的一致性服务kraft:

相比之前架构

还有很大优点,controller故障切换很快,且切换时间几乎不随集群规模而线性增长。

以前架构

controller 只有一个,如做controller故障切换,新controller需全量从zookeeper同步集群所有元数据信息并构建到内存,为做主控服务做准备,这些元数据信息包括topic和分区信息,如一个大规模集群,topic 和分区很多,该过程很耗时,也就会造成更久停机时间。

以前的架构也可以安排一些broker作为备选controller定期从zookeeper同步元数据,但这只是解决了部分问题,https://cwiki.apache.org/confluence/display/KAFKA/KIP-500:+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum。以前的架构,只有选出来的主控才会同步数据,其他没胜出的broker 只做broker 的角色。具体辩论,大家自查。

controller有多个,只是只有一个是leader 提供主控服务,其他的作为follower ,会实时同步leader的元数据信息,也就是元数据在多个controller 里面是几乎保持一致的(raft 协议保证的),所以故障切换的时候,几乎不需要再同步元数据,就可以完成controller 切换。

官方文件解读

参照官方的KIP议案。

Colin McCabe发起提案:[KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum]

具体讨论细节参考邮件列表:https://lists.apache.org/thread/w43g74zlttpn2nl2nyppp4fsdszwg7sb

要解决问题

为啥替换zk,主要:

  • 集群元数据的管理将更具有扩展性(scalable),更健壮(robust)

    之前受zookeeper的影响,集群可以创建的[topic]数量是受限的,新的架构可以支持更多的topic。

  • 简化Kafka的部署流程和配置成本

第一个集群状态[元数据管理]暴漏出来的问题:因为[元数据]管理(zk state)和集群状态的管理(controller state)是不同的数据管理路径,经常导致zk中的状态和集群控制器controller中的状态不一致的问题。两个数据源要进行数据状态的同步,这本身就是[分布式系统]中的一个让人头疼的事情。如果controller简单通过watch机制来监听zk的变更日志来同步状态的话,由于watch机制的限制,这个方法的性能会出问题,而且还没有考虑到watch通知机制的可靠性。

相比之前需要显示通知broker的方式,新的方式情况下,各个broker也将采取订阅 metadata event log的方式,和kafka本身要解决的问题本质上是类似的。broker本身要一个文件来存储自己维护的元数据信息。通过这种方式,kafka可以支持更多的partition数量,并且可以进一步的降低CPU的利用率。

第二个角度是从运维和配置的角度来看:

  • 由于引入了zk这个独立的分布式组件系统,那我们的运维人员在部署kafka的时候,除了kafka本身,还需要有zk的部署运维经验。而如果把zk依赖去掉,降低了系统部署和运维的难度

  • 去掉依赖之后,Kafka就有可能支持一个单节点的部署模式,方便大家更快的尝试Kafka。

Zookeeper在kafka生态中遇到一些问题梳理:

架构变更和产品[路线图]

提案大的架构设计变动图:

参考文献

大概的方案设计细节,大家可以参考[wiki文档]

  1. KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum
  2. Introducing KRaft: Kafka Without Zookeeper
  3. Colin McCabe Updates on Apache Kafka KRaft Mode
  4. Removing the Dependency of Zookeeper on Kafka
  5. Kafka Needs No Keeper
  6. Colin McCabe 在CMU的个人主页
  7. [KIP-98 - Exactly Once Delivery and Transactional Messaging]

http://www.ppmy.cn/news/1431269.html

相关文章

制造数字化“管理套路”

在当今竞争激烈的市场环境中,制造企业始终关心三个核心问题:生产效率、产品质量、成本控制,所以许多企业渴望加强对生产过程的管理控制。 生产过程是一个相对复杂的过程,涉及到多个环节和因素。从原材料的采购到产品的设计、生产…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1: 方法2: 3.c的调试 3.1调试方法一:先生成执行文件,再调试 3.2调试方法二:同时生成执行文件,调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

ChatGPT如何助力科研创新,提升研究效率?

随着人工智能技术的快速发展,其在科研领域的应用也愈发广泛。AI不仅提升了科研创新的效率,还为科研人员带来了前所未有的便利。本文将从ChatGPT深度科研应用、数据分析及机器学习、AI绘图以及高效论文撰写等方面,综述AI如何助力科研创新与效率…

C++之写时复制(CopyOnWrite)

设计模式专栏:http://t.csdnimg.cn/4j9Cq 目录 1.简介 2.实现原理 3.QString的实现分析 3.1.内部结构 3.2.写入时复制 4.示例分析 5.使用场景 6.总结 1.简介 CopyOnWrite (COW) 是一种编程思想,用于优化内存使用和提高性能。COW 的基本思想是&am…

软件测试 -- 自动化测试(Selenium)

在这里记录一下 自动化测试 -- Selenium 的一些基础知识点,只记录方法。 Selenium 浏览器操作 • get(): 打开浏览器 • getTitle(): 获取浏览器标题 • getCurrentUrl(): 获取当前页面的 URL 地址 • close(): 关闭浏览器 • quit(): 退出浏览器 • navigate().to…

qt文件操作的一些技巧

二、多线程处理大文件的最佳实践 1、避免共享状态 最根本解决方案是避免多个线程访问同一资源。我们可以将大文件分割成多个独立部分,分别由不同线程独占处理。只需引入一些同步点,进行简单的合并即可。 2、合理利用互斥量和读写锁 如果无法避免共享…

HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

页面跳转可以分为页面内跳转和页面间跳转,页面内跳转是指所跳转的页面在同一个 Ability 内部,它们之间的跳转可以使用 Router 或者 Navigator 的方式;页面间跳转是指所跳转的页面属与不同的 Ability ,这种跳转需要借助 featureAbi…

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper(JR) 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…