概述
Elastic Stack推出Beats家族的初衷是弥补Logstash在数据采集方面的一些性能上的不足。
早期ELK技术栈使用Logstash收集并解析日志,但Logstash对内存、cpu、io等资源消耗比较高。如果用它来对服务器进行日志收集,将加重服务器的负载。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计,Filebeat作为一个轻量级日志收集处理工具,可用来替代Logstash。
假如有100个节点,每个节点上有10个日志文件需要采集,则需安装100个Logstash,一共要启动1000个数据管道同时写入ES,这样会非常浪费硬件资源,而且ES需要启动大量的线程去应对1000个数据管道日志的同时写入,效率十分低下。
Beats家族成员:
- Filebeat:日志文件和其他数据采集,从服务器端传送日志文件,完成日志文件数据传输
- Metricbeat:指标数据采集,服务器监控代理程序,分时段采集服务器上操作系统和服务的各项指标
- Winlogbeat:Windows事件日志采集
- Packetbeat:网络数据采集,在应用服务器间传输事务信息的分析器,完成网络数据包传输
- Auditbeat:审计数据采集
- Heartbeat:运行状态监测数据采集
在开源社区中,第三方Beats:
- amazonbeat
- apachebeat
- httpbeat
- mongobeat
- mysqlbeat
- redisbeat
- springbeat
- twitterbeat
- udpbeat
架构
ELK技术栈引入Beats有两种方案:
- 抛弃Logstash
- 保留Logstash
Beats家族的成员采集到的数据可以直接写入ES,不使用Logstash直接将Beats家族采集到的数据写入ES的预处理节点(预处理节点类似于Logstash的过滤器,它可以将采集到的非结构化数据转化为结构化的字段)还可以先进行数据转换再将其写入索引,最后使用Kibana可视化展示采集到的数据。架构如下:
这个架构特别适用于Filebeat自带的模块数据采集,替换掉Logstash使数据的处理流程变得简化,但存在一些缺点:
- 如果同时写入的Beats节点过多,依然会给ES集群带来不小的写入压力。
- 使用预处理节点转换数据没有使用Logstash灵活、方便,数据转换功能相对简单。
保留Logstash的ELFK架构如下,各种Beats采集到的数据统一到Logstash:
优点如下:
- 每个Beats采集数据的吞吐量不一样,Logstash有缓冲队列,把Beats的数据流引入Logstash可以起到数据汇聚和数据缓冲的作用,减少数据流对ES的冲击。
- Logstash的input插件功能非常丰富,其相比Beats家族能够采集到更多种类的数据。
- Logstash的数据转换功能比预处理节点的数据转换功能更强大。
- Logstash的output插件相比Beats家族能支持更多类型的数据输出。
安装
下载并解压,修改默认的配置文件filebeat.yml
,找到bin目录下可执行脚本,双击即完成安装。
原理
Filebeat以一种探测并传输的方式工作。程序启动后,将会创建一个或多个探测器(harvester)在特定位置探测日志文件信息并获取日志内容。每一个新发现的日志内容均会被发送给spooler处理程序,该程序将对每一个事件进行聚合,并将聚合之后的数据发送给预先配置好的输出端。
每个Filebeat的配置可以包含一到多个input,可在input中定义数据源的类型以及每个日志文件的路径,采集时Filebeat会为每个日志文件生成一个采集器用于收集新的日志数据。如果需要对采集到的数据进行简易的转换和处理,则可以定义一些处理器进行数据过滤,相当于Logstash的filter,但功能更简单。经过处理器处理的数据流会按照output的配置输出到采集的目的地。
Filebeat运行时,会在安装目录下生成一个data文件夹,里面包含每个日志文件的采集进度数据,每次重启Filebeat时,会读取之前的采集进度数据,并继续采集后面的日志数据。Filebeat采集的数据输出到目的地后会收到相应的确认信息,如果某些数据未得到确认Filebeat会被异常终止,则下次重启Filebeat时,未得到确认的数据会被再次发送,确保每条数据至少能向外传送一次。
配置文件
filebeat.yml
包括如下6大模块:
- inputs:数据源,必选
- modules:模块,可选
- template:索引模板,可选
- setup:连接地址,可选
- output:输出,必选
- processors:处理器,可选
filebeat.yml
实例:
filebeat.inputs:
- type: log
paths:
- /opt/app/JAR_NAME*.log
fields:
log_topic: JAR_NAME
multiline:
pattern: '^\d{4}-\d{2}-\d{2}'
negate: true # 是否匹配到
match: after # 合并到上一行的末尾
max_lines: 1000 # 最大的行数
timeout: 5s # 如果在规定的时候没有新的日志事件就不等待后面的日志
#tail_files: false
# pattern: '^[[:space:]]'
# negate: false
# match: after
processors:
#- drop_fields:
# fields: :["@timestamp", "input"]
#- decode_json_fields:
- include_fields:
fields: ["message"] #要进行解析的字段
# target: ""
# overwrite_keys: false
# process_array: false
# max_depth: 1
output.kafka:
enabled: true
hosts: ["kafkalog.aaa.com:9092"]
topic: JAR_NAME
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
#topic: '%{[fields.log_topic]}'
实战
输出到Logstash
filebeat.yml
配置如下:
output.logstash:
hosts: ["localhost:5044"]
Logstash启动后会在5044端口(默认端口)监听Filebeat的输入,并接收采集到的日志文本,配置文件filebeat.conf
:
input {
beats {
port => 5044
}
}
// 省略
输出到ES
filebeat.yml
配置:
output.elasticsearch:
hosts: ["localhost:9200"]
Filebeat的索引模板filebeat.template.json
默认存放在/etc/filebeat
文件夹中。配置输出数据到ES时,Filebeat在启动时会自动加载默认模板。如果需要加载另一种模板,则需要在filebeat.yml配置文件中修改相关配置:
output.elasticsearch:
hosts: ["localhost:9200"]
template.name: "filebeat" # 模板名称
template.path: "filebeat.template.json" # 模板文件路径
template.overwrite: false # 禁用覆盖,默认为false,不允许将已有的模板覆盖。配置为true启用覆盖功能
采集Nginx日志
Filebeat自带Nginx模块,通过如下命令来启用Nginx模块:./filebeat modules enable nginx
查看被启用模块的列表./filebeat modules list
编辑modules.d
文件夹下的nginx.yml
文件:
- module: nginx
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/usr/local/nginx/logs/access.log"]
# Error logs
error:
enabled: true
var.paths: ["/usr/local/nginx/logs/error.log"]
ingress_controller:
enabled: false
ingress_controller日志是给kubernetes使用的,设置成禁用即可。
编辑filebeat.yml
文件
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
host: "localhost:5601"
output.elasticsearch:
hosts: ["localhost:9200"]
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
执行命令./filebeat setup -e
初始化,执行命令./filebeat -e
开始采集日志。
进阶
libbeat
官方提供的libbeat运行库,使用Golang编写,所有的Beats工具均使用libbeat提供的API接口,执行传输数据到ES,配置数据的输入,及实现日志记录等任务。
Metricbeat
Metricbeat通过收集数据的方式来监控服务器以及Apache、HAProxy、MongoDB、MySQL、Nginx、PostgreSQL、Redis、System和Zookeeper等服务的运行状况。
metricbeat.yml
配置文件:
metricbeat.modules:
-module: system # 指定模块的名称
metricsets:
-cpu # 指定模块中具体要采集的指标
-filesystem
-memory
-network
-process
enabled: true # 指定是否启用该模块
period:10s # 指定采集时间间隔
processes: ['.*'] # 指定进程,这里使用通配符,表示所有进程
cpu_ticks: false # 指定是否采集CPU时钟频率
Winlogbeat
Winlogbeat可以对系统中的新事件进行监视,使用Windows API,从一个或多个事件日志中读取数据,根据用户事先配置好的规则对事件信息进行过滤,然后将事件数据传输至配置好的输出端。每一种事件日志的读取位置信息将被持久化到磁盘中,以便Winlogbeat重新启动后恢复事件日志位置信息。Winlogbeat可以从正在运行的操作系统中捕获任何类型的事件数据,如应用程序事件、硬件事件、安全性事件和系统事件等。
Windows中的事件日志类型可以通过执行如下PowerShell命令来查看:
Get-EventLog *
winlogbeat.yml
配置文件:
output.elasticsearch:
hosts: ["localhost:9200"]
template.name: "winlogbeat"
template.path: "winlogbeat.template.json"
template.overwrite: false
Packetbeat
Packetbeat的主要功能包括捕获应用服务器间网络信息流通量,对应用层的数据(如HTTP,MySQL或Redis等)进行解码,关联请求和响应,以及对每种事务中有价值的输出字段进行记录等。Packetbeat能够嗅探服务器间网络通路,并直接将相关事务信息存入Elasticsearch中,这将有利于用户对网络信息流通量和日志信息进行分析,也便于用户关注后端程序出现的漏洞或性能缺陷,以完成快速修复。
安装Packetbeat前需要安装libpcap0.8:sudo apt-get install libpcap0.8
。
从Elastic官网获取Packetbeat的DEB格式安装包:curl-L-O https://artifacts.elastic.co/downloads/beats/packetbeat/ packetbeat-8.x.x-amd64.deb
解包并安装Packetbeat:sudo dpkg-i packetbeat-8.x.x-amd64.deb
packetbeat.yml
配置文件:
packetbeat.protocols.dns:
ports: [53]
include_authorities: true
include_additionals: true
packetbeat.protocols.http:
ports: [80,8080]
packetbeat.protocols.memcache:
ports: [11211]
packetbeat.protocols.thrift:
ports: [9090]
packetbeat.protocols.cassandra:
ports: [9042]
packetbeat.interfaces.device
:指定安装Packetbeat的服务器端向何种设备收发信息。如果需要向任何设备均收发信息,该项可设置为any
;如果需要指定特定设备,该项可设置为设备编号,设备编号可以通过在/etc/init.d
目录中执行终端命令sudo packetbeat.sh-devices
查询设备列表来获取。
参考
- Elasticsearch数据搜索与分析实战