本文主要介绍了Beats工具,并在之前的ELK流程中加入Filebeat进行演示。
Beats 介绍
Logstash
是一个较早开发的数据收集和转换工具,用户仅需编写配置文件便可轻松地将各类数据导入Elasticsearch
。然而,Logstash在运行时较为耗费资源,因此官方随后推出了一系列轻量级数据收集器,这些以“beat”为命名的工具被统称为Beats
。Beats实际上是将Logstash的数据收集功能拆分出来,由这些更轻量的工具来完成。因此,Beats
家族是Elastic Stack
中的后起之秀。
Beats
采集的数据既可以先汇聚到Logstash
,再由其写入Elasticsearch
,也可以直接由Beats
采集后直接写入Elasticsearch
。
目前,Beats家族包括了几种主要成员,并且这个家族的种类还在持续增加。Beats家族中常见的工具列举如下:
- Filebeat:用于采集各类日志文件,可以读取并传送日志的行,支持断点续传。
- Metricbeat:用于采集各种软硬件的运维监控数据,例如CPU、内存、MySQL等运行时的指标数据。
- Packetbeat:用于采集各种网络协议产生的流量数据,通过分析这些数据你可以及时发现网络存在的问题和其运行状态。
- Winlogbeat:用于采集Windows系统的事件日志,可以用来实时分析Windows系统中产生的各种事件。
- Heartbeat:能够监测指定的服务是否可用并能将监测结果采集到Elasticsearch中进行分析。
- Auditbeat:用于采集Linux审计框架的事件数据,通过采集并监控用户的行为数据和关于系统进程的数据,能够识别出系统潜在的风险和安全问题。
Beats 的必要性
设想一下这样以下场景:
假如有100个节点,每个节点上有20个日志文件需要采集,则需要安装100个Logstash,一共要启动2000个数据管道同时写入Elasticsearch,这样会非常浪费硬件资源,而且Elasticsearch需要启动大量的线程去应对2000个数据管道日志的同时写入,效率十分低下。
而Beats家族的每一个成员都擅长某个方面的数据采集,并且它们的性能开销非常小,使用Beats家族的成员完成分布式环境中的大规模数据采集对提升大数据处理的效率十分有好处。同时,每个Beats采集数据的吞吐量是不同的,由于Logstash拥有缓冲队列,把Beats的数据流引入Logstash可以起到数据汇聚和数据缓冲的作用,减少数据流对Elasticsearch的冲击力。
常见的Beats + ELK的框架图如下:
当然,也可以在Beats与Logstash中间也可以加入消息队列工具,更好地进行数据缓冲。
本文主要介绍Beats中的文件采集工具Filebeat
.
Filebeat 使用
我们使用Filebeat收集logs目录下的log文件,将其收集后的数据送至Lostash,走ELK流程。
其中filebeat.yml
文件配置如下:
1 2 3 4 5 6 7 8 9
| filebeat.inputs: - type: log enabled: true paths: - /usr/share/filebeat/target/*.log output.logstash: hosts: ["logstash:5044"] processors: - add_id: ~
|
在Logstash中,配置logstash.conf
文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| input { beats { port => 5044 } } output { stdout { codec => rubydebug } if [@metadata][_id] { elasticsearch { hosts => ["http://elasticsearch:9200"] document_id => "%{[@metadata][_id]}" index => "myfilebeat-%{[agent][version]}-%{+yyyy.MM.dd}" } } else { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "myfilebeat-%{[agent][version]}-%{+yyyy.MM.dd}" } } }
|
logstash的输入为beats, 输出为ElasticSearch.
同时,整个流程的docker-compose.yml
文件配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| version: "3.1" services: filebeat: container_name: video-filebeat image: elastic/filebeat:7.17.0 restart: always user: root volumes: - ./filebeat/logs:/usr/share/filebeat/target - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml - ./filebeat/data:/usr/share/filebeat/data ports: - "9000:9000" networks: - filebeat_elk_net
logstash: container_name: logstash-7.17.0 image: docker.elastic.co/logstash/logstash:7.17.0 volumes: - ./logstash/config/logstash.yml:/usr/share/logstash/logstash.yml - ./logstash/data:/usr/share/logstash/data - ./logstash/pipeline:/usr/share/logstash/pipeline ports: - "5044:5044" networks: - filebeat_elk_net depends_on: - filebeat - elasticsearch
elasticsearch: container_name: elasticsearch-7.17.0 image: elasticsearch:7.17.0 environment: - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" - "http.host=0.0.0.0" - "node.name=elastic01" - "cluster.name=cluster_elasticsearch" - "discovery.type=single-node" ports: - "9200:9200" - "9300:9300" volumes: - ./es/plugins:/usr/share/elasticsearch/plugins - ./es/data:/usr/share/elasticsearch/data networks: - filebeat_elk_net
kibana: container_name: kibana-7.17.0 image: kibana:7.17.0 ports: - "5601:5601" networks: - filebeat_elk_net depends_on: - elasticsearch
networks: filebeat_elk_net: driver: bridge
|
待流程运行后,会讲logs文件下的log文件逐行读入ElasticSearch中,其中一行的数据如下:
可以看到,加入Filebeat后,解析后的数据字段比单纯的ELK多了很多,比如agent字段等。
总结
有了之前ELK基础,那么学习Beats是十分迅速的。Beats工具的想法也很简单,就是在ELK之前做一步数据采集工作,能够支持分布式数据,而轻量化。
本文主要介绍了Beats工具,并在之前的ELK流程中加入Filebeat进行演示。
欢迎关注我的公众号
NLP奇幻之旅,原创技术文章第一时间推送。
欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。