ELK技术栈全套学习笔记(Elasticsearch+Logstash+Filebeat)

ELK技术栈全套学习笔记(Elasticsearch+Logstash+Filebeat)

一、ELK技术栈整体概述

ELK 是一套开源的分布式日志收集、清洗、存储、检索、可视化分析解决方案,核心由三大组件组成,各司其职、协同工作,是企业日志运维、实时数据分析、业务监控的核心技术栈。

  • Filebeat:轻量级日志采集器,部署在服务器端,负责采集各类日志文件、系统指标,资源占用极低,适配大规模集群。

  • Logstash:数据处理引擎,接收 Filebeat 采集的数据,完成过滤、清洗、解析、脱敏、字段转换等操作。

  • Elasticsearch(ES):分布式搜索分析引擎,存储 Logstash 处理后的结构化数据,提供毫秒级检索、聚合分析能力。

  • 补充:Kibana:可视化平台,用于查询 ES 数据、制作监控面板、日志检索、数据可视化展示。

标准数据流转链路:业务日志 → Filebeat(采集)→ Logstash(清洗处理)→ Elasticsearch(存储索引)→ Kibana(可视化查询分析)

二、Elasticsearch 7.x 核心详解

2.1 核心定位与核心能力

Elasticsearch 是基于 Apache Lucene 构建的开源分布式搜索分析引擎,专为海量结构化/非结构化数据设计,解决传统数据库在全文检索、实时聚合分析场景的性能瓶颈。

核心能力:毫秒级实时数据分析、全文检索、PB级海量数据存储、水平无限扩容、复杂聚合统计。

2.2 核心架构概念

核心概念 详细说明
节点(Node) ES 独立运行实例,分为主节点、数据节点、协调节点、预处理节点等角色,单节点可承担多角色
集群(Cluster) 多个节点组成的分布式集群,统一对外提供服务,保证高可用
索引(Index) 逻辑数据容器,类比传统数据库的数据表,7.x 版本废除多 type 设计,一个索引仅对应一种数据结构
分片(Shard) 数据最小存储单元,分为主分片(Primary)和副本分片(Replica),副本用于故障容错、读写负载分担

2.3 核心特性与优势

  1. 分布式高可用:基于 Raft 共识协议(7.x 替代旧版 Zen Discovery)管理集群,无单点故障,支持滚动扩容。

  2. 无固定表结构:Schema-free 设计,支持 JSON 文档存储,适配多变的日志数据格式。

  3. 高性能检索:基于倒排索引机制,全文检索速度远超传统数据库,支持 TF-IDF/BM25 评分算法。

  4. 实时读写:内存缓存+Translog 机制,实现数据秒级写入、毫秒级查询。

2.4 7.x 版本重大更新

  • 废除多 type 设计,简化数据模型,统一索引数据结构。

  • 重构集群协调层,移除 minimum_master_nodes 配置,内置 Raft 分布式共识算法。

  • Top-K 查询优化,节省30%堆内存,并发处理能力提升2倍。

  • 默认开启 TLS 通信,强化 RBAC 权限控制,提升集群安全性。

  • 新增稀疏字段、地理图形查询、Rank 特征字段等数据类型。

2.5 核心配置文件详解

2.5.1 核心配置文件路径
  • 主配置:/etc/elasticsearch/elasticsearch.yml

  • JVM 内存配置:/etc/elasticsearch/jvm.options

  • 日志配置:/etc/elasticsearch/log4j2.properties

2.5.2 elasticsearch.yml 核心配置(生产常用)
Plain 复制代码
# 集群基础配置
cluster.name: my-production-cluster  # 集群名称,同集群节点必须一致
node.name: ${HOSTNAME}               # 节点名称
node.attr.rack: r1                   # 自定义节点属性,用于分片分配

# 节点角色配置
node.master: true                    # 可作为主节点
node.data: true                      # 可存储数据
node.ingest: true                    # 开启数据预处理
node.ml: false                       # 关闭机器学习(需付费许可)

# 路径配置
path.data: /var/lib/elasticsearch    # 数据存储路径
path.logs: /var/log/elasticsearch    # 日志存储路径

# 网络配置
network.host: [_local_, _site_]      # 绑定本地及内网IP
http.port: 9200                      # 客户端访问端口
transport.port: 9300                 # 节点间通信端口

# 集群发现与引导
cluster.initial_master_nodes: ["master-node-1","master-node-2"]  # 初始主节点
discovery.seed_hosts: ["192.168.1.10:9300","192.168.1.11:9300"]

# 索引默认配置
index.number_of_shards: 3            # 默认主分片数
index.number_of_replicas: 1          # 默认副本分片数

# 磁盘水位线(防止磁盘爆满)
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%

# 生产必配:禁用swap,提升性能
bootstrap.memory_lock: true

# 安全配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
2.5.3 jvm.options 核心配置

核心原则:堆内存 Xms/Xmx 必须一致,生产环境建议不超过物理内存的50%,最大不超过31G。

Plain 复制代码
# 内存配置
-Xms4g
-Xmx4g
# 垃圾回收配置
-XX:+UseG1GC
-XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30
# 异常日志配置
-XX:+HeapDumpOnOutOfMemoryError
-Dlog4j2.disable.jmx=true

2.6 生产环境部署检查清单

  • 禁用 Swap 分区,开启内存锁 bootstrap.memory_lock: true

  • 拆分节点角色(主节点、数据节点、协调节点分离)

  • 开启 SSL 加密通信、RBAC 权限管控

  • 文件描述符数量大于65536

  • 数据目录权限仅 elasticsearch 用户可访问

  • 配置索引快照备份策略

2.7 常用集群操作命令

Plain 复制代码
# 查看集群健康状态
curl -XGET "localhost:9200/_cluster/health?pretty"

# 查看集群节点状态
curl -XGET "localhost:9200/_cat/nodes?v"

# 创建自定义索引
curl -XPUT "localhost:9200/my-index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}'

# 批量写入数据
curl -XPOST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
'

三、Logstash 核心详解

3.1 核心作用

Logstash 是开源数据采集处理引擎,核心负责多源数据接收、数据清洗、格式解析、字段转换、数据脱敏、路由分发,承接 Filebeat 采集的原始日志,输出结构化数据到 Elasticsearch。

三大核心特性:数据源多样化、数据处理灵活、输出目标可配置。

3.2 核心配置结构(三段式)

所有 Logstash 配置文件均由 **input(输入)、filter(过滤处理)、output(输出)**三部分组成,缺一不可。

3.2.1 input 输入模块(定义数据来源)

支持文件、TCP/UDP、Kafka、MySQL、Beats、HTTP 等多种数据源,生产最常用 beats 插件(对接 Filebeat)。

Plain 复制代码
# 对接Filebeat输入配置
input {
  beats {
    port => 5044  # 固定端口,与Filebeat输出端口一致
  }
}

# 文件输入配置
input {
  file {
    path => "/var/log/nginx/*.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"  # 不记录读取位置,每次从头读取
  }
}
3.2.2 filter 过滤模块(核心数据处理)

用于解析日志、提取字段、修改数据、过滤无效数据,是 Logstash 最核心的功能模块。

Plain 复制代码
filter {
  # grok:解析非结构化日志,提取自定义字段(最常用)
  grok {
    match => { "message" => '%{IPORHOST:clientip} - %{USERNAME:ident} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request}" %{NUMBER:response}' }
  }
  # date:格式化时间戳
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"
  }
  # mutate:字段修改、类型转换、字段删除
  mutate {
    convert => { "response" => "integer" }  # 字符串转数字
    remove_field => ["message"]  # 删除原始日志字段
  }
}
3.2.3 output 输出模块(定义数据去向)

支持输出到 Elasticsearch、Kafka、Redis、文件、控制台,生产核心输出 ES,控制台输出用于调试。

Plain 复制代码
output {
  # 按标签分类输出到不同ES索引
  if "nginx1" in [tags] {
    elasticsearch {
      hosts => ["192.168.166.9:9200"]
      index => "nginx1-%{+YYYY.MM.dd}"  # 按天自动分索引
    }
  }
  if "nginx2" in [tags] {
    elasticsearch {
      hosts => ["192.168.166.9:9200"]
      index => "nginx2-%{+YYYY.MM.dd}"
    }
  }
  # 调试:控制台输出结构化日志
  stdout {
    codec => rubydebug
  }
}

3.3 常用核心插件

3.3.1 输入插件
  • beats:对接 Filebeat/Metricbeat,生产首选,轻量高效。

  • file:直接读取服务器本地日志文件。

  • jdbc:对接 MySQL、Oracle 等数据库,同步业务数据。

  • kafka:消费 Kafka 消息队列数据,适配高并发场景。

3.3.2 过滤插件
  • grok:正则解析非结构化日志,自定义提取字段。

  • date:校正日志时间戳,统一 ES 时间格式。

  • mutate:字段增删、类型转换、字符串替换、数据修改。

  • json:解析 JSON 格式日志,自动拆分字段。

3.3.3 输出插件
  • elasticsearch:核心输出,对接 ES 存储数据。

  • stdout:控制台输出,仅用于测试调试。

  • kafka/redis:数据中转,削峰填谷。

3.4 条件判断语法

用于实现数据分流、精准过滤,支持 if/unless、多条件组合、正则匹配。

Plain 复制代码
# 1、基础if判断
if [level] == "ERROR" {
  mutate { add_tag => ["error_log"] }
}

# 2、正则匹配
if [message] =~ /timeout|refuse/ {
  mutate { add_tag => ["exception"] }
}

# 3、多条件与或判断
if ([level] == "WARN" && [status] > 500) || [ip] == "127.0.0.1" {
  drop { }  # 丢弃无效日志
}

# 4、unless反向判断
unless [service] == "nginx" {
  drop { }
}

四、Filebeat 核心详解

4.1 核心定位

Filebeat 是 Elastic 官方轻量级日志采集器,专为轻量化、低资源、高稳定设计,部署在所有业务服务器节点,替代 Logstash 做前端采集,避免资源占用过高影响业务。

核心优势:内存占用极低、支持断点续传、自动监控日志文件新增内容、支持标签分类、适配容器化环境。

4.2 完整核心配置

Filebeat 核心流程:采集日志 → 打标签分类 → 输出到 Logstash/Elasticsearch/Kafka

Plain 复制代码
# 1、日志采集配置
filebeat.inputs:
- type: filestream
  paths:
    - /var/log/nginx/*.log  # 采集的日志路径
  exclude_files: [".gz"]     # 排除压缩日志
  start_position: beginning  # 首次启动从头读取
  tags: ["nginx1"]          # 自定义标签,用于Logstash分流

# 2、输出配置(优先输出到Logstash)
output.logstash:
  hosts: ["192.168.166.9:5044"]  # 对接Logstash监听端口
  bulk_max_size: 2048            # 批量发送条数
  compression_level: 3            # 数据压缩级别

# 3、备选:直接输出到ES(无需Logstash)
# output.elasticsearch:
#   hosts: ["localhost:9200"]
#   index: "nginx-direct-%{+YYYY.MM.dd}"

# 4、日志配置
logging.level: info
logging.to_files: true
logging.files.path: /var/log/filebeat
logging.files.keepfiles: 7

4.3 常用内置变量(日志字段提取)

可直接用于索引命名、字段自定义、日志标记,是ELK自定义日志格式的核心变量:

  1. {@timestamp}:日志事件标准时间戳

  2. {host.name}:日志采集主机名

  3. {message}:日志原始内容

  4. {log.file.path}:日志文件绝对路径

  5. {+yyyy.MM.dd}:年月日时间格式(用于按天分索引)

  6. {fields.custom_field}:自定义扩展字段

  7. {container.id}/{container.name}:容器日志专属变量

4.4 核心特性

  • 断点续传:自动记录日志读取位置,重启后不会重复采集、不会漏采。

  • 自动轮转适配:支持日志切割、压缩、新增文件自动识别。

  • 标签分流:通过自定义标签,实现不同业务日志分类传输。

  • 低资源消耗:单节点可支撑10万+/秒日志采集,CPU内存占用可忽略。

五、ELK 完整实战工作流程

  1. 采集阶段:业务服务器部署 Filebeat,采集 Nginx、应用、系统日志,添加业务标签。

  2. 传输阶段:Filebeat 将原始日志批量发送至 Logstash 5044 端口。

  3. 清洗阶段:Logstash 通过 grok 解析日志、校正时间、转换字段、过滤无效数据。

  4. 分流存储:根据日志标签,将不同业务日志写入 ES 不同日期索引。

  5. 可视化分析:Kibana 读取 ES 索引数据,实现日志检索、异常监控、数据统计可视化。

六、核心知识点总结

  1. 组件分工核心:Filebeat 只管采集、Logstash 只管清洗、ES 只管存储检索、Kibana 只管可视化。

  2. 生产最佳架构:Filebeat + Logstash + ES 集群,解耦采集与清洗,适配高并发、大规模日志场景。

  3. 7.x 关键变化:废除多 type、Raft 集群协议、默认安全加密、性能大幅优化。

  4. 性能优化核心:ES 禁用 Swap、JVM 内存均衡、日志按天分索引、批量传输数据。

  5. 故障保障:ES 副本分片容错、Filebeat 断点续传、集群多节点高可用。

相关推荐
婷婷_1724 小时前
【PCIe 验证每日学习・Day36】PCIe 存储器寻址空间与 BAR 底层原理
网络·学习·程序人生·芯片·pcie
.千余4 小时前
【Linux 】网络基础1
linux·运维·服务器·开发语言·网络·学习
つ安静与叛逆的小籹人4 小时前
小红书笔记详情API实战总结(技术复盘)
笔记
sheeta19984 小时前
LeetCode 每日一题笔记 日期:2026.05.16 题目:154. 寻找旋转排序数组中的最小值 II
笔记·算法·leetcode
玄米乌龙茶1234 小时前
从 Token 到 API 调用: LLM 实战笔记
笔记
qeen874 小时前
【算法笔记】各种常见排序算法详细解析(下)
c语言·数据结构·c++·笔记·学习·算法·排序算法
Restart-AHTCM4 小时前
LangChain学习之环境搭建与基础概念(1/8)
学习·langchain
GEO从入门到精通4 小时前
GEO学习是学理论还是学工具操作?
学习
星幻元宇VR5 小时前
VR施工安全行走平台,沉浸式建筑安全培训新模式
科技·学习·安全·vr·虚拟现实