记录一次搭建kafka集群的过程

记录一次搭建kafka集群的过程

DaiLu

我之前从未接触过kafka,最近因部门的业务需要搭建kafka集群。基本的需求是这样的:建立kafka集群,该集群包含两台服务器,每个服务器中各一个broker。同时话题包含两个分区,分别位于不同的broker中,当某一个broker挂掉后,保证kafka的历史数据不会丢失,同时客户端的生产和消费过程正常进行。
根据之前对kafka的了解,知道好像是需要搭建kafka集群,然后设置副本因子,使用主从模式,这样当某一个broker挂掉后就其他的broker可以继续服务。基于上述的认识然后就开始搭建kafka集群,搭建的过程相对比较简单,当时参考网站的kafka集群搭建教程,分别在不同的机器上解压zookeeper和kafka安装包,并修改对应的配置文件,kafka集群正常启动,具体的过程可以参考下面的链接:基于Zookeeper搭建Kafka高可用集群。kafka集群搭建完成后,采用下面的命令创建了话题和分区:

1
bin/kafka-topics.sh --create --topic kafka_test --partitions 2 --replication-factor 2 --bootstrap-server 127.0.0.1:9092

搭建完成并创建话题,当时想着应该没啥问题了,副本因子已经设置为了2,生产和消费过程确实没啥问题,并且一个broker挂掉之后消费者还是能正常消费,同时数据也没有丢失。但是,哈哈,出现了以下问题:

首先,某个broker挂掉后,使用kafka-consumer-groups.sh查看该话题的消费组的情况发现有些组ID消失了;然后,正在消费的消费者,当broker挂掉后能正常消费,但是当挂掉的broker重启后,从挂掉到启动之间消费到的kafka消息会重复消费一遍,后来查看日志才知道消费者始终无法提交offset,所以才会这样;最后,某个broker挂掉后,启动消费者从未消费的组ID,并且设置了从开始处消费,会发生有些组ID能消费,有些组ID消费不了的问题。

针对上面的问题,当时就开始google查询,可能是自己设置的关键词不对还是这个问题太基础了,查了挺久感觉好像都没查到我想要的,当时好像聚焦于“当broker挂掉后,为什么组ID无法消费”类似关键词,但是没有找到对应的结果,后面还看了Apache kafka的官方文档,当时看到英文文档后,只是大致翻阅,也没有找到自己想要的,最后好像是隔了一天,本来想加班的,哈哈,重新换了一种问法,问google,“为什么消费者无法工作,当broker挂掉的时候”,当时正好在stackoverflow中看到了类似的问题,问题答案的链接:Consumers not working when shutting down a broker in Kafka。主要就是说kafka中年有一个专门的话题用于存放消费组中的分区偏移信息,然后这个分区也有一个副本因子,这个副本因子默认是1,也就是偏移信息不进行备份,所以当某个broker挂掉后,某些消费者的偏移量信息正好保存在该broker上,就会导致无法消费者无法偏移量、无法消费的问题。

在此基础上,查看配置文件知道该话题为consumer_offsets,然后重新查看Apache kafka官方文档了解到:每个消费组都会指定一个broker用于接收消费者偏移提交请求,成为组协调器(group coordinator),当作为组协调器的broker挂掉后,话题consumer_offsets的从broker将会接替成为新的组协调器,设置话题__consumer_offsets的副本因子的配置项为offsets.topic.replication.factor,一般将该值设置为3,避免offset信息因组协调器down掉而丢失。此外,当新的消费者加入组中,组协调器还负责向消费者提供偏移量,组协调器会将最后的偏移量加载至内存中,便于为消费者快速提供偏移量。具体细节参考:Consumer Offset Tracking

  • Title: 记录一次搭建kafka集群的过程
  • Author: DaiLu
  • Created at : 2025-01-30 18:41:02
  • Updated at : 2025-01-31 12:20:58
  • Link: https://dailu-blogspot.com/2025/01/30/记录一次搭建kafka集群的过程/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
记录一次搭建kafka集群的过程