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

张乘辉 发表于: 2020-03-11   最后更新时间: 2020-03-11  

背景:

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

重启后报如下错误:

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

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



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: Kafka消费不均匀
下一条: flink消费不到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 篇博客详细描述了前因后果,并给出了最后的终极解决方案。

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

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


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

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

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

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

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

        • 这里我说错了,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.

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

            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

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