Kafka 的未来:为何我们要抛弃 ZooKeeper?

这篇具有很好参考价值的文章主要介绍了Kafka 的未来:为何我们要抛弃 ZooKeeper?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ZooKeeper 的核心功能
ZooKeeper 是一个广泛使用的开源分布式协调服务框架,它在确保数据一致性方面表现出色,同时也可以作为一个轻量级的分布式存储系统。它特别适合用来存储那些需要多个系统共享的配置信息、集群的元数据等。ZooKeeper 提供了持久节点和临时节点两种类型,其中临时节点的功能在结合了 Watcher 机制后显得尤为强大。当一个客户端与 ZooKeeper 的连接断开,它所创建的临时节点将会自动删除,同时,那些订阅了节点状态变更通知的客户端将会及时接收到相关通知。这种机制使得 ZooKeeper 在处理分布式系统中的协调任务时非常高效。

kafka订阅和消费区别,kafka,zookeeper

因此,ZooKeeper 能够侦测到集群中任何服务的启动或关闭,这使得它成为实现服务发现和故障转移监听机制的理想选择。Kafka 便是一个依赖于 ZooKeeper 的典型例子,没有 ZooKeeper 的支持,Kafka 将无法正常运作。ZooKeeper 为 Kafka 提供了元数据管理的功能,包括但不限于 Broker 的信息、主题数据、分区数据等。每当 Kafka 的 Broker 启动时,它都会与 ZooKeeper 进行通信,确保 ZooKeeper 能够维护集群中所有主题、配置和副本等关键信息。
kafka订阅和消费区别,kafka,zookeeper

ZooKeeper 还承担着诸如选举和扩容等重要机制的功能。例如,在控制器选举过程中,每个 Kafka Broker 启动时都会尝试在 ZooKeeper 中注册一个临时的 “/controller” 节点以参与竞选,首先成功创建该节点的 Broker 将被选为控制器。其他竞争失败的节点则会通过 Watcher 机制监控这个节点,一旦控制器发生故障,其他 Broker 将继续进行竞选,从而实现控制器的故障转移。这进一步凸显了 ZooKeeper 对 Kafka 的重要性。
二、为何要放弃 ZooKeeper
软件架构随着时间不断演进,当出现瓶颈时,变革便成为了必然。以下是一些放弃 ZooKeeper 的原因:
2.1、运维层面的问题
首先,作为一个中间件,Kafka 却需要依赖于另一个中间件 ZooKeeper,这种设计在某种程度上显得不太合理。虽然依赖如 Netty 这样的网络框架是可以理解的,但 Kafka 需要运行在 ZooKeeper 集群之上,这显得有些不协调。这就意味着,如果公司想要部署 Kafka,就必须同时部署 ZooKeeper,这无疑增加了运维的复杂性。因此,运维人员不仅要管理 Kafka 集群,还要管理 ZooKeeper 集群。
2.2、性能层面的问题
ZooKeeper 强调一致性,当一个节点上的数据发生变化时,其他节点必须等待通知并同步更新,这要求所有节点(超过半数)完成写入后才能继续,这种机制在写入性能上存在瓶颈。

kafka订阅和消费区别,kafka,zookeeper

如您所见,ZooKeeper 被描述为一个适用于存储简单配置或集群元数据的小量存储系统,它并不是一个传统意义上的存储系统。当处理大量写入数据时,ZooKeeper 的性能和稳定性可能会受到影响,导致 Watch 通知的延迟或丢失。特别是在 Kafka 集群规模较大、分区数量众多的情况下,ZooKeeper 存储的元数据量会增加,其性能就会显得不足。此外,ZooKeeper 作为分布式系统,也需要进行选举,而选举过程不仅缓慢,还会在选举期间导致服务不可用。

2.3、针对 ZooKeeper 的性能问题,Kafka 已经进行了一些改进。例如,以前消费者的位移数据存储在 ZooKeeper 上,提交位移或获取位移时都需要访问 ZooKeeper,这在数据量大时会导致 ZooKeeper 承受不住。为此,Kafka 引入了位移主题(如 “__consumer_offsets”),将位移的提交和获取作为消息处理,存储在日志中,从而避免了频繁访问 ZooKeeper 的性能问题。对于一些需要支持百万级别分区的大公司来说,当前 Kafka 单集群架构下无法稳定运行,即单集群支持的分区数量有限。因此,Kafka 需要摆脱对 ZooKeeper 的依赖。

2.4、那么,没有了 ZooKeeper 的 Kafka 会是什么样子呢?没有了 ZooKeeper 的 Kafka 将元数据存储移至内部,利用现有的日志存储机制来保存元数据。就像之前提到的位移主题一样,会有一个专门的元数据主题,元数据就像普通消息一样存储在日志中。因此,元数据的存储和之前的位移存储一样,通过现有的消息存储机制进行了一些改造,实现了所需功能,非常巧妙!此外,Kafka 还引入了 KRaft 模式来实现控制器的一致性。

kafka订阅和消费区别,kafka,zookeeper


这个协议是基于 Raft 算法的,具体的协议细节这里就不展开了,你只需要知道它能够有效地解决控制器领导者的选举问题,并确保集群内所有节点达成一致。
在以前依赖 ZooKeeper 实现的单控制器模式中,当分区数量巨大时,故障转移的过程往往非常缓慢。

这是因为当控制器发生变更时,需要将所有元数据重新加载到新的控制器上,并且将这些元数据同步给集群中的所有 Kafka Broker。
而在控制器集群(Controller Quorum)中,领导者的选举和切换过程就快得多,因为元数据已经在集群中同步,即集群中的所有 Broker 都已经拥有完整的元数据,无需重新加载。
此外,其他 Broker 已经基于日志存储了部分元数据,因此只需进行增量更新,而不需要全量更新。
通过这样的改进,就解决了之前由于元数据过多而无法支持更多分区的问题。

三、结语
可能会有读者思考,为什么一开始不直接采用这样的实现方式呢?
这是因为 ZooKeeper 是一个功能强大且经过实践验证的工具,早期使用它来实现某些功能是非常简单的,无需从头开始自己实现。
如果不是因为 ZooKeeper 的机制遇到了性能瓶颈,这样的改造可能永远不会发生。
软件开发就是这样,没有必要重复造轮子,找到合适的工具和解决方案才是关键。

AigcFox工具箱--主流自媒体平台视频、图文内容一键发布。视频、图片自动裂变n份并去重。多账号自动发布,模拟人工操作,无人值守。账户绑定上网卡或手机共享网络,可实现发布IP隔离。AI内容:可对文章、图片改写、润色、增强。文章来源地址https://www.toymoban.com/news/detail-787845.html

到了这里,关于Kafka 的未来:为何我们要抛弃 ZooKeeper?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多个消费者订阅一个Kafka的Topic(使用@KafkaListener和KafkaTemplate)

    记录 :465 场景 :一个Producer在一个Topic发布消息,多个消费者Consumer订阅Kafka的Topic。每个Consumer指定一个特定的ConsumerGroup,达到一条消息被多个不同的ConsumerGroup消费。 版本 :JDK 1.8,Spring Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。 Kafka集群安装 :https://blog.csdn.net/zhangbeizhen18/arti

    2024年02月15日
    浏览(34)
  • Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)

    1.1、案例需求 创建一个独立消费者,消费firstTopic主题 0 号分区的数据,所下图所示: 1.2、案例代码 生产者往firstTopic主题 0 号分区发送数据代码 消费者消费firstTopic主题 0 分区数据代码 1.3、测试 在 IDEA 中执行消费者程序,如下图: 在 IDEA 中执行生产者程序 ,在控制台观察

    2024年02月09日
    浏览(36)
  • 在Windows上搭建Kafka环境的步骤,包括安装Java、下载Kafka、配置Zookeeper和Kafka、启动Zookeeper和Kafka、创建主题和生产者/消费者等

    1. 安装Java Kafka需要Java环境支持。可以从Oracle官网下载JDK,或者使用OpenJDK。 2. 下载Kafka 可以从Kafka官网下载Kafka二进制压缩包。解压后可以看到bin、config、libs等目录。 3. 配置Zookeeper Kafka依赖Zookeeper实现分布式协作。可以使用Kafka自带的Zookeeper,也可以独立安装Zookeeper。 如果使

    2024年02月11日
    浏览(33)
  • Springboot最简单的实战介绍 整合kafka-生产者与消费者(消息推送与订阅获取)

    #spring.kafka.bootstrap-servers=123.xxx.x.xxx:19092,123.xxx.x.xxx:19093,123.xxx.x.xxx:19094 spring.kafka.bootstrap-servers=192.168.x.xxx:9092 #=============== producer生产者 ======================= spring.kafka.producer.retries=0 spring.kafka.producer.batch-size=16384 spring.kafka.producer.buffer-memory=33554432 spring.kafka.producer.key-serializer=org.ap

    2024年04月09日
    浏览(35)
  • Kafka性能篇:为何Kafka这么“快“?

    从高度抽象的角度来看,性能问题逃不出下面三个方面: 网络 磁盘 复杂度 对于 Kafka 这种网络分布式队列来说,网络和磁盘更是优化的重中之重。针对于上面提出的抽象问题,解决方案高度抽象出来也很简单: 并发 压缩 批量 缓存 算法 知道了问题和思路,我们再来看看,

    2024年02月11日
    浏览(20)
  • 13、Kafka ------ kafka 消费者API用法(消费者消费消息代码演示)

    消费者API的核心类是 KafkaConsumer,它提供了如下常用方法: 下面这些方法都体现了Kafka是一个数据流平台,消费者通过这些方法可以从分区的任意位置、重新开始读取数据。 根据KafkaConsumer不难看出,使用消费者API拉取消息很简单,基本只要几步: 1、创建KafkaConsumer对象,创建

    2024年04月11日
    浏览(33)
  • Kafka及Kafka消费者的消费问题及线程问题

    Topic:是 Kafka 消息发布和订阅的基本单元,同时也是消息的容器。Topic 中的消息被分割成多个分区进行存储和处理。 Partition:是 Topic 分区,将 Topic 细分成多个分区,每个分区可以独立地存储在不同的 Broker 中,从而增加了消息的并发性、可扩展性和吞吐量。 Broker:是 Kafka

    2024年02月14日
    浏览(34)
  • Kafka进阶篇-消费者详解&Flume消费Kafka原理

    由于挺多时候如果不太熟系kafka消费者详细的话,很容易产生问题,所有剖析一定的原理很重要。 消费方式 消费者总体工作流程 消费者组初始化流程   消费者详细消费流程   消费者重要参数  bootstrap.servers 向 Kafka 集群建立初始连接用到的 host/port 列表。 key.deserializervalu

    2024年02月15日
    浏览(37)
  • 【Kafka】Kafka消费者

    pull(拉)模式:consumer采用从broker中主动拉取数据。 Kafka采用这种方式。 push(推)模式:Kafka没有采用这种方式,因为由broker决定消息发送速率,很难适应所有的消费者的消费速率。例如推送的速度是50m/s,consumer1和consumer2旧来不及处理消息。 pull模式不足之处是,如果Kafka没有数

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包