当前位置: 首页 > 科技观察

惊人的!Kafka去掉了Zookeeper!

时间:2023-03-15 20:14:39 科技观察

本文转载自微信公众号“小姐姐的味道”,作者小姐姐养的狗。转载本文请联系味觉小姐公众号。恭喜!最新版本的Kafka2.8.0去掉了对Zookeeper的依赖,通过KRaft管理自己的集群。很好很好,终于有点质变了。当我们听到KRaft时,我们会想到Raft协议。Raft协议是当今最流行的分布式协调算法,Etcd、Consul等系统的基础都来自于它。现在Kafka也有了。由于这个功能太新了,2.8.0版本还是默认使用了ZooKeeper,但不妨碍我们试用一下。另外,大家不要太激动,按照官方的说法,有些功能还不完善,不要在线上使用。1.如何启动KRaft?Kafka使用内置的KRaft而不是ZooKeeper,这是一个很大的改进,因为在像ES这样的分布式系统中,集群元信息的同步是自循环的。但是如何使用KRaft来启动呢?很多同学直接晕了,这方面的资料比较少,但是用起来很简单。我们注意到在config目录下,多了一个名为kraft的目录,里面包含了一组新的配置文件,可以直接放弃对ZK的依赖。通过以下三行命令,可以启动一个自始至终没有ZK参与的单机broker。#./bin/kafka-storage.shrandom-uuid#./bin/kafka-storage.shformat-tTBYU7WMiREexuZqrjKG60g-c./config/kraft/server.properties#./bin/kafka-server-start.sh./config/kraft/server.properties噼里啪啦一阵子后,NoZK的Kafka启动了。就这么简单。2.如何配置?Kafka添加了一个名为@metadata的内部主题来存储这些元数据。接下来我们来看一些关键的配置信息。您可以使用vimdiffconfig/server.propertiesconfig/kraft/server.properties查看主要区别。首先,kraft多了一个配置,叫做process.roles。在我们的配置文件中,它看起来像这样。process.roles=broker,controller其实有3个值。broker:本机只会作为一个brokercontroller:作为Raftquorum的controller之一来启动broker,controller:包括两个熟悉ES的同学的功能可以看出这几个分区就像是master和nodeES,所以分布的概念其实在一定程度上是相通的。接下来是监听地址的变化,因为我们的服务器有两个功能,所以需要开放两个端口。listeners=PLAINTEXT://:9092,CONTROLLER://:9093此外,还有一个叫做node.id的东西。与原来的broker.id不同,这个nodeid是用来投票的。node.id=1因为raft协议的特点,我们的投票配置会使用上面的node.id。写起来很奇怪,不是吗?但它比Zk的好。因此,这些配置可能会在以后的版本中发生变化。controller.quorum.voters=1@localhost:9093这是配置文件的主要区别。让我们来看看它的收藏。process.roles=broker,controllerlisteners=PLAINTEXT://:9092,CONTROLLER://:9093node.id=1controller.quorum.voters=1@localhost:90933。为什么要杀ZK?Kafka作为一个消息队列,要依赖ZooKeeper这种重量级的协调系统,不得不说是一个笑话。同样作为消息队列,RabbitMQ很早就实现了自我管理。Zookeeper非常笨重,需要奇数个节点的集群配置,不方便伸缩。Zk的配置方式也和Kafka完全不同。要调优Kafka,必须考虑另一个系统。这真是一团糟。Kafka要想往轻量级、开箱即用的方向发展,就得干掉Zk。另外,由于Zk和Kafka毕竟不在同一个存储系统中,当topic和partition数量增加时,数据同步的问题就更加明显。Zk可靠,但速度慢。不如放在Kafka的日志存储系统中。对于宣传其速度的Kafka,这是必须绕过的链接。用过kafka-admin的同学应该对监控数据同步慢不陌生。需要先从zk绕过去,得到一些元数据信息,然后从Kafka的JMX接口拉取数据。这么一晃,差点把大团团杀了。4.会发生什么变化?部署更简单。首先,部署变得更容易。对于一些不追求高可用的系统,即使一个进程也能运行可爱的Kafka。我们也不需要申请zookeeper友好的SSD盘,也不需要关注zk的容量是否足够。监控更方便。其次,由于信息的集中,从Kafka获取监控信息变得容易,不需要再在ZK里绕来绕去。与grafana/kibana/promethus等系统的集成指日可待。快点。最重要的当然是速度。Raft比ZK的ZAB协议更容易理解,也更高效。分区的初选将变得更快,控制器的调度速度将更上一层楼。以后就没有这种连接方式了。zookeeper.connect=zookeeper:2181而是只保留bootstrap连接方式。Kafka的节点越来越像对等节点。bootstrap.servers=broker:9092kafka还提供了一个工具叫kafka-metadata-shell.sh,可以看到topic和partition的分布情况。这个信息可以通过zk获取,但是现在可以使用这个命令行来获取。$./bin/kafka-metadata-shell.sh--snapshot/tmp/kraft-combined-logs/\@metadata-0/00000000000000000000.log>>ls/brokerslocalmetadataQuorumtopicIdstopics>>ls/topicsfoo>>cat/topics/foo/0/data{"partitionId":0,"topicId":"5zoAlv-xEh9xRANKXt1Lbg","re??plicas":[1],"isr":[1],"removingReplicas":null,"addingReplicas":null,"leader":1,"leaderEpoch":0,"partitionEpoch":0}>>exit最后还是要提醒大家一下,这个功能目前线上环境最好不要开启,还是老老实实实用为好ZK。功能是原因,因为这些功能的配套设施没有到位,代码也没有达到让人放心的程度。如果您使用它,您很可能会被不完整的工具或棘手的错误弄得不知所措。然而,这勇敢的第一步已经售出,方向已经指明,剩下的就是等待。不管怎么说,杀了Zk都是一件了不起的事情。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。