关于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
    评论
使用Spring Boot和Kafka实现同一个程序作为生产者消费者是可能的。 在Spring Boot中,我们可以使用`@EnableKafka`注解启用Kafka支持,并配置Kafka的相关属性。 首先,我们需要定义一个生产者配置的Bean,配置Kafka生产者属性,例如bootstrap.servers、key.serializer等。然后,我们可以使用`KafkaTemplate`来发送消息到Kafka中。 接下来,我们需要定义一个消费者配置的Bean,配置Kafka消费者属性,例如bootstrap.servers、group.id等。然后,我们可以使用`@KafkaListener`注解来指定消费者监听的主题,并定义消息处理方法。 在同一个程序中,我们可以创建一个或多个Kafka生产者,使用`KafkaTemplate`发送消息到Kafka中。同时,我们也可以创建一个或多个Kafka消费者,使用`@KafkaListener`注解监听对应的主题,处理接收到的消息。 可以使用以下代码示例作为参考: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.core.KafkaTemplate; @SpringBootApplication @EnableKafka public class KafkaApplication { @Autowired private KafkaTemplate<String, String> kafkaTemplate; public static void main(String[] args) { SpringApplication.run(KafkaApplication.class, args); } // 生产者 public void sendMessage(String message) { kafkaTemplate.send("topic", message); } // 消费者 @KafkaListener(topics = "topic") public void receiveMessage(String message) { System.out.println("Received message: " + message); } } ``` 可以在`main`方法中调用`sendMessage`方法发送消息,同时`@KafkaListener`注解的方法会监听对应的主题,并处理接收到的消息。 需要注意的是,同一个程序作为生产者消费者时,需要正确配置Kafka的属性,确保生产者消费者连接到正确的Kafka集群。此外,同步或异步处理接收到的消息也需要根据实际需求进行适当的处理。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值