Kafka 副本OffsetOutOfRangeException

@(KAFKA)[kafka]

  • Kafka 副本OffsetOutOfRangeException

    • 1故障描述
    • 2故障详细原因线程同步锁使用了写锁未使用读锁
    • 3解决建议
      • 方法一升级至0901
      • 方法二修改kafka代码自己编译一个版本
      • 方法三新集群上线降低问题出现概率
      • 方法四检查拓扑报警时出现若是类似异常直接重启
      • 方法五拓扑均使用opaque
      • 建议
    • 4最终解决方案

https://issues.apache.org/jira/browse/KAFKA-2477
影响版本0.8&之前,修复版本0.9.0.0

1、故障描述

近期,由于kafka集群负载增大,server.log中经常出现下面的错误日志。这是kafka自身的一个bug。

简单说就是由于副本去leader请求同步数据时,发现请求的offset超出了leader的offset范围(原因见下面代码解释),从而认为副本出错了,于是删除副本数据,从leader重新同步一份数据过来。由于每个分区的数据较大(约60G),同步时间较长,在此期间,leader及replication均处于高磁盘、网络IO的状态,导致storm读取数据时超时无响应。

对于opaque拓扑,当发现某个分区不可用时,会读取其它分区。而transactional拓扑必须等这个分区恢复。因此最后的结果是SA的拓扑恢复了,而US/SDC的拓扑挂掉。

[2016-03-29 18:24:59,403] WARN [ReplicaFetcherThread-3-4], Replica 2 for partition [g17,4] reset its fetch offset from 3501121050 to current leader 4's start offset 3501121050 (kafka.server.ReplicaFetcherThread)
[2016-03-29 18:24:59,403] ERROR [ReplicaFetcherThread-3-4], Current offset 3781428103 for partition [g17,4] out of range; reset offset to 3501121050 (kafka.server.ReplicaFetcherThread)

2、故障详细原因:线程同步锁使用了写锁,未使用读锁

(1)某个Wrtier(W1)开始写数据,它对日志只有写锁,未锁定读。若线程W1将日志已经append到log中,但未更新nextOffset,此时被其它线程取得运行权。假设此时offset为100,nextOffset为101.
(2)此时副本的一个Reader(R1)过来读数据,它之前已经读到100了,所以请求nextOffset为101, leader发现有offset为101的数据,所以正确返回数据。
(3)然后副本的下一个Reader(R2)来继续读数据,它已经读取到101了,所以请求102,但在leader中,由于nextOffset未更新,它认为102已经超出它当前的100的offset了,所以出现OffsetOutOfRange异常。kafka认为副本已经损坏,删除副本数据,从leader重传
(4)W1线程继续执行,更新nextOffset到102,但已经太迟了,异常已经出现。
相关代码:

val next = nextOffsetMetadata.messageOffsetif(startOffset == next)return FetchDataInfo(nextOffsetMetadata, MessageSet.Empty)var entry = segments.floorEntry(startOffset)// attempt to read beyond the log end offset is an error// attempt to read beyond the log end offset is an errorif(startOffset > next || entry == null)if(startOffset > next || entry == null)throw new OffsetOutOfRangeException("Request for offset %d but we only have log segments in the range %d to %d.".format(startOffset, segments.firstKey, next))

3、解决建议

方法一:升级至0.9.0.1

目前版本0.8.2,这个bug在0.9.0.0修复。这是一劳永逸的办法,也是最终的解决的办法。
问题:storm-kafka0.9还处在开发阶段,暂时beta版不建议使用。
结论:最终解决方法,但暂时不可用。

方法二:修改kafka代码,自己编译一个版本

问题:kafka使用gradle编译的scala代码,重新编译有风险

方法三:新集群上线,降低问题出现概率

加快新集群上线的速度,当负载降低时,问题出现概率会相应降低。
问题:治标不治本。

方法四:检查拓扑报警时,出现若是类似异常,直接重启

通过storm REST API获取拓扑异常信息,符合一定条件时,重启拓扑。
暂时可行的方法。

方法五:拓扑均使用opaque

问题:拓扑实现opaque的MapState会较为复杂。

建议:

(1)先使用方法四暂时度过。
(2)我们先尝试编译并维护自己的一个版本,同时加快新集群上线。哪个先达成就使用哪个。
(3)最终使用方法一解决问题。

4、最终解决方案

(1)调整以下2个参数,减低replica从leader同步数据的速度:

message.max.bytes=10000000
replica.fetch.max.bytes=10737418
num.replica.fetchers=2

(2)升级kafka至0.10.0.1

至此,问题已基本解决,除了GC时间偶尔过长导致zk认为kafka挂掉以外,如果这种情况出现较多的话,则考虑增大zk的timeout时间。

补充:
storm fix了一个小bug:
https://issues.apache.org/jira/browse/STORM-2440

Kafka 副本OffsetOutOfRangeException相关推荐

  1. 【无标题】Kafka副本管理—— 为何去掉replica.lag.max.messages参数

    1.概述 转载:Kafka副本管理-- 为何去掉replica.lag.max.messages参数 今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration para ...

  2. kafka 同步提交 异步_详解Kafka设计架构核心——Kafka副本机制详解

    所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.副本机制有什么好处呢? 1. 提供数据冗余.即使系统部分组件失效,系统依然 ...

  3. Kafka详解(五)Kafka副本机制

    所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.它的作用主要有以下几点: 提供数据冗余.即使系统部分组件失效,系统依然能够 ...

  4. Kafka副本同步机制

    一.Kafka副本同步机制 Kafka中topic的每个partition有一个预写式日志文件,每个partition都由一系列有序的.不可变的消息组成,这些消息被连续的追加到partition中,p ...

  5. kafka副本机制详解

    副本机制(Replication) 又称为备份机制,通常是指在分布式系中在多台机器中存储相同的数据进行备份的机制,副本机制只要有3个好处. 提供数据冗余:即使部分机器出现故障,系统仍然可以提供服务,增 ...

  6. Kafka | Kafka副本机制详解

    今天我要和你分享的主题是:Apache Kafka 的副本机制. 所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝.副本机制 ...

  7. Kafka 副本leader选举

    谁来实施 分区leader副本的选举由Kafka Controller 负责具体实施. 选举时间 leader挂掉时 broker挂掉时,然后broker上可能有某些leader 选举资格 Kafka ...

  8. Kafka系列 - 10 Kafka副本|分区副本分配|手动调整分区副本|Leader Partition 负载平衡|增加副本因子

    文章目录 1. 分区副本分配 2. 手动调整分区副本 3. Leader Partition 负载平衡 4. 增加副本因子 1. 分区副本分配 如果 kafka 服务器只有 4 个节点,那么设置 ka ...

  9. kafka副本机制学习

    作用: 1.高可用,数据冗余.不能够提供读的能力,也不能有局部性原理: 注:同一分区的副本会在不同broker上面: 副本同步机制: 读写都在领导副本上面,副本通过主动pull的方式在leader副本 ...

最新文章

  1. UITesting Bundle使用
  2. Python 编码风格指南
  3. RISC与CISC比较
  4. Spring框架:跨域问题之使用@CrossOrigin注解解决失败的原因总结
  5. 如何将自己的网站分享到QQ空间,微信,微博等等。
  6. 响应式开发---网页的布局方式、媒体查询、栅格化布局、less语言
  7. HDU4405(期望DP)
  8. AIS 2021顶级论文报告会论文征集与听众报名通知
  9. 调用http_Go教程34:Go微服务间Http+Json调用
  10. python课程典范选优_python 实现选课系统
  11. 中科大EPC课程爬取
  12. java pdf转jpg字体问题_java生成pdf字体的坑
  13. java等额本息、等额本金计算Mark
  14. pandas处理df函数及plt绘图函数(作业总结笔记待补充...)
  15. 1.初识elasticsearch
  16. 店盈通:你肯定不知道,拼多多如何打造基础销量
  17. 索引的概念,何时加索引?
  18. 堆是先进先出,栈是先进后出
  19. 1035: 分段函数求值 C语言
  20. OpenGL着色器透视变换实例-通过旋转平移调试着色器

热门文章

  1. Python_items()方法【详解】——Python系列学习笔记
  2. 【绝对有用】Syntax error on token “throws“, @ expected after this token
  3. 算法竞赛入门经典(第二版) | 例题5-1 大理石在哪 (普适查找)(UVa10474,Where is the Marble?)
  4. 什么原因可能导致主备延迟?
  5. python入门经典书籍知乎_知乎问题回答 - 《Python100天从新手到大师》 - 开源书籍(oscbook.com)...
  6. Kubernetes二进制部署——Flannel网络
  7. 基于eclipse swt做java浏览器内嵌等功能
  8. java如何开发bpm系统_java工作流bpm开发ERP实例
  9. MySQL之日期时间处理函数_MySQL之日期时间处理函数
  10. Juniper 210 密码清不掉_三分钟学会如何找回mysql密码