关于Kafka其中一个Broker挂掉后,生产者正常,消费者无法消费的问题

昨晚运维同事报告,生产集群的kafka写数据正常,但是下游消费数据全都出错。

当时核查发现,是因为broker0因为内存溢出(待核查,感觉应该是ulimit的问题)后宕了。其他broker正常,当时很奇怪,所有topic都做了副本,按理应该挂掉一个broker应该能正常消费啊。

由于影响生产,赶紧把broker0重启了。后来发现下游所有消费者都从earliest消费(我们的程序也是设置的earliest,这样即使出问题,也不会丢数据),但是按理这个设置仅当首次消费时生效,后续重启程序,都会继续从断点消费。

今天核查,从网上找到了根本原因,原文链接如下:
kafka高可用失败问题

根本原因是:__consumer_offsets只有1个副本,所有的分区都在broker0上,所以当broker0宕机,消费者异常。
至于__consumer_offsets为什么只有一个副本,应该是搭建kafka时,在配置文件里属性offsets.topic.replication.factor=1。所以__consumer_offsets会被建为1个副本。

但是原文解决方法可能受限于版本问题,需要做删除zookeeper操作。但是我这是生产集群啊,可不能这么干。还好我之前有在线增加topic副本的经验,这里分享一下:

动态修改副本数

  1. 查看当前topic分区及副本情况
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic __consumer_offsets
  1. 编辑json文件(addReplicas.json)
# partition是分区ID,replicas内数组元素即对应3个broker id
{                
    "partitions":[
 {"topic":"__consumer_offsets","partition": 0,"replicas":[0,2,4]}
,{"topic":"__consumer_offsets","partition": 1,"replicas":[0,2,4]}
,{"topic":"__consumer_offsets","partition": 2,"replicas":[0,2,4]}
,{"topic":"__consumer_offsets","partition": 3,"replicas":[0,2,4]}
......50个分区,这里不再赘述
]}
  1. 执行json文件。该指令实际上是异步执行的,提交成功后不代表副本增加完成。
$KAFKA_HOME/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file addReplicas.json --execute
  1. 查看副本增加进展
$KAFKA_HOME/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file addReplicas.json --verify
# 也可以通过第1步的查看topic分区副本情况来看

建议没搞过的小伙伴,可以先在测试环境,或者新建一个topic,测试没问题后,再修改__consumer_offsets的副本

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值