ELK Stack(Elasticsearch、Logstash、Kibana)是网站运维中应用最广泛的日志分析平台,支持海量日志的实时采集、存储、检索和可视化。在DevOps实践和SRE稳定性工程中,ELK平台为故障排查、性能监控、安全审计提供统一的数据底座。本文覆盖ELK 8.x版本的集群部署、日志采集管道、索引管理和可视化仪表盘配置。
ELK技术栈架构与组件职责划分
ELK Stack各组件职责明确:Elasticsearch负责日志数据的存储与全文检索,底层基于Lucene构建倒排索引;Logstash负责日志采集、解析和过滤,支持多种输入源和输出目标;Kibana提供Web可视化界面,支持仪表盘、图表、告警。在实际部署中,常引入Filebeat替代Logstash做轻量级日志采集,减少资源消耗。
# ELK数据流架构
应用服务器 → Filebeat(轻量采集) → Logstash(解析过滤)
→ Elasticsearch(存储索引) → Kibana(可视化分析)
# 或简化架构(中小规模)
应用服务器 → Filebeat → Elasticsearch → Kibana
Elasticsearch集群部署与索引模板配置
Elasticsearch 8.x默认开启安全认证,集群初始化时需要配置TLS和用户认证。单节点部署适合开发测试,生产环境建议至少3节点集群以保证高可用。以下为docker-compose方式部署三节点集群的核心配置:
# docker-compose.yml - Elasticsearch 8.x 集群
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- node.name=es01
- cluster.name=elk-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- xpack.security.enabled=true
- xpack.security.transport.ssl.enabled=true
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es01_data:/usr/share/elasticsearch/data
ports:
- 9200:9200
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- node.name=es02
- cluster.name=elk-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- node.name=es03
- cluster.name=elk-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
索引模板定义了日志索引的mapping、分片数和副本数。合理的模板配置直接影响查询性能和存储效率:
PUT _index_template/app-logs
{
"index_patterns": ["app-logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "5s"
},
"mappings": {
"properties": {
"@timestamp": {"type": "date"},
"level": {"type": "keyword"},
"service": {"type": "keyword"},
"host": {"type": "keyword"},
"message": {"type": "text", "analyzer": "ik_max_word"},
"trace_id": {"type": "keyword"},
"status_code": {"type": "integer"}
}
}
},
"priority": 100
}
Logstash日志采集管道与Filter插件配置
Logstash管道由input、filter、output三部分组成。input接收Filebeat或TCP推送的日志,filter负责解析和字段提取,output写入Elasticsearch。对于Nginx访问日志,常用grok插件按正则解析字段:
# /etc/logstash/conf.d/nginx_logs.conf
input {
beats {
port => 5044
}
}
filter {
if "nginx-access" in [tags] {
grok {
match => {
"message" => "%{IP:client_ip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:status} %{NUMBER:bytes} \"%{DATA:referer}\" \"%{DATA:agent}\" %{NUMBER:response_time}"
}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
mutate {
convert => {
"status" => "integer"
"bytes" => "integer"
"response_time" => "float"
}
}
}
}
output {
elasticsearch {
hosts => ["https://es01:9200"]
user => "elastic"
password => "${ES_PASSWORD}"
index => "app-logs-%{+YYYY.MM.dd}"
ssl_certificate_verification => false
}
}
Filebeat配置相对简单,指定日志文件路径和输出目标即可:
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
id: nginx-access
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx-access
output.logstash:
hosts: ["logstash:5044"]
Kibana可视化仪表盘与查询DSL实践
Kibana通过KQL(Kibana Query Language)或Lucene语法查询日志数据。常用查询包括按时间范围过滤、按日志级别筛选、按服务名聚合。以下为KQL查询示例:
# KQL查询示例
# 查看ERROR级别日志
level: "ERROR"
# 按服务名和时间范围过滤
service: "order-service" and @timestamp >= "2026-09-08T00:00:00"
# 模糊搜索异常关键词
message: "NullPointerException"
# 组合查询:特定服务的5xx错误
service: "payment-service" and status_code >= 500
在Kibana中创建仪表盘需要先建立索引模式(Index Pattern),匹配Elasticsearch中的日志索引。以app-logs-*为模式名,@timestamp为时间字段。创建仪表盘时常用的可视化类型包括:垂直柱状图(按时间统计日志量)、饼图(按日志级别分布)、数据表(实时日志流)、指标卡(ERROR计数)。
日志索引生命周期管理与性能优化
日志数据量持续增长会导致磁盘空间耗尽和查询性能下降。Elasticsearch的ILM(Index Lifecycle Management)策略可以自动管理索引的生命周期,实现滚动创建、自动归档和删除。
PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1d",
"max_primary_shard_size": "10gb"
}
}
},
"warm": {
"min_age": "3d",
"actions": {
"shrink": {"number_of_shards": 1},
"forcemerge": {"max_num_segments": 1}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
性能优化方面,JVM堆内存建议设置为物理内存的50%但不超过32GB,以启用指针压缩。集群层面通过分片数控制并行度,单分片大小建议在10-50GB之间。查询优化可通过使用filter替代query(利用缓存)、限制返回字段(_source filtering)、使用路由减少分片扫描等方式提升性能。监控方面接入Elasticsearch自带的cluster stats API或第三方Exporter采集集群健康状态、索引大小、查询延迟等指标。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/elk-ri-zhi-fen-xi-ping-tai-da-jian-shi-zhan-elasticsearch/