热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kafka介绍及升级经验分享

http:blog.talkingdata.net?p3165背景当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kaf

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对象各自持有各自的。

《Kafka介绍及升级经验分享》

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即可。


推荐阅读
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 前言折腾了一段时间hadoop的部署管理,写下此系列博客记录一下。为了避免各位做部署这种重复性的劳动,我已经把部署的步骤写成脚本,各位只需要按着本文把脚本执行完,整个环境基本就部署 ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
author-avatar
那0年_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有