You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

测试集群特定节点Kafka宕机时消费者无法消费问题求助

问题根源分析

你的问题核心出在消费者偏移量主题(__consumer_offsets)的副本配置上,这也是为什么blade1挂掉后消费直接崩溃的原因:

  1. 默认情况下,Kafka自动创建的__consumer_offsets主题(用来存储消费者的偏移量和消费组元数据)的offsets.topic.replication.factor是1。如果你的Kafka集群是先在blade1节点启动并初始化的,这个主题的副本只会存在于blade1上。
  2. 当你关闭blade1时,__consumer_offsets主题的唯一副本下线,消费者无法找到消费组的协调器(Coordinator),进而无法完成偏移量提交、消费组重平衡等核心操作,就会出现你看到的大量连接警告、Offset提交失败,甚至无法消费的情况。
  3. 你后来修改了offsets.topic.replication.factor配置,但这个配置只对新创建的__consumer_offsets主题生效,已存在的旧主题不会自动更新副本数,所以修改后没有解决问题。

另外,你提到关闭blade3或blade2时消费正常,是因为当时__consumer_offsets的Leader还在可用节点上,消费者能正常访问协调器;而当blade1挂掉,协调器所在的节点直接下线,整个消费组的元数据管理彻底失效。


解决方案:实现任意两台服务器下线仍能正常消费

要达到关闭任意两台服务器(含blade1)时消费者无延迟消费的目标,你需要完成以下几个关键配置调整:

1. 修复__consumer_offsets主题的副本配置

步骤1:查看当前__consumer_offsets主题的状态

先执行命令确认该主题的副本分布:

bin/kafka-topics.sh --zookeeper 192.168.112.33:2181 --describe --topic __consumer_offsets

你大概率会看到该主题的副本只分布在blade1上。

步骤2:修改__consumer_offsets的副本数

因为直接修改配置无法更新已存在的主题,你需要手动调整副本数:

  • 首先创建一个副本分配文件(比如offsets-replica.json),内容如下(指定3个broker作为副本,均匀分布):
{"version":1,"partitions":[{"topic":"__consumer_offsets","partition":0,"replicas":[1,2,3]},{"topic":"__consumer_offsets","partition":1,"replicas":[2,3,1]},{"topic":"__consumer_offsets","partition":2,"replicas":[3,1,2]},{"topic":"__consumer_offsets","partition":3,"replicas":[1,3,2]},{"topic":"__consumer_offsets","partition":4,"replicas":[2,1,3]},{"topic":"__consumer_offsets","partition":5,"replicas":[3,2,1]},{"topic":"__consumer_offsets","partition":6,"replicas":[1,2,3]},{"topic":"__consumer_offsets","partition":7,"replicas":[2,3,1]},{"topic":"__consumer_offsets","partition":8,"replicas":[3,1,2]},{"topic":"__consumer_offsets","partition":9,"replicas":[1,3,2]},{"topic":"__consumer_offsets","partition":10,"replicas":[2,1,3]},{"topic":"__consumer_offsets","partition":11,"replicas":[3,2,1]}]}

(注:__consumer_offsets默认有12个分区,这里给每个分区分配3个副本,均匀分布在3台broker上)

  • 然后执行命令修改副本分配:
bin/kafka-reassign-partitions.sh --zookeeper 192.168.112.33:2181 --reassignment-json-file offsets-replica.json --execute
  • 最后验证修改结果:
bin/kafka-reassign-partitions.sh --zookeeper 192.168.112.33:2181 --reassignment-json-file offsets-replica.json --verify

2. 统一修改所有broker的核心配置

在三台服务器的server.properties中确保以下配置都设置为3(适配你的3台broker集群):

# 消费者偏移量主题副本数
offsets.topic.replication.factor=3
# 事务状态日志副本数
transaction.state.log.replication.factor=3
# 事务状态日志最小ISR数(至少为副本数的一半+1,这里设为2)
transaction.state.log.min.isr=2
# 后续新建主题的默认副本数
default.replication.factor=3
# 主题最小ISR数(保证消息可靠性)
min.insync.replicas=2

修改后重启所有Kafka broker。

3. 优化ZooKeeper的高可用(可选但推荐)

你当前的ZooKeeper是单节点部署在blade3上,如果blade3下线,整个Kafka集群会失去协调中心,无法进行分区Leader选举等操作。建议把ZooKeeper扩展为3节点集群(部署在三台服务器上),这样即使一台ZooKeeper节点下线,集群仍能正常工作。


验证故障转移

完成上述配置后,你可以再次测试关闭任意两台服务器:

  • 关闭blade1和blade2:剩余的blade3会成为所有分区的Leader,且__consumer_offsets的副本存在于blade3,消费者能找到协调器,正常消费;
  • 关闭blade1和blade3:剩余的blade2会接管所有分区,消费仍能正常进行。

内容的提问来源于stack exchange,提问作者user3225309

火山引擎 最新活动