2. ELK 核心组件回顾:Elasticsearch、Logstash、Kibana、Filebeat/Beats 家族的核心功能与数据流架构

在深入索引生命周期管理与存储优化之前,必须重新梳理 ELK 技术栈中每个组件的职责边界与协作方式。生产环境中常见的误区是将 Logstash 当作万能采集器,或将 Elasticsearch 的写入节点与协调节点混为一谈。本节从核心功能、数据流架构、组件对比三个维度进行回顾,为后续的准入控制与存储策略奠定基础。

2.1 组件核心功能与定位

组件 核心功能 输入/输出协议 典型部署位置 资源敏感度
Elasticsearch 分布式存储、全文检索、聚合分析 RESTful API (HTTP/HTTPS) 服务器集群 高(内存、磁盘 I/O)
Logstash 数据采集、解析、转换、路由 多种 Input/Output 插件 服务器或容器 中(CPU、内存)
Kibana 可视化、仪表盘、监控管理 浏览器 → Elasticsearch API 服务器或容器 低(主要依赖浏览器)
Filebeat 轻量级日志文件采集、转发 文件 → Logstash/ES/Kafka 业务服务器 极低(CPU、内存)
Metricbeat 系统/服务指标采集 系统 API → Logstash/ES 业务服务器 低
Winlogbeat Windows 事件日志采集 Windows Event Log → ES Windows 服务器 低
架构选型提示: 在日志检索准入场景中,Filebeat 是推荐的采集层首选。它资源占用极低(通常 10-50MB 内存),且原生支持背压机制,不会因后端阻塞导致业务进程崩溃。Logstash 应作为集中式解析层,而非采集层。

2.2 数据流架构:从采集到可视化的完整链路

一个标准的生产级 ELK 数据流包含四个阶段:采集 → 缓冲/传输 → 解析/转换 → 存储/检索。下图展示了包含可选 Kafka 缓冲层的典型架构。

ELK 数据流架构图 ELK 数据流架构(含 Kafka 缓冲层) Filebeat / Beats 日志文件 / 系统指标 Kafka(可选) 削峰填谷 / 解耦 Logstash Grok / 过滤 / 转换 Elasticsearch 分片 / 副本 / 索引 Kibana 仪表盘 / 告警 / 管理 数据流说明: 1. Beats 采集日志/指标,通过轻量协议发送至 Logstash 或直接写入 ES。 2. 可选 Kafka 作为缓冲层,应对突发流量,防止 Logstash 或 ES 过载。 3. Logstash 执行 Grok 解析、字段过滤、类型转换,输出到 ES 指定索引。 4. Kibana 通过 ES REST API 查询数据,生成可视化与告警规则。

2.3 Beats 家族对比与选型

Beats 是 Elastic 官方提供的轻量级数据采集器家族。在日志检索准入场景中,Filebeat 是主力,但其他 Beats 在特定场景下不可或缺。

Beats 名称 采集数据类型 默认端口 典型使用场景 与 Logstash 配合
Filebeat 日志文件 5044 应用日志、系统日志、容器日志 推荐:Filebeat → Logstash → ES
Metricbeat 系统/服务指标 5066 CPU、内存、磁盘、网络、MySQL/Redis 可直接写入 ES 或经 Logstash
Winlogbeat Windows 事件日志 5044 安全审计、AD 域控日志 推荐经 Logstash 解析
Packetbeat 网络数据包 5066 HTTP/DNS/MySQL 协议分析 可直接写入 ES
Heartbeat 服务可用性探测 5066 ICMP/TCP/HTTP 健康检查 可直接写入 ES
Auditbeat 系统审计数据 5066 文件完整性、用户登录审计 推荐经 Logstash
避坑提醒: 不要在生产环境中使用 Filebeat 的 multiline 模式处理大量多行日志(如 Java 堆栈)。这会导致 Filebeat 内存飙升。正确的做法是将原始日志先发送到 Logstash,使用 Logstash 的 multiline codec 进行合并,Filebeat 只负责逐行采集。

2.4 Logstash Pipeline 核心机制

Logstash 的数据处理单元是 Pipeline,由三个阶段组成:

  1. Input:定义数据来源(beats、kafka、file、syslog 等)。
  2. Filter:执行解析、转换、过滤(grok、mutate、date、geoip 等)。
  3. Output:定义数据去向(elasticsearch、kafka、file 等)。

以下是一个生产级 Pipeline 配置示例,展示如何将 Filebeat 采集的 Nginx 日志解析后写入 ES:

input {
  beats {
    port => 5044
    client_inactivity_timeout => 60
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"
  }
  mutate {
    remove_field => [ "message", "original" ]
    convert => { "response" => "integer" }
  }
}

output {
  elasticsearch {
    hosts => ["http://es-node1:9200", "http://es-node2:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
    user => "logstash_writer"
    password => "${ES_PWD}"
    manage_template => false
  }
}
性能要点: Logstash 的 filter 阶段是 CPU 密集型操作。当每秒日志量超过 5000 条时,建议启用 pipeline.workers 参数(默认等于 CPU 核数),并考虑引入 Kafka 作为缓冲层,避免 Logstash 直接面对采集端的突发流量。

2.5 Elasticsearch 节点角色与数据分布

在 ELK 集群中,Elasticsearch 节点承担不同角色。理解角色分工是后续索引生命周期管理的基础。

Elasticsearch 节点角色与数据分布 Elasticsearch 节点角色与数据分布 协调节点 (Coordinating) 接收请求 / 分发 / 合并结果 数据节点 (Data) 存储分片 / 执行查询 / 写入 主节点 (Master) 集群状态管理 / 分片分配 主分片 P0 副本分片 R1 副本分片 R0 主分片 P1 关键原则:主分片数在索引创建后不可修改;副本分片数可动态调整。在 ILM 热-温-冷架构中, 热节点使用 SSD + 高副本,冷节点使用 HDD + 低副本,以平衡性能与存储成本。

2.6 Kibana 在准入控制中的角色

Kibana 不仅是可视化工具,在日志检索准入场景中,它承担以下关键职责:

  • 索引模式管理:定义可检索的索引范围,支持通配符匹配。
  • ILM 策略可视化配置:在 Stack Management → Index Lifecycle Policies 中创建热-温-冷-删除策略。
  • 角色与权限控制:通过 Space、Role、User 实现多租户隔离。
  • 告警与监控:基于 Elasticsearch 查询结果触发告警,监控集群健康状态。
  • Dev Tools:直接执行 REST API 调试,验证索引映射与查询性能。
实战建议: 在准入控制场景中,建议在 Kibana 中创建至少三个 Space:admin(集群管理)、ops(运维查看)、audit(审计只读)。每个 Space 绑定独立的索引模式,避免跨租户数据泄露。

2.7 组件协作总结

ELK 各组件的协作关系可以概括为以下流程:

步骤 组件 动作 输出
1 Filebeat 读取日志文件,按行发送 JSON 格式事件流
2 Logstash 接收 Beats 数据,执行 Grok 解析 结构化文档
3 Elasticsearch 写入索引,建立倒排索引 可检索的文档存储
4 Kibana 查询 ES,渲染可视化 仪表盘 / 告警
5 ILM (ES 内置) 根据策略迁移/删除索引 存储优化 / 成本控制