记录一次搭建kafka集群的过程
最近部门因业务需要搭建kafka集群,基本的需求如下:
1 | 建立kafka集群,该集群包含两台服务器,每个服务器中各一个broker。话题包含两个分区,分别位于不同的broker中,当某一个broker挂掉后,保证kafka的历史数据不会丢失,客户端的生产和消费过程正常进行。 |
此前对kafka知之甚少,查阅资料后明白搭建满足上述需求的kafka集群需要设置副本因子并使用主从模式,此时当某一个broker挂掉后其他的broker可以继续服务。在此基础上,开始参考kafka搭建教程搭建kafaka集群。搭建过程相对简单,分别在不同的机器上解压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。基本思想如下:
1 | kafka存在一个特殊(内置)的话题consumer_offsets,该话题用于存放消费组中的分区偏移信息,该话题也具有也具有副本因子,默认是1,即偏移信息不进行备份。因此,当某个broker挂掉后,由于某些消费者的偏移量信息正好保存在该broker上,就会导致该部分消费者产生无法提交偏移量,无法消费和消费异常的问题。 |
- 进一步研究:
进一步重新查阅Apache kafka官方文档了解到:
- 每个消费组都会指定一个broker用于接收消费者偏移提交请求,称为
组协调器(group coordinator) - 当
组协调器挂掉后,话题consumer_offsets的其他broker将会接替顶上,成为新的组协调器 - 设置话题
__consumer_offsets的副本因子的配置项为offsets.topic.replication.factor,一般设置为3,避免offset信息因组协调器挂掉而丢失。 - 当新的消费者加入消费组时,组协调器负责向消费者提供偏移量,组协调器会将最后的偏移量加载至内存中,便于为消费者快速提供偏移量。具体细节参考:Consumer Offset Tracking。
- Title: 记录一次搭建kafka集群的过程
- Author: DaiLu
- Created at : 2025-01-30 18:41:02
- Updated at : 2026-02-15 21:27:12
- Link: https://dailu-blogspot.com/2025/01/30/记录一次搭建kafka集群的过程/
- License: This work is licensed under CC BY-NC-SA 4.0.