logstash简介及架构
1、logstash介绍
- 数据收集处理引擎
- ETL工具
2、logstash架构简介
Logstash Event是一个java object,它对外暴露了获取内部字段以及修改内部字段值的一些api。
下面举例讲解:
stdin:标准输入
codec是line,这个codec的作用就是按照每一行切割数据,就是说把每一行都转换成logstash event
stdout:标准输出
codec是json,这个codec的作用就是把每一个logstash event转换成json的对象输出。
line codec decode是按照换行符\n切割的。所以一行原始数据被分成了两个event。
所以,在原始数据和event之间不是一对一的关系。
event经过json codec encode后就把每一个logstash event输出成 json object。
3、测试
可以看到上图的数据有一个message为空的数据,是因为在bar的后面又换了一行。
4、详细讲解logstash的架构
下图是logstash6.x的架构
input是可以有多个的,每个input都有自己的codec,箭头代表数据流向。
数据会经过Queue,Queue会把流入的数据分发到不同的pipeline中。
每一个pipeline有Batcher、filter、output。
Batcher的作用是批量的从Queue中取数据。Batcher是可以配置的,比如一次取一百个数据。
看上图可知我有三个pipeline。
5、Life of an Event
这里介绍logstash Event的生命历程。
web.log为我们的配置文件
随着时间的推移,Batcher会收集越来越多的数据,当达到了处理数据的条件之后(Batcher会有两种条件,数目或时间,数目达到了设定的阈值或者是时间到了),Batcher就会把数据发送到filter,在filter中对每一条logstash Event进行相关的处理。
最后output就会把数据输出到你指定的输出。
那么,输出之后,会把处理的ACK发送给Queue,代表着我刚才处理了哪些event。
6、Queue的分类
logstash有两个Queue,一个是In Memory在内存中的Queue,这个Queue是固定大小的,是没法通过配置文件来修改的。坏处就是下图所示。
为了解决这个问题,推出了持久化Queue就是Persistent Queue In Disk,这个就是基于磁盘对处理数据进行一个记录。
7、Persistent Queue In Disk
Data从Input进来,
- Data到PQ中。
- PQ会把这个数据在磁盘中备份一份。
- PQ告诉Input说这条数据我已经收到了。前提是Input要支持这种机制,有了这种机制才能感知目前logstash的这种处理能力。
接下来蓝色部分,
- 数据就从PQ到filter output
- output把事件处理之后就会发送ACK到PQ
- PQ收到了这个ACK之后,就会把磁盘上的数据删除掉
这样就得知,即使发生了宕机,我的数据还是在disk中有的,只需要重启logstash把disk中的数据重新消费一次就解决了。
8、Memory Queue与PQ的性能
可以看到性能的下降不是很严重,估计是在5%以内,如果没有特殊需求一般建议把logstash的PQ打开。
9、打开PQ
queue.max_bytes默认是1GB,开大一点后,Queue能存储的数据也就多了一点。
还有一些:
path.queue PQ存到磁盘的哪个位置。
queue.page_capacity 控制消息队列每一个文件的大小。
queue.checkpoint.writes 提升容灾能力,如果是1 表示每写一个数据都去做盘,顶多也就会丢失一条数据。
10、logstash中线程的相关情况
调优的时候主要就是调整 Pipeline Workder Thread数。