[TOC]

0x00 前言简述

描述: 读者在学习本章时可能听过EFK或者ELK来搭建一套开源实时日志采集分析系统, 但针对于ELFK架构可能有点懵,实际上他就是前面两种解决方案的集合(自命名)。


Q: ELK 与 EFK 解决方案

  • 1) 什么是 ELK Stack?
    • 答:“ELK”是三个开源项目的首字母缩写,这三个项目分别是 Elasticsearch、Logstash 和 Kibana(ELK技术栈), 它是现阶段众多企业单位都在使用的一种日志分析系统, 这三个产品被设计成一个集成解决方案称为”Elastic Stack“ 是 ELK Stack 的更新换代产品。 (官方)
WeiyiGeek.Elastic Stack

WeiyiGeek.Elastic Stack

  • 2) 什么是 EFK?
    • 答: EFK也是三个开源项目的首字母缩写技术栈,这三个项目分别是 Elasticsearch、Fluentd 和 Kibana,它是现阶段用于替代ELK的最佳方案。
WeiyiGeek.EFK架构

WeiyiGeek.EFK架构


1.ELFK介绍

Q: 什么是ELFK?
答:ELFK 是一整套解决方案,是四个软件产品的首字母缩写Elasticsearch、Logstash、Fluentd和 Kibana,这四款软件都是开源产品通常是配合使用的集成解决方案,简称为 ELFK 协议栈。


ELFK 组成简介

  • 1) Elasticsearch 英 [ɪˈlæstɪk] 英 [sɜːtʃ]: 是Java开发的一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎分析引擎,具有HTTP Web接口和无模式JSON文档,是在Apache许可证下作为开源软件发布【主要是存储与分析数据】。

    • PS : Elasticsearch 是最受欢迎的企业搜索引擎,其次是Apache Solr也是基于Lucene。
    • 官网地址: https://www.elastic.co/
  • 2) Logstash 英 [lɒɡ] 英 [stæʃ]: 主要是用来日志的搜集、分析、过滤日志的工具(数据收集引擎),支持大量的数据获取方式以及支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作然后存储到用户指定的位置。【主要是收集和过滤数据】

    • PS : 其工作方式为c/s架构client端安装在需要收集日志的主机上,而server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
    • PS : 其替代产品为ilebeat 轻量级数据收集引擎。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder 也是 ELK Stack 在 Agent 的第一选择
  • 3) Fluentd : 和Logstash一样属于日志收集处理工具也是一个开源的数据收集器,专为处理数据流设计,使用JSON作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发。

  • 4) Kibana : 是一个开源和免费的工具Kibana 可以为 Logstash、Fluentd和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。【可视化和管理】


Q: 为什么要使用ELFK?它能解决那些问题?


常用架构解决方案

常用的ELK/EFK架构

基础架构:
1/ Kibana—->elasticsearch—->Logstash(收集)
2/ Kibana—->elasticsearch—->filebeat(收集)
3/ Kibana—->elasticsearch—->Logstash(过滤)—->filebeat(收集)

扩展架构:
1/ Kibana—->elasticsearch—->Logstash(过滤)—->redis(缓存)—->Logstash(收集)
2/ Kibana—->elasticsearch—->Logstash(过滤)—->redis(缓存)—->filebeat(收集)
3/ Kibana—->elasticsearch—->Logstash(过滤)—->redis(缓存)—->Logstash(转发)—-filebeat(收集)


https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

0x01 ELK 安装

安装流程

  • (1) 简单启动一下把镜像运行容器里面的的配置文件分别拷贝到/app/{elastic,kibana}

    1
    2
    3
    4
    docker run --rm --name elastic docker.elastic.co/elasticsearch/elasticsearch:7.13.1
    docker run --rm --name kibana docker.elastic.co/kibana/kibana:7.13.1
    docker cp elastic:/usr/share/elasticsearch/config/elasticsearch.yml /app/elastic/
    docker cp kibana:/usr/share/kibana/config/kibana.yml /app/kibana/
  • (2) 分别在配置文件中将elastic、kibana的x-pack功能开启认证(重要)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    tee elasticsearch.yml <<'EOF'
    cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    EOF

    tee kibana.yml <<'EOF'
    # Default Kibana configuration for docker target
    server.name: "kibana"
    server.host: "0.0.0.0"
    elasticsearch.hosts: [ "http://elasticsearch:9200" ]
    elasticsearch.username: "elastic"
    elasticsearch.password: "weiyigeek"
    monitoring.ui.container.elasticsearch.enabled: true
    # change locale zh-CN
    i18n.locale: zh-CN
    EOF
  • (3) 创建自定义桥接网络以及启动容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    docker create network elastic
    docker run -d --name elastic \
    --network elastic \
    -p 9200:9200 -p 9300:9300 \
    -e "node.name=elastic-single" \
    -e "discovery.type=single-node" \
    -v /app/elastic/data:/usr/share/elasticsearch/data \
    -v /app/elastic/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    docker.elastic.co/elasticsearch/elasticsearch:7.13.1

    docker run -d --name kibana \
    --network elastic \
    -p 5601:5601 \
    -e "ELASTICSEARCH_HOSTS=http://elastic:9200" \
    -v /app/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
    -v /app/kibana/data:/usr/share/elasticsearch/data \
    docker.elastic.co/kibana/kibana:7.13.1

    # -e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" \
    # 容器启动状态查看
    $ docker stats kibana elastic
    CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
    e01fa7403823 kibana 0.14% 263.8MiB / 15.64GiB 1.65% 232kB / 3.43MB 0B / 0B 19
    9f90fe28213c elastic 0.00% 1.427GiB / 15.64GiB 9.13% 3.18MB / 219kB 0B / 12MB 90
  • (4) 设置elasticsear系统相关账号的认证密码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $ docker exec -it elastic bash
    [[email protected] elasticsearch]# bin/elasticsearch-setup-passwords interactive
    Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
    You will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to continue [y/N]y
    Enter password for [elastic]: # weiyigeek 此处测试我们全部设置为相同的
    Reenter password for [elastic]:
    Enter password for [apm_system]:
    Reenter password for [apm_system]:
    Enter password for [kibana_system]:
    Reenter password for [kibana_system]:
    Enter password for [logstash_system]:
    Reenter password for [logstash_system]:
    Enter password for [beats_system]:
    Reenter password for [beats_system]:
    Enter password for [remote_monitoring_user]:
    Reenter password for [remote_monitoring_user]:
    Changed password for user [apm_system]
    Changed password for user [kibana_system]
    Changed password for user [kibana]
    Changed password for user [logstash_system]
    Changed password for user [beats_system]
    Changed password for user [remote_monitoring_user]
    Changed password for user [elastic]
  • (5) 分别访问elastic(http://192.168.12.111:9200/)和Kibana(http://192.168.12.111:5601)服务进行查看是否正常

WeiyiGeek.登陆验证测试

WeiyiGeek.登陆验证测试

0x01 配置文件解析

kibana.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# - 服务监控地址与服务名称
server.host: "0.0.0.0"
server.name: "kibana01"
# - 配置kibana启用SSL
server.ssl.enabled: true
server.ssl.certificate: ${CERTS_DIR_KIBANA}/kibana01/kibana01.crt
server.ssl.key: ${CERTS_DIR_KIBANA}/kibana01/kibana01.key

# - 绑定es主机地址,注意配置ssl认证后此处需用https请求
elasticsearch.hosts: ["https://elasticsearch:9200"]
# - es主机地址认证账号密码设置
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
# - es配置了ssl认证后需指定证书路径,此处指定用于 Elasticsearch 实例的 PEM 证书文件路径
elasticsearch.ssl.certificateAuthorities: ["${CERTS_DIR_KIBANA}/ca/ca.crt"]

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.1-amd64.deb
sudo dpkg -i filebeat-7.13.1-amd64.deb

Windows 事件日志

从 Windows 事件日志提取日志。
1.从下载页面下载 Winlogbeat Windows zip 文件。 2.将该 zip 文件的内容解压缩到 C:\Program Files。 3.将 winlogbeat-7.13.1-windows 目录重命名为 Winlogbeat。 4.以管理员身份打开 PowerShell 提示符 (右键单击 PowerShell 图标,然后选择以管理员身份运行) 。如果运行的是 Windows XP,则可能需要下载并安装 PowerShell。 5.从 PowerShell 提示符处,运行以下命令以将 Winlogbeat 安装为 Windows 服务。

http://192.168.12.111:5601/app/home#/tutorial/windowsEventLogs

version: ‘3.2’
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.1
container_name: elastic-single
environment:

  - node.name=elastic-single
  - discovery.type=single-node
  - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
  memlock:
    soft: -1
    hard: -1
volumes:
  - data01:/usr/share/elasticsearch/data
ports:
  - 9200:9200
networks:
  - elastic

network:
elastic
`

回到顶部
一、filebeat是什么
1.1、filebeat和beats的关系

  首先filebeat是Beats中的一员。
  Beats在是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。
目前Beats包含六种工具:

Packetbeat:网络数据(收集网络流量数据)
Metricbeat:指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
Filebeat:日志文件(收集文件数据)
Winlogbeat:windows事件日志(收集Windows事件日志数据)
Auditbeat:审计数据(收集审计日志)
Heartbeat:运行时间监控(收集系统运行时的数据)

1.2、filebeat是什么

  Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。

  Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

工作的流程图如下:

1.3、filebeat和logstash的关系

  因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

回到顶部
二、filebeat原理是什么
2.1、filebeat的构成

  filebeat结构:由两个组件构成,分别是inputs(输入)和harvesters(收集器),这些组件一起工作来跟踪文件并将事件数据发送到您指定的输出,harvester负责读取单个文件的内容。harvester逐行读取每个文件,并将内容发送到输出。为每个文件启动一个harvester。harvester负责打开和关闭文件,这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空间一直保留到harvester关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive

关闭harvester可以会产生的结果:

文件处理程序关闭,如果harvester仍在读取文件时被删除,则释放底层资源。
只有在scan_frequency结束之后,才会再次启动文件的收集。
如果该文件在harvester关闭时被移动或删除,该文件的收集将不会继续

  一个input负责管理harvesters和寻找所有来源读取。如果input类型是log,则input将查找驱动器上与定义的路径匹配的所有文件,并为每个文件启动一个harvester。每个input在它自己的Go进程中运行,Filebeat当前支持多种输入类型。每个输入类型可以定义多次。日志输入检查每个文件,以查看是否需要启动harvester、是否已经在运行harvester或是否可以忽略该文件
2.2、filebeat如何保存文件的状态

  Filebeat保留每个文件的状态,并经常将状态刷新到磁盘中的注册表文件中。该状态用于记住harvester读取的最后一个偏移量,并确保发送所有日志行。如果无法访问输出(如Elasticsearch或Logstash),Filebeat将跟踪最后发送的行,并在输出再次可用时继续读取文件。当Filebeat运行时,每个输入的状态信息也保存在内存中。当Filebeat重新启动时,来自注册表文件的数据用于重建状态,Filebeat在最后一个已知位置继续每个harvester。对于每个输入,Filebeat都会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以标识文件。对于每个文件,Filebeat存储唯一的标识符,以检测文件是否以前被捕获。
2.3、filebeat何如保证至少一次数据消费

  Filebeat保证事件将至少传递到配置的输出一次,并且不会丢失数据。是因为它将每个事件的传递状态存储在注册表文件中。在已定义的输出被阻止且未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到输出确认已接收到事件为止。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。当Filebeat重新启动时,将再次将Filebeat关闭前未确认的所有事件发送到输出。这样可以确保每个事件至少发送一次,但最终可能会有重复的事件发送到输出。通过设置shutdown_timeout选项,可以将Filebeat配置为在关机前等待特定时间

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全,从而及时采取措施纠正错误。

Beats 是数据采集的得力工具。将 Beats 和您的容器一起置于服务器上,或者将 Beats 作为函数加以部署,然后便可在 Elastisearch 中集中处理数据。如果需要更加强大的处理性能,Beats 还能将数据输送到 Logstash 进行转换和解析。

Elasticsearch 通常与 Kibana 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 允许你通过 web 界面来浏览 Elasticsearch 日志数据。

EFK 架构图:

WeiyiGeek.ELK架构

WeiyiGeek.ELK架构

EFK(Elasticsearch+Filebeat+Kibana)收集容器日志

https://blog.csdn.net/qq_25934401/article/details/83345144
https://www.cnblogs.com/zsql/p/13137833.html

【摘要】 ELK在运维监控领域使用非常广泛,日志采集通常依靠Logstash,但是通常来讲Logstash架构比较重载,一个安装包由几百MB,相比之下Elastic还提供另一种更轻量的采集工具Beats。Beats 平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。

ELK在运维监控领域使用非常广泛,日志采集通常依靠Logstash,但是通常来讲Logstash架构比较重载,一个安装包由几百MB,相比之下Elastic还提供另一种更轻量的采集工具Beats。Beats 平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。本文简要介绍一下使用Winlogbeat收集Windows日志,并用ES + Kibana检索的配置方法。

elfk 的搭建
filebeat 读取多日志,并打上不同的 tag 来进行区分
logstash 过滤日志,创建不同的动态索引,邮件报警等
elasticsearch 的索引生命周期管理,索引的删除,及我遇见的问题
kibana 的简单使用,包括查询、创建可视图、一些简单的设置

​当然了,elfk 的水太深,研究了将近一个月也就是简单的入门,还有更多的设置但入门足以。当然了,要是感觉写的还凑合,微信搜索 苦逼小码农 关注我的微信公众号。