3、ELK技术栈详解:Elasticsearch核心概念、Logstash管道与Filter、Kibana可视化
ELK 是 Elasticsearch、Logstash、Kibana 三个开源组件的首字母缩写,构成了现代日志收集与检索的事实标准。在生产发布拓扑中,Docker 容器产生的日志经过 Logstash 采集、过滤、转换后,写入 Elasticsearch 集群,最终由 Kibana 提供可视化分析。理解三者的核心概念是搭建可靠日志平台的前提。
3.1 Elasticsearch 核心概念
Elasticsearch 是一个基于 Lucene 的分布式搜索与分析引擎,以 RESTful API 对外提供服务。在日志场景中,它负责存储和索引日志数据,并提供毫秒级的检索能力。
3.1.1 索引(Index)
索引是 Elasticsearch 中存储相关文档的逻辑容器,类似于关系数据库中的“数据库”或“表”。每个索引由名称标识(全小写),包含一组具有相同结构的文档。在日志场景中,通常按时间维度创建索引,例如 nginx-access-2025-03-28,便于按时间范围管理数据生命周期。
3.1.2 分片(Shard)
分片是 Elasticsearch 实现水平扩展的核心机制。一个索引被拆分为多个分片,每个分片是一个独立的 Lucene 实例,可以分布在集群的不同节点上。分片分为两类:
- 主分片(Primary Shard):索引创建时指定,负责处理写入请求。主分片数量一旦设定不可更改。
- 副本分片(Replica Shard):主分片的拷贝,负责处理读取请求,提供高可用和故障转移。
3.1.3 副本(Replica)
副本是主分片的冗余副本,每个主分片可以有零个或多个副本。副本的作用包括:
- 高可用:当主分片所在节点宕机时,副本分片自动提升为主分片。
- 提升查询吞吐量:副本可以并行处理搜索请求,降低主分片负载。
3.1.4 核心概念对比
| 概念 | 类比关系型数据库 | 日志场景作用 | 关键配置 |
|---|---|---|---|
| Index(索引) | 数据库 / 表 | 按日期存储日志(如 logstash-2025.03.28) |
index.number_of_shards |
| Document(文档) | 行记录 | 单条日志条目(JSON 格式) | 自动生成 _id |
| Shard(分片) | 分区表 | 分散写入压力,支持 PB 级数据 | 主分片数创建后不可改 |
| Replica(副本) | 主从备份 | 节点故障时自动切换,保证日志不丢 | 可动态调整 |
| Mapping(映射) | 表结构定义 | 定义日志字段类型(如 @timestamp 为 date) |
支持动态映射 |
3.1.5 Elasticsearch 分片与副本工作流
下图展示了日志数据写入 Elasticsearch 集群时,分片与副本的协作过程:
3.2 Logstash 管道与 Filter
Logstash 是一个服务器端数据处理管道,能够从多种来源采集数据,实时转换后发送到目标存储。在 Docker 日志场景中,Logstash 通常作为日志采集代理,接收来自 Filebeat 或 TCP/UDP 输入的日志流。
3.2.1 管道生命周期
Logstash 管道由三个阶段组成,每个阶段对应一个配置节:
- Input(输入):定义数据来源。常用插件包括
beats(接收 Filebeat 数据)、tcp、udp、file。 - Filter(过滤):对数据进行解析、转换、丰富。这是 Logstash 最强大的部分,支持正则解析、日期处理、字段拆分等。
- Output(输出):将处理后的数据发送到目标。日志场景中通常输出到 Elasticsearch。
3.2.2 常用 Filter 插件
| 插件名称 | 功能 | 典型配置示例 |
|---|---|---|
grok |
将非结构化文本解析为结构化字段,支持预定义模式(如 %{COMBINEDAPACHELOG}) |
match => { "message" => "%{COMBINEDAPACHELOG}" } |
date |
将字符串时间戳转换为 Elasticsearch 的 @timestamp 字段 |
match => ["timestamp", "ISO8601"] |
mutate |
对字段进行增删改、类型转换、重命名等操作 | convert => ["response", "integer"] |
geoip |
根据 IP 地址添加地理位置信息(经纬度、城市、国家) | source => "client_ip" |
useragent |
解析 User-Agent 字符串,提取浏览器、操作系统、设备信息 | source => "user_agent" |
3.2.3 管道配置示例
以下是一个完整的 Logstash 管道配置,用于处理 Docker Nginx 容器日志:
input {
beats {
port => 5044
ssl => false
}
}
filter {
# 解析 Nginx 访问日志
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# 转换响应时间为整数
mutate {
convert => { "response" => "integer" }
convert => { "bytes" => "integer" }
}
# 设置 @timestamp 为日志中的时间戳
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
}
# 添加地理位置
geoip {
source => "clientip"
target => "geo"
}
# 添加容器标识
mutate {
add_field => { "container_name" => "%{[docker][container][name]}" }
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
user => "logstash_internal"
password => "${LOGSTASH_PASSWORD}"
}
}
grok 正则匹配性能与模式复杂度成正比。生产环境中建议使用 dissect 插件替代简单分隔符解析,其速度比 grok 快 2-3 倍。对于 Docker JSON 日志,优先使用 json 过滤器直接解析。
3.2.4 Logstash 管道数据流
下图展示了 Logstash 管道内部三个阶段的数据处理流程:
3.3 Kibana 可视化
Kibana 是 Elastic Stack 的可视化层,提供数据探索、仪表盘构建、告警管理等功能。在日志场景中,运维人员通过 Kibana 实时查看应用日志、分析错误趋势、定位故障根因。
3.3.1 核心功能模块
- Discover(发现):实时搜索和过滤日志数据,支持 Lucene 查询语法和 KQL(Kibana Query Language)。
- Visualize(可视化):基于 Elasticsearch 聚合构建图表,支持柱状图、折线图、饼图、地图等。
- Dashboard(仪表盘):将多个可视化图表组合到同一页面,形成运维监控大屏。
- Canvas(画布):创建自定义数据展示界面,适合制作实时数据报告。
- Alerting(告警):基于查询条件或阈值触发告警,支持邮件、Slack、Webhook 等通知方式。
3.3.2 日志分析典型场景
| 场景 | Kibana 功能 | 实现方式 |
|---|---|---|
| 错误日志实时监控 | Discover + 筛选 | 使用 KQL 查询 log.level: "ERROR",按时间倒序排列 |
| HTTP 状态码分布 | Visualize(饼图) | 对 response 字段进行 terms 聚合,按状态码分组 |
| 请求延迟趋势 | Visualize(折线图) | 对 @timestamp 进行 date_histogram 聚合,统计 upstream_response_time 平均值 |
| 客户端地理分布 | Visualize(地图) | 使用 geoip.location 字段创建坐标地图 |
| 慢查询 Top N | Discover + 排序 | 按 request_time 降序排列,限制返回 100 条 |
3.3.3 索引模式配置
在 Kibana 中访问 Elasticsearch 数据前,必须先创建索引模式(Index Pattern)。索引模式定义了 Kibana 如何匹配和展示索引中的数据:
- 通配符匹配:例如
nginx-access-*匹配所有 Nginx 访问日志索引。 - 时间过滤器:选择
@timestamp作为时间字段,Kibana 自动按时间范围过滤数据。 - 字段刷新:当索引映射更新时,手动刷新索引模式以获取最新字段列表。
nginx-access-*、app-backend-*、mysql-slow-*,便于在 Kibana 中快速切换不同数据源。同时利用 Kibana 的 Saved Objects 功能导出/导入仪表盘配置,实现多环境复用。
3.3.4 Kibana 可视化架构
下图展示了 Kibana 与 Elasticsearch 的交互关系,以及可视化组件的层级结构:
3.4 本章小结
- Elasticsearch:索引是日志存储单元,分片实现水平扩展,副本保证高可用。生产集群需合理规划分片数与副本数。
- Logstash:管道由 Input、Filter、Output 三阶段组成。Filter 是核心,grok 解析非结构化日志,mutate 转换字段,geoip 丰富上下文。
- Kibana:通过索引模式连接 Elasticsearch,Discover 实时搜索,Visualize 构建图表,Dashboard 形成监控大屏。