http://blog.talkingdata.net/?p=3165

  • 背景

当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kafka来做消息传输中间件。Kafka解决了我们当时使用Kestrel遇到的最大的三个问题:吞吐量、数据量、一份数据多次消费。

  • 为什么要升级

相比其它开源项目,Kafka的升级比较麻烦,其根本原因主要是作为消息传输中间件,涉及的系统多。既然升级麻烦,而且Kafka 0.7在这一年多来运行稳定,性能优异,那么我们为什么要升级呢?

其实之所以决定升级Kafka,主要有两个原因,一是因为Kafka 0.7的scala版本是2.8,目前使用的多数开源框架(Spark、Play等)都是基于2.10的scala了,而scala 2.10和2.8两个版本是不兼容的。二,是因为之前曾发生过Kafka服务器RAID卡损坏的故障,期待Kafka 0.8的Replication功能。

  • 升级中遇到的问题及解决方案

1. 配置问题消费者找不到Broker

2. 问题描述消费者在消费数据的时候,连不上Broker

3. 问题原因Broker在正常启动之后会在zookeeper中注册自己的信息。消费者会根据这里面的host和port去连接broker,host是在server.properties配置host.name配置的值,这个值如果不配置,那么在Zookeeper中存放的就是Kafka这台服务器的主机名而不是ip,所以消费者才会连不上。而在Kafka0.7中,类似的配置叫hostname,这个值如果不配置,它会调用InetAddress.getLocalHost()去获取,获取的值不一定是你想要的,在我们当时它获取恰好是Kafka服务器的ip。

4. 解决方案(其中一种)

修改server.properties中host.name的配置,把它改成ip。

修改消费者所在机器的hosts文件,加入Kafka主机名与ip的映射。

使用DNS(推荐)

  • 数据去哪了

1. 问题描述:

生产者生产10000条数据后停止,这时启动消费者,发现消费者多不到任何东西,而且zookeeper中的offset居然和生产者生产了的offset一样。如果这时启动生产者继续发送数据,消费者从第10001条数据开始读取。之前的10000条数据都不见了。

2. 问题原因:Kafka的官方wiki的原话:

In 0.8, wehave moved to logical offsets from physical offsets. This means that theoffsets are not compatible. When you try to consume using the 0.7 offsets, youwould hit “OffsetOutOfRangeException”. The default behavior of theconsumer when this happens is based on the config value of “auto.offset.reset”.If it is set to “smallest”, the consumer will start consuming fromthe beginning. If it is set to “largest”, the consumer will startconsuming from the end.

3. 解决方案:给消费者增加auto.offset.reset配置,auto.offset.reset=smallest

  • 给”消息”减减肥

1. 问题描述:生产者或消费者抛出MessageSizeTooLargeException异常

2. 问题原因:这个异常的命名还是很直白的,消息太大了,去官网找找配置就解决了,比较郁闷的就是同样的消息大小,在Kafka0.7没有配置相应的参数也不报错。

3. 解决方案:

如果是生产者报错,修改Kafka Broker的配置,在server.properties中配置message.max.bytes,默认是1M(约)。

如果是消费者报错,修改消费者中增加fetch.message.max.bytes的配置,这个配置的值要大于Broker的message.max.bytes配置。

  • 性能问题:ACK参数配置

1. 问题描述:生产者上线后,吞吐量下降了1倍。

2. 问题原因:

首先检查Kafka Broker,发现的不管是网络、IO、CPU等都没有出现瓶颈,并且增加生产者线程或者生产者实例可以解决问题,假设生产者写Kafka的速度是10000条每秒,那么再部署一个生产者,两者写入速度均可以达到10000条,遂断定问题出在生产者本身,通过jstack可以发现,线程都在做写Kafka的操作,那么写Kafka究竟和0.7有什么不一样呢?

Kafka0.8有Replication功能,消息写入Kafka中后,Followers会创建副本,生产者有个配置叫request.required.acks,当时配置的是1,生产者会等至少1个Followers创建完副本之后才算发送成功,平均响应时间变长,所以速度变慢。

3. 解决方案(其中一种)

增加生产者线程数或者生产者实例,系统的相应时间增加,但是系统的并发数并没有到达上限,并且Kafka Broker可以平行扩展。设置request.required.acks=0,这样做会有丢失数据的风险。

  • Producer锁

1. 问题描述:生产者有很多的线程状态都是BLOCKED,导致系统性能大幅度下降。

2. 问题原因:根据源代码可以看出,生产者发送时是有锁的,但这个锁每个Producer对象各自持有各自的。

3. 解决方案:对于不同线程使其持有不同的producer对象。

  • 坑:文件分段大小配置有bug

1. 问题描述:

系统上线后我们遇到了文件句柄数过多的问题,如果配置的分段文件大小一样,0.8会比0.7多4倍的文件数目,所以我们当时决定增加分段文件的大小,必须是一个Int,于是改成Int.Max,结果数据整个offset错乱,文件损坏,集群不可用了。

2. 问题原因:

private def maybeRoll(messagesSize: Int): LogSegment = {

val segment = activeSegment

if (segment.size > config.segmentSize – messagesSize ||

segment.size > 0 && time.milliseconds – segment.created > config.segmentMs – segment.rollJitterMs ||

segment.index.isFull) {

……

roll()

} else {

segment

}

}

3. 解决方案:配小一些或者升级到0.8.2

  • 神一般的错误提示

1. 问题描述:Consumer消费时出现Iterator is in failed state的错误提示,错误量很多。

2. 问题原因:

这个错误并不是真正的错误,是因为MessageSizeTooLargeException导致的,发生MessageSizeTooLargeException异常会导致Iterator is in failed state错误的发生,但是MessageSizeTooLargeException只会打印一次,而那个错误会随着读取方法的调用不停的打,完全被带跑偏了。

3. 解决方案:解决MessageSizeTooLargeException即可。

【转载】Kafka介绍及升级经验分享的更多相关文章

  1. Apache Kafka - 介绍

    原文地址地址: http://blogxinxiucan.sh1.newtouch.com/2017/07/12/Apache-Kafka-介绍/ Apache Kafka教程 之 Apache Ka ...

  2. 1、Kafka介绍

    1.Kafka介绍 1)在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 2)Kafka是一个分布式消息队列. 3)Kafka对消息保存时根据Topic进行归类, ...

  3. [转]kafka介绍

    转自 https://www.cnblogs.com/hei12138/p/7805475.html kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台 ...

  4. Kafka介绍及安装部署

    本节内容: 消息中间件 消息中间件特点 消息中间件的传递模型 Kafka介绍 安装部署Kafka集群 安装Yahoo kafka manager kafka-manager添加kafka cluste ...

  5. kafka介绍与搭建(单机版)

    一.kafka介绍 1.1 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能: 1:It lets you publish and subscribe to ...

  6. kafka介绍及安装配置(windows)

    Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...

  7. 一、kafka 介绍 && kafka-client

    一.kafka 介绍 1.1.kafka 介绍 Kafka 是一个分布式消息引擎与流处理平台,经常用做企业的消息总线.实时数据管道,有的还把它当做存储系统来使用. 早期 Kafka 的定位是一个高吞吐 ...

  8. [转载] KAFKA分布式消息系统

    转载自http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日 ...

  9. 消息系统Kafka介绍 - 董的博客

    1.  概述 Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据.活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv.用户访问了什么内容,搜索了 ...

随机推荐

  1. Python3 测试报告BeautifulReport中添加截图

    在测试类中,添加save_img方法,在测试过程中出现错误时,自动截图并返回失败 默认存放的图片路径是img def save_img(self, img_name): ""&qu ...

  2. 帝国cms过滤采集内容

    在过滤广告正则的[!--ad--]标识处,加上过滤正则即可 https://jingyan.baidu.com/article/c275f6bae3ea0de33d75671c.html

  3. 在myeclipse安装beyond插件

    目录 文章背景 目录 环境介绍 安装步骤 说明 参考文章 版本记录 文章背景 myeclipse自带的比较工具感觉是有一些看不清晰,也不是太方便处理,然后就找了个比较插件了. 目录 环境介绍 myec ...

  4. fabric.js 限制缩放的最大最小比例

    var rect = new fabrics.Rect({ v: true, top: 216, left: 384, width: 160, height: 90, fill: 'transpare ...

  5. python从入门到大神---3、浮光掠影python3语法

    python从入门到大神---3.浮光掠影python3语法 一.总结 一句话总结: 语法不必一次记全部,效率太差,用哪部分内容,就把那部分内容全部记下来 1.python3中单引号和双引号的区别是什 ...

  6. Dll注入技术之注册表注入

    DLL注入技术之REG注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...

  7. [转]WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决

    背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...

  8. SPSS缺失值得分析处理

    SPSS缺失值得分析处理 在资料收集的过程中,由于各种原因可能导致数据收集不全,就会产生缺失值,且这种情况往往无法避免.如果缺失值处理不当,就会导致分析结果精度降低,出现偏倚甚至是错误的理论,因此缺失 ...

  9. java时间工具类,时间相互转换

    /* * @author XueWeiWei * @date 2019/8/26 16:22 */ package com.nps.utils; import java.text.ParseExcep ...

  10. 24-Ubuntu-文件和目录命令-查找文件内容-grep

    grep Linux系统中grep命令是一种强大的文本搜索工具. grep允许文本文件进行模式查找,所谓模式查找,又被称为正则表达式. 选项 含义 -n 显示匹配行及行号 -v 显示不包括匹配文本的所 ...