Logstash

Logstash介绍

详情可查看:https://www.elastic.co/guide/en/logstash/current/persistent-queues.html

logstash事件通过进程管道有序的执行input,filter,output模块。每个input模块都有其自己的进程管道执行,input模块将获取的数据写入到指定的队列存储到内存或者磁盘。每个工作进程从队列中获取批量的数据,然后经过filter配置。然后执行filter进程将数据运输到output模块。批量获取的数据大小和工作的线程数量都是可配置的。

  1. pipeline.workers

  2. pipeline.batch.size

  3. pipeline.batch.delay

详情可查看:https://www.elastic.co/guide/en/logstash/current/tuning-logstash.html

默认情况下,logstash在input->filter,filter->output阶段,都是将数据存储到内存中的指定队列并且缓存起来。如果logstash终端意外停止,将会导致内存中存储的数据都会丢失。不过你可以通过配置将内存中的数据同步到磁盘从而达到持久化。

持久化配置

  1. queue.type:默认是memory,可选persisted持久化queue。

  2. path.queue:queue存储的文件路径。默认是 path.data/queue。

  3. queue.page_capacity:默认是 64mb,每个文件可以存储的最大值。

  4. queue.drain:如果您想要Logstash在耗尽持久队列之后才关闭,那么请指定true。耗尽队列所需的时间取决于在队列中累积的事件的数量。因此,您应该避免使用此设置,除非队列(即使已满)相对较小且可以快速排干。

  5. queue.max_events:queue中可以存储的最大事件数量,默认是0不限制。

  6. queue.max_bytes:队列的总容量(以字节为单位)。默认是1024mb。不过要确认你的磁盘空间一定要比这个配置项大的大。建议:如果你想持久化队列并且无需占用大多缓存,那么可以设置这个值小一点,比如10mb从而是queue更小提升queue的性能。

持久化的限制

  1. 不使用请求-响应协议的输入插件不能防止数据丢失。例如:tcp、udp、zeromq push+pull和许多其他输入都没有向发送方确认接收的机制。诸如beats和http之类的插件(它们确实具有确认功能)很好地受到这个队列的保护。

  2. 不处理永久的机器故障,例如磁盘损坏、磁盘故障和机器丢失。保存到磁盘的数据没有备份所以可能导致丢失。

logstash的工作过程

流程:
input → queue → filter + output

介绍:
input->filter:当input将数据成功写到queue时,会给数据源发送确认机制。
queue → filter + output:当处理来自队列的事件时,Logstash仅在过滤器和输出完成后,才在队列中确认事件已完成。队列保存由管道处理的事件的记录。当且仅当事件完全由Logstash管道处理时,事件被记录为已处理(在本文档中称为“已确认”或“已打包”)。确认的意义是什么呢?表明数据已经经过了所有的filter和output,数据已经完全保存到output。

异常情况:
1、如果在logstash执行的过程当中,强制的停止了程序的执行(CTRL C或者SIGTERM),那么logstash会停止从queue中读取数据并且继续完成filter和output中的数据。在下一次重启logstash的时候,那么会继续读取持久化queue中的数据就像处理新的input一样。
2、如果Logstash异常终止,那么任何运行中的事件都不会被劫持,并在重启Logstash时由过滤器和输出重新处理。Logstash分批处理事件,因此对于任何给定的批,当异常终止发生时,其中一些批可能已经成功完成,但没有记录为已打包。

监控Logstash

通过Logstash的API可以实现监控Logstash。那么监控的点有哪些呢?

  1. Logstash节点信息,比如:管道设置,OS信息,JVM信息

  2. 插件信息,包括已经安装的所有插件。

  3. 节点统计信息,比如JVM统计,进程统计,event-reloated统计,管道运行时间统计。

  4. 热线程。

监控API:https://www.elastic.co/guide/en/logstash/current/monitoring.html

Logstash指令

1
bin/logstash -f first-pipeline.conf --config.test_and_exit --path.data=/root/first
  • --config.test_and_exit 测试配置文件并且会报出任何错误。
1
bin/logstash -f first-pipeline.conf --config.reload.automatic --path.data=/root/first
  • --config.reload.automatic 一旦你修改你的配置文件,可以重新加载你的配置文件而无需重启。

  • 前提:设置Logstash.yml 配置项:config.reload.automatic: true

  • path.data:如果同时启动两个logstash并且不指定path.data,那么第二个启动的logstash就会报path.data的错误。

    • 那么path.data是什么呢?
    • 在指定path.data之后,当logstash启动对应的配置之后会在path.data指定的目录生成相关的文件,而这些文件很肯能就是logstash用来运行的环境变量。因此每个logstash的配置启动都需要指定一个工作的目录而防止文件串了。