Skip to content

ELK-基础

ELK系统简介

ELK其实是Elasticsearch,Logstash 和 Kibana三个产品的首字母缩写,这三款都是开源产品。

  • ElasticSearch(简称ES),是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。
  • Logstash,是一个数据收集引擎,主要用于进行数据收集、解析,并将数据发送给ES。支持的数据源包括本地文件、ElasticSearch、MySQL、Kafka等等。
  • Kibana,为 Elasticsearch 提供了分析和 Web 可视化界面,并生成各种维度表格、图形。
mermaid
graph LR
    A["日志文件.log"] --> B["Logstash<br/>(日志采集)"] --> C["Elasticsearch<br/>(存储和搜索)"] --> D["Kibana<br/>(可视化和生成报表)"]
    
    style A fill:#ffc0cb,stroke:#333,stroke-width:2px
    style B fill:#ffff00,stroke:#333,stroke-width:2px
    style C fill:#4e8aee,stroke:#333,stroke-width:2px
    style D fill:#ff00ff,stroke:#333,stroke-width:2px

ELK 平台是一套完整的日志集中处理解决方案,将 Elasticsearch、Logstash 和 Kibana 三个开源工具配合使用,满足更强大的用户对日志的查询、排序、统计需求。其核心价值在于实现日志的集中化管理,解决了传统方式下日志分散、检索效率低、分析困难的问题,极大提高了运维效率、系统性能监控和安全性分析的能力

核心组件

Elasticsearch (ES)

官网:https://www.elastic.co/cn/

Elasticsearch 是 ELK 栈的核心,负责数据的存储、索引和检索。

  • 近实时 (NRT): 从文档索引到可搜索的延迟很短(通常约 1 秒)。
  • 集群 (Cluster) & 节点 (Node): 一个集群由一个或多个节点组成,共同存储数据并提供联合索引和搜索功能。节点是集群中的一台服务器。
  • 索引 (Index): 一类文档的集合(类似于关系型数据库中的“数据库”)。索引名称必须小写。
  • 文档 (Document): 可被索引的基本信息单元,以 JSON 格式表示(类似于关系型数据库中的“行”)。
  • 分片 (Shard) & 副本 (Replica): 索引可以被分成多个分片以实现水平扩展和并行操作。每个分片可以有零个或多个副本,提供高可用性。
关系型数据库Elasticsearch
数据库 (Database)索引 (Index)
表 (Table)类型 (Type) (7.x 版本后逐渐废弃)
行 (Row)文档 (Document)
列 (Column)字段 (Field)

Logstash

官网:https://www.elastic.co/cn/logstash

Logstash 是一个灵活的数据处理管道,工作流程分为三个阶段:

  1. Input (输入): 从各种数据源(如文件、数据库、消息队列、监控数据等)采集数据。
  2. Filter (过滤): 解析、转换和丰富数据。常用过滤器包括:
    • Grok: 解析非结构化的日志数据并将其结构化为有意义的字段。
    • Date: 解析日期字段。
    • Mutate: 修改字段,例如重命名、删除、替换。
  3. Output (输出): 将处理后的数据发送到目的地,最常见的是 Elasticsearch,也可以是其他存储或中间件。

Kibana

官网:https://www.elastic.co/cn/kibana

Kibana 是 Elasticsearch 数据的窗口,提供以下主要功能:

  • Discover: 交互式地探索和搜索 Elasticsearch 中的数据。
  • Visualize: 基于数据创建各种图表(柱状图、折线图、饼图等)、地图和图形。
  • Dashboard: 将多个可视化图形整合到一个仪表板中,进行综合展示和监控。
  • Canvas: 创建高度自定义的动态数据报告。
  • Machine Learning: 提供机器学习功能,用于异常检测。
  • Stack Management: 管理和管理 Elastic Stack 的功能。

Filebeat

官网:https://www.elastic.co/cn/beats/filebeat

轻量型日志采集器

Filebeat 是什么?

Filebeat 是用于转发和集中日志数据的轻量级传送程序。作为服务器上的代理安装,Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或Logstash进行索引。

工作原理

启动Filebeat时,它将启动一个或多个输入源,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器harvester进程。每个收集器harvester都读取一个日志以获取新内容,并将新日志数据发送到libbeatlibbeat会汇总事件并将汇总的数据发送到为Filebeat配置的输出。

Filebeat可以保持每个文件的状态,并且频繁地把文件状态从注册表里更新到磁盘。这里所说的文件状态是用来记录上一次Harvster读取文件时读取到的位置,以保证能把全部的日志数据都读取出来,然后发送给output。如果在某一时刻,作为output的ElasticSearch或者Logstash变成了不可用,Filebeat将会把最后的文件读取位置保存下来,直到output重新可用的时候,快速地恢复文件数据的读取。在Filebaet运行过程中,每个Prospector的状态信息都会保存在内存里。如果Filebeat出行了重启,完成重启之后,会从注册表文件里恢复重启之前的状态信息,让FIlebeat继续从之前已知的位置开始进行数据读取。

Filebeat 和 Logstash区别

logstash是jvm跑的,资源消耗比较大,启动一个logstash就至少需要消耗500M左右的内存(这就是为什么logstash启动特别慢的原因),而filebeat只需要10来M内存资源。常用的ELK日志采集方案中,大部分的做法就是将所有节点的日志内容通过filebeat发送到logstash,logstash根据配置文件进行过滤。然后将过滤之后的文件输送到elasticsearch中,通过kibana去展示。

Metricbeat

logstash是负责采集数据的,是入口,流向为logstash-> ES->kibana,但是它的资源消耗很大,有时候没那么多内存给他占用,同时有些定制的采集指标logstash无法满足。所以我们想使用轻量级的采集工具metricbeat来实现采集,流向为metricbeat-> ES->kibana,可以获取系统级的 CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据,还可针对系统上的每个进程获得与 top 命令类似的统计数据。同时Metricbeat 提供多种内部模块,用于从服务中收集指标,例如 Apache、NGINX、MongoDB、MySQL、PostgreSQL、Prometheus、Redis 等等。

ELK 工作流程

ELK 系统处理日志的典型流程可以概括为以下几步:

  1. 日志收集: 在各个应用服务器上,通过 Logstash 或更轻量的 Filebeat 等采集器监控并收集日志文件的变化。
  2. 日志处理与传输: 采集到的日志数据可以被直接或通过消息队列(如 Kafka)发送给 Logstash。Logstash 使用配置好的过滤器(如 Grok)对日志进行解析、清洗、格式转换,将其变成结构化的 JSON 数据。
  3. 存储与索引: 处理后的结构化数据被输出到 Elasticsearch 集群。Elasticsearch 会对数据进行索引和存储,建立倒排索引,以便实现快速搜索。
  4. 可视化与分析: 用户通过 Kibana 访问 Elasticsearch 中存储的数据,可以进行搜索、生成图表、构建实时监控仪表盘等操作。
mermaid
flowchart LR
    A[应用/系统日志] --> B[Filebeat<br>轻量级日志采集器]
    B -- 原始日志数据 --> C[Logstash<br>数据处理管道]
    C -- 已解析的结构化数据 --> D[Elasticsearch<br>存储与搜索引擎]
    D -- 数据查询与展示 --> E[Kibana<br>可视化平台]
    
    F[(消息队列<br>Kafka/Redis)] --> C
    B -- 原始日志数据 --> F

    style A fill:#ffc0cb,stroke:#333,stroke-width:2px
    style B fill:#ffff00,stroke:#333,stroke-width:2px
    style C fill:#90ee90,stroke:#333,stroke-width:2px
    style D fill:#0000ff,stroke:#333,stroke-width:2px,color:#fff
    style E fill:#ff00ff,stroke:#333,stroke-width:2px,color:#fff
    style F fill:#ffa500,stroke:#333,stroke-width:2px