0
点赞
收藏
分享

微信扫一扫

【kafka异常】kafka 常见异常处理方案(持续更新! 建议收藏)



文章目录

  • ​​1. Leader的epoch过时​​
  • ​​2. 修改Broker.id出现异常​​
  • ​​3. 文件加锁失败 Failed to acquire lock on file .lock in​​
  • ​​4. 发送消息报错 UNKNOWN_TOPIC_OR_PARTITION​​
  • ​​5. Error while reading checkpoint file xxxx/cleaner-offset-checkpoint​​
  • ​​6. InconsistentBrokerMetadataException​​
  • ​​7. log.dir相关异常 Failed to load xxx during broker startup​​
  • ​​8. meta.properties 版本信息不对​​


日常运维
问题排查
怎么能够少了滴滴开源的
​​​​​


1. Leader的epoch过时

The leader epoch in the request is older than the epoch on the broker

--

Partition $topicPartition marked as failed

解决方法


说明 当前分区的Leader的epoch比Broker的epoch老
所以导致follow去fetchleader的时候报错;
只要重新发生一下Leader选举就行了;


2. 修改Broker.id出现异常

Configured broker.id 0 doesn't match stored broker.id 1 in meta.properties.
If you moved your data, make sure your configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).


出现这种情况一般是 你可能中途修改了Broker的配置​​broker.id​​; 又或者修改了​​log.dir​​路径,然后这个路径之前存在;
你可以看看​​log.dir​​文件夹下面的​​meta.properties​

#Wed Jun 23 17:59:02 CST 2021
broker.id=0
version=0
cluster.id=0

这里面的内容是之前的配置,你修改了​​broker.id​​之后跟这里不一致就抛出异常了;


解决方法


如果这个​​log.dir​​是属于这个Broker的,那么将​​server.properties​​ 的broker.id修改成更​​meta.properties​​一致就行
如果你就是想修改一下BrokerId; 那么你需要把​​meta.properties​​中的broker.id该了;
反正最终是要让​​meta.properties​​和​​server.properties​​ 中的broker.id保持一致;



如果这个​​log.dir​​​是是以前的废旧数据的话,那你还是换一个路径好了;​​server.properties​​​中的​​log.dir​​换个路径


修改Broker.id可能出现的异常


其实不是很建议修改BrokerId;
修改BrokerId可能会存在一些问题,比如

  1. 当前正在进行数据迁移; zk上的保存的还是原来的 ​​broker.Id​​; 那就会导致这台Broker迁移失败
  2. 当你修改的 ​​broker.Id​​; 那么如果配置了动态配置的话, 就不会生效了;所以你要记得把原来的动态配置添加回来; zk节点是:​​/config/brokers/{brokerID}​
  3. other


meta.properties作用

其实通过这里你应该也可以理解为什么会存在​​meta.properties​​​ 这个文件; 他就是用来保持这个log.dir之前的Broker.id和cluster.id=0还有version的;因为你​​server.properties​​​里这个个配置可以随便更改,难免会有出错; kafka会将你的配置跟这个​​meta.properties​​信息作对比,提醒你的配置不正确;

3. 文件加锁失败 Failed to acquire lock on file .lock in

Failed to acquire lock on file .lock in /Users/xxxx/work/IdeaPj/xxx/kafka/kafka-logs-0. A Kafka instance in another process or thread is using this directory.

异常原因:


Broker在启动的时候,会把​​log.dirs​​加上一个文件锁,以防其他程序对它进行篡改;
出现这种异常表示已经有一个程序对文件夹加上了锁了; 所以获取失败;


解决方法


这个时候你要检查一下,这个Broker是否已经启动过了,或者两个Broke中​​log.dirs​​配置了相同的文件夹;
如果上面你确定没有问题,那你还可以把相应的文件夹的​​.lock​​文件删掉; 强制去掉锁文件; (不建议这样操作)


4. 发送消息报错 UNKNOWN_TOPIC_OR_PARTITION

WARN [Producer clientId=console-producer]  Error while fetching metadata with correlation id :  {test80=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)

异常原因:


发送的TopicPartition不存在; 要么是Topic不存在 要么是发送过去的Partition不存在


解决方法


  1. 检查一下是不是Topic不存在
  2. 检查一下发送的Partition所在的Broker宕机了,导致发送失败(特别是发送消息的时候指定了分区号比较容易出现这个问题)
  3. 检查是不是Topic所在的Broker全部宕机了;


5. Error while reading checkpoint file xxxx/cleaner-offset-checkpoint

Error while reading checkpoint file /Users/shirenchuang/work/IdeaPj/didi_source/kafka/kafka-logs-2/cleaner-offset-checkpoint

6. InconsistentBrokerMetadataException

kafka.common.InconsistentBrokerMetadataException: BrokerMetadata is not consistent across log.dirs. This could happen if multiple brokers shared a log directory (log.dirs) or partial data was manually copied from another broker. Found:
- kafka-logs-0 -> BrokerMetadata(brokerId=0, clusterId=0)
- kafka-logs-1 -> BrokerMetadata(brokerId=1, clusterId=0)

异常原因:


在同一个Broker中,配置了多个​​log.dirs​​ 日志文件夹,但是却发现这两个文件夹归属于不同的Broker, 那么就会抛出异常;
假设配置文件 ​​log.dirs=kafka-logs-1,kafka-logs-0​​ 配置了两个文件夹. 那么启动的时候会去加载这两个文件夹的 ​​meta.properties​​文件 读取里面的​​broker.id,cluster.id​​组成一个​​brokerMetadataMap​​对象; 正常情况下, 他们的值肯定是一样的,但是假如一台机器上部署了多个Broker,还想公用同一个dir,那么肯定是不行的;


解决方法


如果想要配置多个dir,那么找到对应哪个dir是已经被其他Broker使用了, 不用这个dir就行了;


7. log.dir相关异常 Failed to load xxx during broker startup

Failed to load ${dir.getAbsolutePath} during broker startup

异常原因:


启动的时候读取文件夹​​log.dirs​​​文件里面的​​meta.properties​​的时候抛IOException,读取失败


解决方法


查询一下是不是对应的dir中的文件​​meta.properties​​有什么异常(是否有权限读取等等)


Duplicate log directory found: xxxx

异常原因:


​log.dirs​​​ 设置的文件夹重复了;比如: ​​log.dirs=kafka-logs-0,kafka-logs-0​


解决方法


检查一下是不是设置重复了


Found directory /xxxx/kafka/kafka-logs-0/test, 'test' is not in the form of topic-partition or topic-partition.uniqueId-delete (if marked for deletion).
Kafka's log directories (and children) should only contain Kafka topic data.

异常原因:


​log.dirs​​​文件夹中存在不符合条件的文件夹,一般里面的文件夹的格式都是 ​​topic-分区号​​​ ,​​topic-分区号-future​​​ ,​​topic-分区号-delete​


解决方法


自检一下不合格的文件夹


8. meta.properties 版本信息不对

[2021-07-21 13:38:19,246][ERROR][main]: Failed to create or validate data directory /Users/xxx/kafka/kafka-logs-0
java.io.IOException: Failed to load /Users/xxxx/kafka/kafka-logs-0 during broker startup

异常原因:


meta.properties 中的version的信息是不是异常了,正常情况下是0;
【kafka异常】kafka 常见异常处理方案(持续更新! 建议收藏)_kafka


解决方法


尝试将 ​​meta.properties​​ 直接删除,启动的时候会重新生成



关于作者:石臻臻的杂货铺, 专注于 Java领域、大数据领域 等知识分享, 内容多为 原理 、源码、实战 等等, 坚持输出干货,所写内容必定经过验证,并深入源码分析,保证内容准确性, 长期在CSDN、和公众号【石臻臻的杂货铺】发布原创文章,欢迎关注! 如果有相关技术领域问题,欢迎进群交流,各个领域都有专人解答,你所问的,都会得到回应!


欢迎

Star和 共建由 滴滴开源的kafka的管理平台 满足所有开发运维日常需求



​​​​



举报

相关推荐

0 条评论