ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

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

ZooKeeper 的作用

ZooKeeper 是一个开源的分布式协调服务框架,你也可以认为它是一个可以保证一致性的分布式(小量)存储系统。特别适合存储一些公共的配置信息、集群的一些元数据等等。

它有持久节点和临时节点,而临时节点这个玩意再配合 Watcher 机制就很有用。

当创建临时节点的客户端与 ZooKeeper 断连之后,这个临时节点就会消失,并且订阅了节点状态变更的客户端会收到这个节点状态变更的通知。

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

所以集群中某一服务上线或者下线,都可以被检测到。因此可以用来实现服务发现,也可以实现故障转移的监听机制。

Kafka 就是强依赖于 ZooKeeper,没有 ZooKeeper 的话 Kafka 都无法运行。

ZooKeeper 为 Kafka 提供了元数据的管理,例如一些 Broker 的信息、主题数据、分区数据等等。

在每个 Broker 启动的时候,都会和 ZooKeeper 进行交互,这样 ZooKeeper 就存储了集群中所有的主题、配置、副本等信息。

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

还有一些选举、扩容等机制也都依赖 ZooKeeper 。

例如控制器的选举:每个 Broker 启动都会尝试在 ZooKeeper 注册/controller临时节点来竞选控制器,第一个创建/controller节点的 Broker 会被指定为控制器。

竞争失败的节点也会依赖 watcher 机制,监听这个节点,如果控制器宕机了,那么其它 Broker 会继续来争抢,实现控制器的 failover。

从上面就可以得知 ZooKeeper 对 Kafka 来说,很重要。

那为什么要抛弃 ZooKeeper

软件架构都是演进的,之所以要变更那肯定是因为出现了瓶颈。

先来看看运维的层面的问题。

首先身为一个中间件,需要依赖另一个中间件,这就感觉有点奇怪。

你要说依赖 Netty 这种,那肯定是没问题的。

但是 Kafka 的运行需要提供 ZooKeeper 集群,这其实有点怪怪的。

就等于如果你公司要上 Kafka 就得跟着上 ZooKeeper ,被动了增加了运维的复杂度。

好比你去商场买衣服,要买个上衣,服务员说不单卖,要买就得买一套,这钱是不是多花了?

所以运维人员不仅得照顾 Kafka 集群,还得照顾 ZooKeeper 集群。

再看性能层面的问题。

ZooKeeper 有个特点,强一致性。

如果 ZooKeeper 集群的某个节点的数据发生变更,则会通知其它 ZooKeeper 节点同时执行更新,就得等着大家(超过半数)都写完了才行,这写入的性能就比较差了。

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?

然后看到上面我说的小量存储系统了吧,一般而言,ZooKeeper 只适用于存储一些简单的配置或者是集群的元数据,不是真正意义上的存储系统。

如果写入的数据量过大,ZooKeeper 的性能和稳定性就会下降,可能导致 Watch 的延时或丢失。

所以在 Kafka 集群比较大,分区数很多的时候,ZooKeeper 存储的元数据就会很多,性能就差了。

还有,ZooKeeper 也是分布式的,也需要选举,它的选举也不快,而且发生选举的那段时候是不提供服务的!

基于 ZooKeeper 的性能问题 Kafka 之前就做了一些升级。

例如以前 Consumer 的位移数据是保存在 ZooKeeper 上的,所以当提交位移或者获取位移的时候都需要访问 ZooKeeper ,这量一大 ZooKeeper 就顶不住。

所以后面引入了位移主题(Topic是__consumer_offsets),将位移的提交和获取当做消息一样来处理,存储在日志中,避免了频繁访问 ZooKeeper 性能差的问题。

还有像一些大公司,可能要支持百万分区级别,这目前的 Kafka 单集群架构下是无法支持稳定运行的,也就是目前单集群可以承载的分区数有限。

所以 Kafka 需要去 ZooKeeper 。

所以没了 Zookeeper 之后的Kafka 的怎样的?

没了 Zookeeper 的 Kafka 就把元数据存储到自己内部了,利用之前的 Log 存储机制来保存元数据。

就和上面说到的位移主题一样,会有一个元数据主题,元数据会像普通消息一样保存在 Log 中。

所以元数据和之前的位移一样,利用现有的消息存储机制稍加改造来实现了功能,完美!

然后还搞了个 KRaft 来实现 Controller Quorum。

ZooKeeper 用的好好地,Kafka 为什么要抛弃 ZooKeeper?图来自 confluent

这个协议是基于 Raft 的,协议具体就不展开了,就理解为它能解决 Controller Leader 的选举,并且让所有节点达成共识。

在之前基于 Zookeeper 实现的单个 Controller 在分区数太大的时候还有个问题,故障转移太慢了。

当 Controller 变更的时候,需要重新加载所有的元数据到新的 Controller 身上,并且需要把这些元数据同步给集群内的所有 Broker。

而 Controller Quorum 中的 Leader 选举切换则很快,因为元数据都已经在 quorum 中同步了,也就是 quorum 的 Broker 都已经有全部了元数据,所以不需要重新加载元数据!

并且其它 Broker 已经基于 Log 存储了一些元数据,所以只需要增量更新即可,不需要全量了。

这波改造下来就解决了之前元数据过多的问题,可以支持更多的分区!

最后

可能看到这里有人会说,那为何一开始不这么实现?

因为 ZooKeeper 是一个功能强大且经过验证的工具,在早期利用它来实现一些功能,多简单哟,都不需要自己实现。

要不是 ZooKeeper 的机制导致了这个瓶颈,也不可能会有这个改造的。

软件就是这样,没必要重复造轮子,合适就好。

参考资料:文章来源地址https://www.toymoban.com/news/detail-460915.html

  • https://www.confluent.io/blog/kafka-without-zookeeper-a-sneakpeek/
  • https://time.geekbang.org/column/article/253202
  • https://www.infoq.cn/article/PHF3gFjUTDhWmctg6kXe

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

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

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

相关文章

  • kafka为什么快

    消息发送 1、批量发送: Kafka 通过将多个消息打包成一个批次,减少了网络传输和磁盘写入的次数,从而提高了消息的吞吐量和传输效率。 2、异步发送: 生产者可以异步发送消息,不必等待每个消息的确认,这大大提高了消息发送的效2.率 3、消息压缩: 支持对消息进行压缩,

    2024年02月02日
    浏览(39)
  • Kafka 为什么那么快?

    有人说:他曾在一台配置较好的机子上对 Kafka 进行性能压测,压测结果是 Kafka 单个节点的极限处理能力接近每秒 2000万 条消息,吞吐量达到每秒 600MB。 那 Kafka 为什么这么快?如何做到这个高的性能? 本篇文章主要从这 3 个角度来分析: 生产端 服务端  Broker 消费端

    2024年02月12日
    浏览(46)
  • Kafka为什么这么快?

    Kafka 是一个基于发布-订阅模式的消息系统,它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率,即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢?本文将从七个方面来分析 Kafka 的速度优势。 零拷贝技术 仅可追加

    2024年02月11日
    浏览(49)
  • kafka为什么如此之快?

    天下武功,唯快不破。同样的,kafka在消息队列领域,也是非常快的,这里的块指的是kafka在单位时间搬运的数据量大小,也就是吞吐量,下图是搬运网上的一个性能测试结果,在同步发送场景下,单机Kafka的吞吐量高达17.3w/s, 不愧是高吞吐量消息中间件的行业老大。 那究竟

    2024年02月06日
    浏览(45)
  • 面试题:Kafka 为什么那么快?

    有人说:他曾在一台配置较好的机子上对 Kafka 进行性能压测,压测结果是 Kafka 单个节点的极限处理能力接近每秒 2000万 条消息,吞吐量达到每秒 600MB。 那 Kafka 为什么这么快?如何做到这个高的性能? 本篇文章主要从这 3 个角度来分析: 生产端 服务端 Broker 消费端 先来看下

    2024年01月22日
    浏览(54)
  • kafka为什么尽量使用手动提交

    在 Kafka 中,消费者可以使用手动提交和自动提交两种方式来管理消费偏移量(offset)。它们之间的区别如下: 1. 手动提交 offset:    - 消费者通过调用 `commitSync()` 或 `commitAsync()` 方法手动提交消费偏移量。    - 手动提交 offset 需要显式地指定要提交的分区和偏移量。    

    2024年02月15日
    浏览(33)
  • 48 | DMA:为什么Kafka这么快?

    过去几年里,整个计算机产业界,都在尝试不停地提升 I/O 设备的速度。把 HDD 硬盘换成 SSD 硬盘,我们仍然觉得不够快;用 PCI Express 接口的 SSD 硬盘替代 SATA 接口的 SSD 硬盘,我们还是觉得不够快,所以,现在就有了傲腾(Optane)这样的技术。 但是,无论 I/O 速度如何提升,

    2024年02月21日
    浏览(49)
  • 面试官问:kafka为什么如此之快?

    天下武功,唯快不破。同样的,kafka在消息队列领域,也是非常快的,这里的块指的是kafka在单位时间搬运的数据量大小,也就是吞吐量,下图是搬运网上的一个性能测试结果,在同步发送场景下,单机Kafka的吞吐量高达17.3w/s,不愧是高吞吐量消息中间件的行业老大。 那究竟

    2024年02月07日
    浏览(44)
  • Kafka 的未来:为何我们要抛弃 ZooKeeper?

    一、ZooKeeper 的核心功能 ZooKeeper 是一个广泛使用的开源分布式协调服务框架,它在确保数据一致性方面表现出色,同时也可以作为一个轻量级的分布式存储系统。它特别适合用来存储那些需要多个系统共享的配置信息、集群的元数据等。ZooKeeper 提供了持久节点和临时节点两种

    2024年02月02日
    浏览(52)
  • 离线数仓中,为什么用两个flume,一个kafka

    实时数仓中,为什么没有零点漂移问题? 因为flink直接取的事件时间 用kafka是为了速度快,并且数据不丢,那为什么既用了kafkachannel,也用了kafka,而不只用kafkachannel呢? 因为需要削峰填谷 离线数仓中,为什么用两个flume,一个kafka,直接用taildirsource,kafkachannel,hdfssink不行吗?

    2024年02月14日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包