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 缓冲层的典型架构。
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,由三个阶段组成:
- Input:定义数据来源(beats、kafka、file、syslog 等)。
- Filter:执行解析、转换、过滤(grok、mutate、date、geoip 等)。
- 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 节点承担不同角色。理解角色分工是后续索引生命周期管理的基础。
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 内置) | 根据策略迁移/删除索引 | 存储优化 / 成本控制 |