ELK你这么学就对了—Logstash篇
一、什么是Logstash
Logstash是ELK中的L的全称,Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。本文主要从Logstash的工作原理,使用场景,部署方式和性能调优等方面讲解,带大家一同走进Logstash。
1.1 Logstash 处理工程
如上图,Logstash的数据处理过程主要包括:Inputs, Filters, Outputs 三部分, 另外在Inputs和Outputs中可以使用Codecs对数据格式进行处理。这四个部分均以插件形式存在,用户通过定义pipeline配置文件,设置需要使用的input,filter,output, codec插件,以实现不同的数据采集,数据过滤,特定格式数据输出等功能 。
- Input:用于从数据源获取数据,常见的插件如file, syslog, redis, beats 等【具体参考】
- filter:用于处理数据如格式转换,数据派生等,常见的插件如grok, mutate, drop, clone, geoip等【具体参考】
- output:用于数据输出,常见的插件有Elasticsearch,file,ganglia等【具体参考】
- codec:Codecs 不是一个单独的流程,主要是输入和输出的过程中进行格式转换,常见的插件有collectd,cloudtrail等【具体参考】
1.2 工作原理
- 每个Input启动一个线程,从对应数据源获取数据
- Input会把数据写到一个队列中,默认是有界队列(意外停止会导致数据丢失)。为了防止队列的数据丢失,Logstash提供了两个特性,分别是:
Persistent Queues:通过以内部队列的方式来存储事件达到防止数据丢失的目的。
Dead Letter Queues:保存Logstash无法处理的events(仅以Elasticsearch为输出源) - Logstash有多个pipeline worker,每个pipeline worker会从队列中取出一部分数据,然后再执行filter和output(相关的pepeline worker和每次取数量都可由配置来决定)。
二、Logstash如何安装
讲了那么多Logstash的原理,如何安装Logstash应该才是很多朋友关心的。不用着急,打开Logstash的官方文档,找到对应的下载页面
参考:https://www.elastic.co/guide/en/logstash/6.8/installing-logstash.html
2.1 下载与安装(Logstash 6.8.5)
https://www.elastic.co/cn/downloads/past-releases/logstash-6-8-5
安装步骤
- 软件初始化
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.5.tar.gz
tar -zxvf logstash-6.8.5.tar.gz -C /usr/local/
useradd -s /bin/nologin logstash
ln -s /usr/local/logstash-6.8.5 /usr/local/logstash
chown -R logstash:logstash /usr/local/logstash-6.8.5 /usr/local/logstash
- 内存限制
vim /usr/local/logstash/config/jvm.options
-Xms2g
-Xmx2g
其他安装方式
https://www.elastic.co/guide/en/logstash/6.8/installing-logstash.html
启动方式
调试方式:直接启动前台进程
bin/logstash -f /path/to/configfile
生产环境中一般后台启动:
nohup bin/logstash -f /path/to/configfile >标准日志 2>错误日志 &
启动前,可以使用 -t 选项测试配置文件是否有语法错误,如:
bin/logstash -f /path/to/configfile -t
三、Logstash的数据处理案例
3.1 源端为ES,目标端为csv。即:处理ES的导数
input {
elasticsearch{
hosts =>["192.168.248.231:9201","192.168.248.232:9201","192.168.248.233:9201"]
index =>"BANK"
query =>'{"query":{ "match_all" : {} }}'
size => 100
#配置遍历时间间隔
scroll => '5m'
docinfo => true
user => "elastic"
password => "paic1234A"
}
}
output {
file
{
#配置文件路径
path => "/appdata/logstash/bank.json"}
stdout{codec =>json}
}
四、性能调优
(1)Inputs和Outputs的性能:当输入输出源的性能已经达到上限,那么性能瓶颈不在Logstash,应优先对输入输出源的性能进行调优。
(2)系统性能指标:
- CPU:确定CPU使用率是否过高,如果CPU过高则先查看JVM堆空间使用率部分,确认是否为GC频繁导致,如果GC正常,则可以通过调节Logstash worker相关配置来解决。
- 内存:由于Logstash运行在JVM上,因此注意调整JVM堆空间上限,以便其有足够的运行空间。另外注意Logstash所在机器上是否有其他应用占用了大量内存,导致Logstash内存磁盘交换频繁。
- I/O使用率:
1)磁盘IO:
磁盘IO饱和可能是因为使用了会导致磁盘IO饱和的创建(如file output),另外Logstash中出现错误产生大量错误日志时也会导致磁盘IO饱和。Linux下可以通过iostat, dstat等查看磁盘IO情况
2)网络IO:
网络IO饱和一般发生在使用有大量网络操作的插件时。linux下可以使用dstat或iftop等查看网络IO情况
(3)JVM堆检查:
如果JVM堆大小设置过小会导致GC频繁,从而导致CPU使用率过高
快速验证这个问题的方法是double堆大小,看性能是否有提升。注意要给系统至少预留1GB的空间。
为了精确查找问题可以使用jmap或VisualVM。[参考]
设置Xms和Xmx为相同值,防止堆大小在运行时调整,这个过程非常消耗性能。
(4)Logstash worker设置:
worker相关配置在logstash.yml中,主要包括如下三个:
- pipeline.workers:
该参数用以指定Logstash中执行filter和output的线程数,当如果发现CPU使用率尚未达到上限,可以通过调整该参数,为Logstash提供更高的性能。建议将Worker数设置适当超过CPU核数可以减少IO等待时间对处理过程的影响。实际调优中可以先通过-w指定该参数,当确定好数值后再写入配置文件中。
- pipeline.batch.size:
该指标用于指定单个worker线程一次性执行flilter和output的event批量数。增大该值可以减少IO次数,提高处理速度,但是也以为这增加内存等资源的消耗。当与Elasticsearch联用时,该值可以用于指定Elasticsearch一次bluck操作的大小。
- pipeline.batch.delay:
该指标用于指定worker等待时间的超时时间,如果worker在该时间内没有等到pipeline.batch.size个事件,那么将直接开始执行filter和output而不再等待。