专栏首页分布式系统进阶Logstash使用中遇到的一些坑和解决方案

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

  • 基于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
/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源码分析-框架概述

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Librdkafka对kafka协议的封装和Features检测

    扫帚的影子
  • Kafka运维填坑Kafka源码分析-汇总

    调用Runtime.getRuntime.halt(1)直接暴力退出了. 可参考Kafka issue: Unclean leader election an...

    扫帚的影子
  • Librdkafka对kafka topic的封装

    扫帚的影子
  • P05_kafka_2.9.2-0.8.1集群搭建

    安装scala 2.11.4 1、将课程提供的scala-2.11.4.tgz使用WinSCP拷贝到sparkproject1的/usr/local目录下。 ...

    Albert陈凯
  • Python文件操作及应用

    DataScience
  • 【记忆卡片】linux常用的5个命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命...

    程序员互动联盟
  • phpMyAdmin 渗透利用总结

    二、phpMyAdmin利用: phpMyAdmin的漏洞多为经过验证后的才能利用,所以需要进入后台,可以采用爆破的方式进入后台,常用的有:

    重生信息安全
  • GCC编译器基本使用方法

    版权声明:本文为博主原创文章,转载请注明博客地址: ...

    zy010101
  • PADS多层板减少层数的必备方法(全面 方便 管用)

    前提 PADS是硬件工程师必备的画图软件,相信很多朋友遇到过为降低成本把6层板改为4层,或8层改为6层的经历,网上有两种方法更改: 1:把不需要的两层上所有...

    深度学习思考者
  • 大白话带你认识Kafka

    所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。

    黄泽杰

扫码关注云+社区

领取腾讯云代金券