kafka节点非正常退出后重启失败

张乘辉 发表于: 2020-03-11   最后更新时间: 2021-09-08 09:31:17   4,994 游览

kafka版本号:0.11.0.2
在 kafka-manager 查不到节点了,但是进程依然还在,然后通过 kill 命令杀死节点进程后,重启失败了。

重启后报如下错误:

一开始以为是index文件发生损坏损坏的原因,但是看了源码之后发现 0.11版本已经修复该问题了,所以在这里问下各位大佬,是什么原因导致该问题产生的?怎么解决?

该问题出现在 kafka broker 被强制干掉的情况,如果 kill -9 或者所在机器直接异常。

发表于 2020-03-11
¥6.0

你是强制kill了这个kafka节点,但这个节点有些topic分区是master,还有消息领先follower。follower成为master,丢失掉了这些信息,你在启动这台被kill的机器时,信息和之前的follower不对应,kafka的默认保护这些漏掉的消息,导致check时不正确,需要人工介入处理这些遗漏的消息,保障消息不会丢失。

可以通过配置unclean.leader.election.enable 其描述:是否启用不在ISR中的副本参与选举leader的最后的手段。这样做有可能丢失数据。

按照你下面的方式是ok的,也没问题的。

张乘辉 -> 半兽人 4年前

0.11.0版本已经将unclean.leader.election.enable默认为false了,而且我看了配置,也是false,意味着可以允许丢掉这部分消息

张乘辉 -> 半兽人 4年前

我下面说的那个删除index文件,其实在0.11已经修复了的,我试过了,在启动过程中,Kafka会自动将损坏的index文件删除并重建,因此启动不成功,不管index损坏的事。而且即使我手动删index文件,也一样启动不成功

张乘辉 -> 张乘辉 4年前

这里我说错了,false是消息不允许丢失,刚刚我试了手动设置为true,还是一样会报:

Attempt to append an offset (110756715) to position 40111 no larger than the last offset appended (110756715) to /dfs5/kafka/data/secLogBillTrackInfoQueryCNPUSH-2/00000000000110325000.index.

半兽人 -> 张乘辉 4年前

额,unclean.leader.election.enable=true才会,但是,你这个不属于这个范畴了,这个只会影响follwer是否允许成为leader。

张乘辉 -> 半兽人 4年前

这个问题应该是0.11版本中的bug,我贴两个issue出来,一起参阅一下:
https://issues.apache.org/jira/browse/KAFKA-3955
https://issues.apache.org/jira/browse/KAFKA-4972
后面我总结出应对方案后也发出来给大家

从源码和日志文件结构中分析 Kafka 重启失败事件:

https://mp.weixin.qq.com/s/zbwGLygjvO_ncgp7FH9QMA


呕心沥血的一次分析,在过程中涉及了Kafka 构建索引文件的细节以及日志文件结构的分析。
遗憾的是找到这个应该说是Kafka的bug之后,发现官方并没有解决方案,只能删除错误日志文件,这太暴力了[流泪],还是赶紧升级Kafka版本吧!

1、记一次 Kafka 重启失败问题排查
https://mp.weixin.qq.com/s/ee7_mhxnj05DxK3EJihyfQ
2、从源码和日志文件结构中分析 Kafka 重启失败事件
https://mp.weixin.qq.com/s/zbwGLygjvO_ncgp7FH9QMA
3、当 Kafka 分区不可用且 leader 副本被损坏时,如何尽量减少数据的丢失?
https://mp.weixin.qq.com/s/b1etPGC97xNjmgdQbycnSg

针对本次事件,我用 3 篇博客详细描述了前因后果,并给出了最后的终极解决方案。

启动日志发生大量以下日志:

WARN Found a corrupted index file due to requirement failed: Corrupt index found, index file (/dfs5/kafka/data/secLogBillTrackInfoQueryCNPUSH-2/00000000000110325000.
index) has non-zero size but the last offset is 110325000 which is no larger than the base offset 110325000.}. deleting /dfs5/kafka/data/secLogBillTrackInfoQueryCNPUSH-2/00000000000110325000.
timeindex, /dfs5/kafka/data/secLogBillTrackInfoQueryCNPUSH-2/00000000000110325000.index, and /dfs5/kafka/data/secLogBillTrackInfoQueryCNPUSH-2/00000000000110325000.txnindex and rebuilding ind
ex... (kafka.log.Log)

这是由于非正常退出,index文件损坏的原因,然后kafka在启动过程中将这些index文件删除重建,具体已在文章:

http://bigdatadecode.club/kafka-corrupt%20index%20found.html

中说明了,也就是说这个日志是正常的现象。

你的答案

查看kafka相关的其他问题或提一个您自己的问题