1. ELK Stack 概述与架构

ELK 这个缩写,干这行的都熟。Elasticsearch、Logstash、Kibana 三件套,说白了就是一套日志处理流水线。我最早接触它是在一家电商公司,每天几亿条用户行为日志,MySQL 根本扛不住,老板一拍桌子说上 ELK,这才入了坑。

1.1 三个组件,各管一摊

先拆开看每个组件到底干嘛的,别被官方文档绕晕。

组件角色一句话理解
Elasticsearch存储 + 搜索一个分布式 JSON 文档数据库,全文检索快得离谱
Logstash采集 + 加工从各种源拽数据,过滤、清洗、转格式,再吐给 ES
Kibana可视化 + 管理把 ES 里的数据画成图表,顺便查查索引、调调查询

嗯,这里要注意:Logstash 不是唯一的数据摄入方式。Beats(轻量采集器)后来也成了标配,但我个人习惯把 Beats 算作 Logstash 的补充,不算打破 ELK 的概念。

1.2 它们怎么协同的?

想象一条流水线:数据源 → Logstash(预处理) → Elasticsearch(索引与存储) → Kibana(展示)。

举个例子。我在项目中遇到过 Nginx 日志的采集场景:

  • Nginx 写日志到文件 → Filebeat 嗅探并转发 → Logstash 解析成结构化 JSON → ES 建索引 → Kibana 画请求趋势图。
  • 如果 Logstash 挂了怎么办?Filebeat 有内部队列和重试机制,数据不会丢,这在生产环境里很重要。

为什么会这样设计?因为解耦。日志采集、处理、存储、展示各自独立,你改 Kibana 的面板不用重启 Logstash,修 Logstash 的过滤规则也不影响 ES 的数据。我当初把这套逻辑讲给运维同事听,他说“这不就是微服务思想吗?”——对,就是这个理。

1.3 常见部署模式

部署方式不是拍脑袋定的,得看你的数据量、可用性要求和运维成本。我用表格列一下最常见的三种:

模式节点角色适用场景踩过的坑
单机 All-in-One单台服务器跑 ES + Logstash + Kibana开发测试、小日志量(< 10GB/天)我曾经图省事直接用单机,结果 Logstash 吃满 CPU,ES 索引响应也变慢——别在生产环境用
标准三节点集群3 台 ES 数据节点 + 1 台 Logstash + 1 台 Kibana中小规模生产,日均 10~100GB 日志Logstash 默认堆内存 1GB,我忘了改,半夜直接 OOM,日志全卡在管道里
大型分离集群ES 集群(单独 Master/Data/Ingest 节点)+ 独立 Logstash 集群 + 多个 Kibana + 消息队列(Kafka)企业级,日均 TB 级日志,要求高可用加 Kafka 后日志链路变长,调优时得盯每个环节的堆积量,不然日志延迟高了没人知道
小建议: 刚入门别一上来就搞大集群。我建议先用单机跑通流程,再横向扩展。你想想看,日志管道都没调通,光搭集群就累半死,不值。
注意: 不要在部署时把 Logstash 和 ES 分到不同机房如果网络延迟 > 10ms,Logstash 的 output 线程会大量阻塞,吞吐量直接腰斩。我吃过这个亏。

1.4 架构总览:一张图说清

下面这张 SVG 图把核心流程和组件关系画出来了。重点看数据流方向和组件间的依赖:

ELK Stack 核心架构图 数据源 日志 / 指标 / 事件 Logstash 采集 · 过滤 · 转换 Elasticsearch 存储 · 检索 · 聚合 Kibana 可视化 · 仪表盘 · 探索 可选:Beats 轻量采集器 可替代/补充 Logstash 采集端 企业级可选:Kafka 做消息缓冲 削峰填谷,防止 Logstash 被冲垮 ES 集群至少 3 数据节点 副本数 ≥ 1,保证高可用

这张图里我特意加了两条虚线:Kibana 查询 ES 时其实走了 HTTP REST 接口,这不是简单的“展示”,而是 Kibana 发起 DSL 查询,ES 返回结果。你如果遇到 Kibana 图表加载慢,先去查 ES 查询耗时,别第一时间怪网络。

1.5 核心协同关系,记住这三点

  1. Logstash 是承重墙。 解析过滤做得不好,ES 里存的就是垃圾数据,Kibana 面板再漂亮也没用。我建议在 Logstash 里做好字段映射和类型转换,别把数字存成字符串。
  2. Elasticsearch 的索引设计决定查询速度。 分片数、副本数、映射模板,这些要在数据接入前规划好。我曾经接手一个项目,ES 索引用了默认 5 分片 1 副本,结果半年后查询慢成狗,重新索引才救回来。
  3. Kibana 不仅是画图工具。 它自带 Dev Tools,可以直接查 ES 的 _cat API、调 Query DSL,排查问题时比 curl 方便太多。我调试脚本告警集成时,90% 的时间在 Kibana 里敲命令。

一句话总结: ELK 的威力在“流水线协同”。Logstash 把原料洗好,ES 把货架摆整齐,Kibana 把商品展示出来。你只要维护好管道通畅,剩下的事交给它们自己玩。

1.6 我的架构选择建议

如果你现在要搭一套 ELK,我给个通用参考(来自我踩过的坑):

  • 日均日志量小于 5GB → 单机 All-in-One 足够,但记得给 ES 和 Logstash 分别分配独立 JVM 堆(ES 不超过物理内存 50%,Logstash 给 2~4GB)。
  • 日均 5~50GB → 标准三节点集群,Logstash 独立部署,加一个 Filebeat 作为采集端。为什么要加 Filebeat?因为它比 Logstash 轻,资源消耗只有 Logstash 的十分之一,而且自带背压机制。
  • 日均 > 100GB → 必须上 Kafka。Logstash 处理能力有限,突发流量时 Kafka 能缓冲。我见过某公司没加 Kafka,大促时日志直接冲垮 Logstash,ES 写入排队,最终数据丢失。

嗯,这个架构话题挺长,但第 1 章你只要理解“三个组件各自干什么、怎么连到一块”就够了。后面的章节我们会拿真实脚本,把巡检和告警一步步集成进去。