日志记录

FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)
java.lang.IllegalArgumentException: requirement failed: Corrupt index found, index file (/home/kafka/kafka_2.9.2-0.8.1/logs/sampleTopic-1/00000000000006911940.index) has non-zero size but the last offset is 6911940 and the base offset is 6911940

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

Kafka启动时加载log的步骤:
  以一个partition log目录为例::

<1> 首先删除所有后缀名为.cleaned和.delete的文件:
<2> 对于.swp结尾的文件,如果是log文件则直接恢复(去掉.swp, 变为.log);
                        如果是index文件直接删掉(然后rebuild index文件);
<3> 对于.index文件,如果没有对应的.log文件(同一个logSement其index和log的主文件名相同), 则删除该index文件;
<4> 对于.log文件,加载如内存;如果其没有对应的.index文件(可能在第<2>步中被删除), 重新恢复其index文件;
<5> 假设到这一步为止Kafka还没有加载到logSements, 说明该partition log目录下为空,一个新的log sement对象会被创建在内存;
    反之则转向第<6>步;
<6> 如果Kafka已经加载到log, 最会开始recover log segments。

至于为什么要recover log segments, 是因为大多数情况下,recover的目的就是检查Kafka上次关闭时是不是cleanShutDown (可通过检查partition log目录下是不是有后缀名为.kafka_cleanshutdown的文件确定);
        如果是cleanShutDown(后缀名为.kafka_cleanshutDown的文件存在),则无需recover log segment;
        如果不是cleanShutDown, 则需要recover log segments;
    <6.1> 这里解释下什么是recover a log segment?
        在非cleanShutDown情况下, 一个log sement的log及index文件末尾可能有一些不合法的数据(invalid), 我们需要把它们截掉;
        首先要做的最简单检查,是log或index文件大小不能超过配置中设定的值(比方说一个.log文件中被设定最多保存10000条消息,超过10000条的都要抛弃掉);     
<7> 最后做sanityCheck, 主要是检查每个log sement的index文件,确保不会加载一个出错的Log Segment;

解决方法:

删除每个topic-partition目录下的*.index文件,重启Kafka server, 如果数据多的话,rebuild index会花较长时间。等索引重新创建完成,kafka就能正常工作了。

可参考命令:

find kafka-logs/ -size 10485760c -name *.index -exec rm -rf {} \; 

最新文章

  1. JsonHelper MergeJsonTemplate
  2. 【原创】三分钟教你学会MVC框架——基于java web开发(1)
  3. ubuntu16.04安装eclipse
  4. Java多态的体现之接口
  5. UVA 557 - Burger(概率 递推)
  6. Robots协议具体解释
  7. bzoj3669: [Noi2014]魔法森林 lct
  8. ARM标准汇编与GNU汇编
  9. HDU2181:哈密顿绕行世界问题(DFS)
  10. 手机自动化测试:appium源码分析之bootstrap十
  11. 关于关系型数据库(MySQL)的一些概念
  12. mac下配置caffe
  13. [python]标准库json格式化工具
  14. 【转载】 Sqlserver中通过Select Into语句快速单表备份
  15. shell的进度条【转】
  16. .net基础学java系列(二)IDE 之 插件
  17. window系统中 mongodb创建用户名和密码
  18. Python实现正则表达式匹配任意的邮箱
  19. Linux命令小计
  20. SQLServer 中的存储过程中判断临时表是否存在,存在则删除临时表

热门文章

  1. shell脚本获取传入参数的个数
  2. 【cf比赛记录】Codeforces Round #601 (Div. 2)
  3. 【Gamma阶段】第二次Scrum Meeting
  4. php 面试必备:各种缓存技术详解
  5. Openresty与Tengine
  6. PHP MQTT 实践
  7. MySQL Shared and Exclusive Locks
  8. WMS 162服务器空间满,清日志
  9. C# 语音技术
  10. ByteUtil