ELK Stack 是业界最主流的日志收集、分析与可视化解决方案,由 Elasticsearch + Logstash + Kibana 三大核心组件组成(后加入 Beats,现称 Elastic Stack)。
一、ELK 核心组件详解
1. Elasticsearch(ES)— 分布式搜索引擎
-
角色:存储、索引、搜索日志数据
-
核心特性:
- 分布式架构(自动分片、副本、集群发现)
- 近实时搜索(< 1 秒延迟)
- RESTful API(
GET /index/_search) - 基于 Lucene,支持全文检索、聚合分析
-
关键概念:
术语 说明 Index(索引) 类似数据库中的“表”,如 nginx-access-2026.04.10Document(文档) 一条 JSON 格式的日志记录 Shard(分片) 索引的物理分片,支持水平扩展 Replica(副本) 分片的备份,提供高可用
2. Logstash — 数据处理管道
-
角色:日志收集、过滤、转换、输出
-
三阶段架构:
graph LR Input --> Filter --> Output -
常用插件:
-
Input:
file(读文件)、beats(接收 Filebeat 数据)、kafka -
Filter:
grok:正则解析非结构化日志(如 Nginx 日志)date:解析时间戳并覆盖@timestampmutate:重命名/删除字段
-
Output:
elasticsearch、kafka、stdout
-
3. Kibana — 数据可视化平台
-
角色:查询、分析、可视化 ES 中的数据
-
核心功能:
- Discover:交互式日志探索
- Visualize:创建柱状图、饼图、地图等
- Dashboard:组合多个图表形成监控面板
- Dev Tools:直接调用 ES API(类似 Postman)
4. Beats — 轻量级数据采集器(ELK 的“眼睛”)
-
为什么需要 Beats?
Logstash 资源消耗大,不适合部署在每台服务器上。 -
常见 Beats:
Beat 用途 Filebeat 收集日志文件(替代 Logstash 的 file input) Metricbeat 收集系统指标(CPU、内存、磁盘) Packetbeat 网络流量分析(解析 HTTP/MySQL 等协议) Auditbeat 审计日志(Linux auditd)
✅ 现代 ELK 架构演进:
Filebeat → Logstash(可选) → Elasticsearch ← Kibana
(Logstash 可省略,Filebeat 直接写入 ES,但失去复杂过滤能力)
二、基础配置示例
场景:收集 Nginx 访问日志
1. Filebeat 配置(filebeat.yml)
filebeat.inputs:
- type: filestream
paths:
- /var/log/nginx/access.log
output.logstash:
hosts: ["logstash-server:5044"] # 发送给 Logstash
# 或直接输出到 ES(跳过 Logstash):
# output.elasticsearch:
# hosts: ["es-server:9200"]
2. Logstash 配置(nginx.conf)
input {
beats {
port => 5044
}
}
filter {
# 解析 Nginx 日志(格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent")
grok {
match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} [%{HTTPDATE:timestamp}] "%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:status} %{NUMBER:bytes}" }
}
# 将 timestamp 字段转为 @timestamp
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
# 删除原始 message 字段(节省存储)
mutate {
remove_field => ["message", "timestamp"]
}
}
output {
elasticsearch {
hosts => ["http://es-server:9200"]
index => "nginx-access-%{+YYYY.MM.dd}" # 按天建索引
}
}
3. Elasticsearch 配置要点(elasticsearch.yml)
cluster.name: my-elk-cluster
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["node-1", "node-2"] # 集群发现
cluster.initial_master_nodes: ["node-1"] # 首次启动主节点
4. Kibana 配置(kibana.yml)
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es-server:9200"]
三、常见面试重点(附答案思路)
1. ELK 和传统日志方案(如 Splunk)的区别?
- 开源 vs 商业:ELK 免费开源,Splunk 按数据量收费。
- 灵活性:ELK 组件可替换(如用 Fluentd 代替 Logstash),Splunk 是封闭生态。
- 资源消耗:ELK 对硬件要求较高(尤其 ES),Splunk 优化更好但成本高。
2. 如何优化 Elasticsearch 性能?
-
索引设计:
- 按时间分索引(
logs-2026.04.10),便于冷热分离 - 设置合理的
refresh_interval(默认 1s,可调大至 30s 提升写入吞吐)
- 按时间分索引(
-
硬件层面:
- 使用 SSD 存储
- 堆内存不超过 32GB(避免指针压缩失效)
-
查询优化:
- 避免
wildcard查询,用keyword类型字段 - 聚合时使用
composite而非terms(防内存溢出)
- 避免
3. Filebeat 和 Logstash 如何选型?
-
用 Filebeat 当:
- 仅需简单收集日志(无复杂解析)
- 服务器资源紧张(Filebeat 内存 < 50MB)
-
用 Logstash 当:
- 需要多数据源合并(如日志 + 数据库)
- 需要复杂 ETL(如调用外部 API 补充数据)
4. 如何处理日志量突增导致 ES 崩溃?
-
缓冲层:在 Filebeat 和 ES 之间加入 Kafka,削峰填谷
-
限流:在 Logstash 中设置
pipeline.batch.size控制批次大小 -
冷热架构:
- 热节点:SSD + 高 CPU,处理近期数据
- 冷节点:HDD + 低配,存储历史数据
- 使用 ILM(Index Lifecycle Management)自动迁移
5. Grok 正则匹配失败怎么办?
-
调试工具:
- Kibana 自带 Grok Debugger
- 在线工具:grokdebug.herokuapp.com/
-
最佳实践:
- 从简单模式开始逐步增加字段
- 使用预定义模式(如
%{COMBINEDAPACHELOG}) - 失败时保留
_grokparsefailure标签,便于后续修复
6. 如何保证日志不丢失?
- Filebeat:启用
acknowledgements(确保 ES 确认后才删除 registry 文件) - Logstash:使用持久化队列(
queue.type: persisted) - ES:设置副本数 ≥ 2,避免单点故障
四、高级话题(加分项)
1. 安全加固
- X-Pack:开启认证(用户名/密码)、TLS 加密通信
- RBAC:为不同团队分配 Kibana 空间(Space)和索引权限
2. 监控自身
- Elasticsearch:通过
_cluster/health、_nodes/stats监控 - Logstash:暴露指标到 Prometheus(需插件)
- Kibana:内置 Stack Monitoring 面板
3. 替代方案对比
| 方案 | 优势 | 劣势 |
|---|---|---|
| EFK(Fluentd 替代 Logstash) | 资源占用更低,云原生友好 | 插件生态弱于 Logstash |
| Loki + Promtail | 轻量级,与 Prometheus 生态集成 | 无全文检索,仅支持标签过滤 |
✅ 总结
ELK 的核心价值:将分散的日志转化为可行动的洞察。
- 初级:会部署、写 Grok 规则
- 中级:懂性能调优、集群管理
- 高级:能设计高可用架构、解决数据一致性问题
掌握 ELK 不仅是运维技能,更是数据驱动运维(Data-Driven Ops)思维的体现。在面试中,结合具体场景(如“如何排查 500 错误激增?”)展示你的分析能力,远比死记硬背配置更有说服力。