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

2022-11-30 15:27:38 浏览数 (1)

文章目录
  • 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 版本信息不对
  • 9. Listeners 配置不一致

日常运维 问题排查 怎么能够少了滴滴开源的 滴滴开源LogiKM一站式Kafka监控与管控平台

1. Leader的epoch过时

代码语言:javascript复制
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出现异常

代码语言:javascript复制
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

代码语言:javascript复制
#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.propertiesserver.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

代码语言:javascript复制
 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

代码语言:javascript复制
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

代码语言:javascript复制
 Error while reading checkpoint file /Users/shirenchuang/work/IdeaPj/didi_source/kafka/kafka-logs-2/cleaner-offset-checkpoint

6. InconsistentBrokerMetadataException

代码语言:javascript复制
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

代码语言:javascript复制
Failed to load ${dir.getAbsolutePath} during broker startup

异常原因:

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

解决方法

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

代码语言:javascript复制
Duplicate log directory found: xxxx

异常原因:

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

解决方法

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

代码语言:javascript复制
 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-分区号-futuretopic-分区号-delete

解决方法

自检一下不合格的文件夹


8. meta.properties 版本信息不对

代码语言:javascript复制
[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;

解决方法

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

9. Listeners 配置不一致

代码语言:javascript复制
 Listeners are not identical across brokers: 

异常代码位置

MetadataCache#updateMetadata

原因:

集群中的Broker配置的 listeners的配置中的监听器名不一致。

解决方案:

listeners配置检查一下是不是有的broker配置了多了监听器

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


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

滴滴开源Logi-KafkaManager 一站式Kafka监控与管控平台

0 人点赞