前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Logstash使用中遇到的一些坑和解决方案

Logstash使用中遇到的一些坑和解决方案

作者头像
扫帚的影子
发布2018-09-05 16:58:41
2.6K0
发布2018-09-05 16:58:41
举报
  • 基于Logstash 5.4.0版本
  • 主要针对收集本地文件日志后写入kafka这个场景
  • 还在进一步使用中, 遇到的新的问题会持续补充

无法写入kafka集群
  • 现象: 可以从本地要收集的文件中读取文件内容,但无法写入kafka集群;
  • 原因: kafka 集群版本为0.9.0.1, Logstash中自带的kafka client jar包不兼容, 官方文档其实有说明
  • 解决方案: 使用kafka 0.9.0.1版本中的kafka client jar作替换,主要涉及到下面的两个jar包, 替换后名字还要保持 kafka-clients-0.10.0.1.jar
代码语言:javascript
复制
/vendor/bundle/jruby/1.9/gems/logstash-input-kafka-5.1.6/vendor/jar-dependencies/runtime-jars/kafka-clients-0.10.0.1.jar
./vendor/bundle/jruby/1.9/gems/logstash-output-kafka-5.1.5/vendor/jar-dependencies /runtime-jars/kafka-clients-0.10.0.1.jar
同时收集多个文件时,有些文件收集很慢或无法收集
  • 现象: file input的path匹配到了多个待收集的文件, 但有些文件收集很慢或无法收集
  • 原因: 简单讲file input plugin使用filewatch组件来轮询文件的变化进行文件收集, filewatch发现文件有新数据可收集时会使用loop do end循环来一直读取当前文件, 直到收集到文件尾或有异常发生,才退出; 如此这样, 当有一个很大的或频繁被写入文件先处于被收集状态, 则其他待收集文件则没有机会被收集; 当然作者设计这样的逻辑也有他的道理.
  • 解决方案: 解决起来也很简单, 既然是轮询文件的变化进行文件收集, 这个loop do end循环是在observe_read_file这个函数里(./vendor/bundle/jruby/1.9/gems/filewatch-0.9.0/lib/filewatch/observing_tail.rb), 可以增加一个行数控制, 每次当当前文件收集的行数大于预设的阈值后就跳出这个loop do end循环.
无法退出Logstash进程之一
  • 现象: kill -SIGTERM后,logstash进程一直无法结束, 日志里会报The shutdown process appears to be stalled due to busy or blocked plugins. Check the logs for more information
  • 原因: file plugin中有线程没有结束, 经排查后发现和上一个问题的原因是一样的, 正在收集一个最大的文件, 陷入了loop do end循环.
  • 解决方案: 引入一个变量, 进程退出时此变量被set, 然后在 loop do end循环中check这个变量, 来决定是否退出这个循环.
无法退出Logstash进程之二
  • 现象: kill -SIGTERM后,logstash进程一直无法结束, 日志里会报The shutdown process appears to be stalled due to busy or blocked plugins. Check the logs for more information
  • 原因: 其实还是有线程没有结束掉所致, 经排查问题出在/vendor/bundle/jruby/1.9/gems/logstash-codec-multiline-3.0.3/lib/logstash/codecs/identity_map_codec.rb这个文件中的startstop函数, 按现在的逻辑stopstart仍可能被调用, 然后在start里又开启了一个新的thread, 却没有机会被stop了;
  • 解决方案: 引入一个变量, 确何在stop后, 即使再次调用start, 也不会再开启一个新的线程.
运行一段时间后,发现向kafka发送数据特别慢, 文件数据积压很多
  • 现象:运行一段时间后,发现向kafka发送数据特别慢, 文件数据积压很多, 重启后又恢复正常;
  • 原因: 在发现此问题是jstack打印出logstash当前所有线程的堆栈, 发现kafka发送的相关线程都卡在kafka java sdk里的BufferPoll::allocate, 具体原因可参考kafka官方bug
  • 解决方案: 因为我们的kafka版本是0.9.0.1, logstash中我们也是用了对应的sdk版本, 手动merge了官方的修复,替换kafka sdk jar, 测试目前没有问题

Logstash源码分析-框架概述

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Logstash源码分析-框架概述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档