ES系列之Beats及Filebeat实战入门

概述

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有两种方案:

  1. 抛弃Logstash
  2. 保留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实例:

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配置如下:

yml 复制代码
output.logstash:
  hosts: ["localhost:5044"]

Logstash启动后会在5044端口(默认端口)监听Filebeat的输入,并接收采集到的日志文本,配置文件filebeat.conf

lua 复制代码
input {
  beats {
    port => 5044
  }
}
// 省略

输出到ES

filebeat.yml配置:

yml 复制代码
output.elasticsearch:
  hosts: ["localhost:9200"]

Filebeat的索引模板filebeat.template.json默认存放在/etc/filebeat文件夹中。配置输出数据到ES时,Filebeat在启动时会自动加载默认模板。如果需要加载另一种模板,则需要在filebeat.yml配置文件中修改相关配置:

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文件:

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文件

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配置文件:

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命令来查看:

yml 复制代码
Get-EventLog *

winlogbeat.yml配置文件:

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配置文件:

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数据搜索与分析实战
相关推荐
醉卧雕龙舫 、23 分钟前
二.springBoot项目集成ElasticSearch及使用
spring boot·elasticsearch
小汤猿人类4 小时前
ES关系映射(数据库中的表结构)
大数据·数据库·elasticsearch
Elastic 中国社区官方博客6 小时前
Elasticsearch 8.18 中提供了原生连接 (Native Joins)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elastic 中国社区官方博客10 小时前
如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据
大数据·数据库·elasticsearch·搜索引擎·全文检索·logstash
坤小满学Java10 小时前
【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)
elasticsearch
lqg_zone1 天前
Elasticvue-轻量级Elasticsearch可视化管理工具
大数据·elasticsearch·搜索引擎
lilye661 天前
程序化广告行业(88/89):广告创意审核的法律红线与平台规则
elasticsearch·zookeeper·memcached
Elasticsearch1 天前
Elasticsearch BBQ 与 OpenSearch FAISS:向量搜索性能对比
elasticsearch
小汤猿人类1 天前
docker安装ES
elasticsearch·docker·容器
Elastic 中国社区官方博客1 天前
Elasticsearch:AI 助理 - 从通才到专才
大数据·数据库·人工智能·神经网络·elasticsearch·搜索引擎·全文检索