乔人尹 - 日志处理
type: channel
link: https://underestimated.cn/tag/%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86/
items: ELK技术栈

ELK技术栈
type: item
date: 2022-05-18T06:59:00+00:00
description: 什么是ELKELK是三个开源项目的首字母缩写：字母全称角色一句话介绍EElasticsearch搜索引擎存数据、查数据，快得离谱LLogstash数据管道收数据、洗数据、发数据KKibana可视化画图表、做看板、装门面后来官方又加了个小弟 Beats（轻量级数据采集器），所以现在更准确的叫法是 Elastic Stack。但大家还是习惯叫ELK，就像大家还是管"抖音"叫"抖音"而不是"字节跳动短视频平台"一样。整体架构先上一张全家福，看看这几位是怎么配合的：flowchart LR subgraph 数据源 A1[应用日志] A2[系统日志] A3[Nginx日志] A4[数据库日志] end subgraph 采集层 B1[Filebeat] B2[Metricbeat] B3[Packetbeat] end subgraph 处理层 C[Logstash] end subgraph 存储层 D[(Elasticsearch)] end subgraph 展示层 E[Kibana] end A1 --> B1 A2 --> B1 A3 --> B1 A4 --> B1 B2 --> C B3 --> C B1 --> C C --> D D --> E数据流向：日志文件 → Beats采集 → Logstash清洗 → Elasticsearch存储 → Kibana展示各组件详解1. Elasticsearch —— 搜索引擎之王Elasticsearch（简称ES）是整个技术栈的核心，基于Lucene构建的分布式搜索引擎。flowchart TB subgraph Elasticsearch集群 subgraph Node1[节点1-Master] S1[(Shard 1)] S2[(Shard 2)] end subgraph Node2[节点2-Data] S3[(Shard 3)] R1[(Replica 1)] end subgraph Node3[节点3-Data] R2[(Replica 2)] R3[(Replica 3)] end end Node1 Node2 Node2 Node3 Node1 Node3核心概念：概念类比MySQL说明IndexDatabase索引，一类数据的集合DocumentRow文档，一条数据（JSON格式）FieldColumn字段，文档中的属性ShardPartition分片，数据水平切分ReplicaSlave副本，高可用保障为什么快：倒排索引（Inverted Index）：不是"文档→词"，而是"词→文档列表"分布式架构：数据分片存储，查询并行执行近实时（NRT）：写入后1秒内可搜索基础操作：# 创建索引 PUT /logs-2024 # 写入文档 POST /logs-2024/_doc { "timestamp": "2024-01-15T10:30:00", "level": "ERROR", "message": "用户支付失败", "service": "payment" } # 搜索 GET /logs-2024/_search { "query": { "bool": { "must": [ { "match": { "level": "ERROR" } }, { "match": { "service": "payment" } } ] } } }2. Logstash —— 数据管道工Logstash是一个数据处理管道，负责"收集 → 转换 → 输出"。flowchart LR subgraph Input[输入插件] I1[file] I2[beats] I3[kafka] I4[jdbc] end subgraph Filter[过滤插件] F1[grok] F2[mutate] F3[date] F4[geoip] end subgraph Output[输出插件] O1[elasticsearch] O2[kafka] O3[file] O4[email] end Input --> Filter --> Output三段式配置：# /etc/logstash/conf.d/nginx.conf input { beats { port => 5044 } } filter { # 解析Nginx日志格式 grok { match => { "message" => '%{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} %…