kafka故障-partition offline

现象

producer发送消息超时

1
2
3
4
5
6
7
8
9
10
11
2021-03-05 10:06:47.083 [pool-5-thread-3] ERROR com.alibaba.otter.canal.kafka.CanalKafkaProducer - java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for boss-clearing.clear_task_execute_record-0: 30094 ms has passed since batch creation plus linger time
java.lang.RuntimeException: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for boss-clearing.clear_task_execute_record-0: 30094 ms has passed since batch creation plus linger time
at com.alibaba.otter.canal.kafka.CanalKafkaProducer.produce(CanalKafkaProducer.java:215) ~[canal.server-1.1.4.jar:na]
at com.alibaba.otter.canal.kafka.CanalKafkaProducer.send(CanalKafkaProducer.java:179) ~[canal.server-1.1.4.jar:na]
at com.alibaba.otter.canal.kafka.CanalKafkaProducer.send(CanalKafkaProducer.java:117) ~[canal.server-1.1.4.jar:na]
at com.alibaba.otter.canal.server.CanalMQStarter.worker(CanalMQStarter.java:183) [canal.server-1.1.4.jar:na]
at com.alibaba.otter.canal.server.CanalMQStarter.access$500(CanalMQStarter.java:23) [canal.server-1.1.4.jar:na]
at com.alibaba.otter.canal.server.CanalMQStarter$CanalMQRunnable.run(CanalMQStarter.java:225) [canal.server-1.1.4.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]

问题分析

  1. 网络连接问题,导致超时
  2. kafka故障

通过查看kafka服务状态,确认是kafka问题
同时,服务状态显示,400+ partition offline

到这里,可以肯定kafka集群出了故障。
但是,按理说,kafka是分布式服务。topic分partition,partition又有replica。单个broker故障,数据完整性不会受影响。replica的数据完全能顶上。


服务状态查看

从网页看,发现under replicated partition,即分区在复制中。

下面,我们具体看看topic分区情况
./kafka-topics.sh --describe --zookeeper xx-xx-01:2181 --under-replicated-partitions

示意:ISR即 in-sync replica
假设,有数据Topic: __consumer_offsets Partition: 6 Leader: 146 Replicas: 222,146,225 Isr: 146,222
数据一共3份,但是同步中的只有2份。可知broker 225故障。

此处,我通过重启225的kafka服务恢复。

为什么一个备份故障,服务就不可用

kafka topic有参数acks,可选值0,1,2….all
意思是,几个副本保存成功,认为ack成功

当broker故障,topic isr数量变少。可能存在一种情况: 同步中的副本数 < 提交成功需要的副本数

GG


参考资料:
Apche Kafka 的生与死 – failover 机制详解