ELK Stack(Elasticsearch, Logstash, Kibana)是一种流行的开源日志分析解决方案,下面是一个简单的ELK Stack搭建指南,帮助你理解如何安装和配置这些组件。
ELK Stack搭建指南,从零构建高效日志分析系统
环境准备
确保你的服务器满足以下要求:
- 至少8GB的内存
- 至少2核的CPU
- 一个可用的数据库(如MySQL、PostgreSQL等)
你需要一个文本编辑器或IDE来编写配置文件。
安装Elasticsearch
在Ubuntu上安装Elasticsearch:
# 更新包列表 sudo apt-get update # 安装Elasticsearch sudo apt-get install elasticsearch # 启动Elasticsearch服务 sudo systemctl start elasticsearch # 设置开机自启动 sudo systemctl enable elasticsearch
在CentOS上安装Elasticsearch:
# 添加Elasticsearch仓库 sudo cat <<EOF > /etc/yum.repos.d/elasticsearch.repo [elasticsearch] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 repo_gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch EOF # 安装Elasticsearch sudo yum install elasticsearch # 启动Elasticsearch服务 sudo systemctl start elasticsearch # 设置开机自启动 sudo systemctl enable elasticsearch
安装Logstash
在Ubuntu上安装Logstash:
# 安装Logstash sudo apt-get install logstash # 启动Logstash服务 sudo systemctl start logstash # 设置开机自启动 sudo systemctl enable logstash
在CentOS上安装Logstash:
# 安装Logstash sudo yum install logstash # 启动Logstash服务 sudo systemctl start logstash # 设置开机自启动 sudo systemctl enable logstash
安装Kibana
在Ubuntu上安装Kibana:
# 安装Kibana sudo apt-get install kibana # 启动Kibana服务 sudo systemctl start kibana # 设置开机自启动 sudo systemctl enable kibana
在CentOS上安装Kibana:
# 安装Kibana sudo yum install kibana # 启动Kibana服务 sudo systemctl start kibana # 设置开机自启动 sudo systemctl enable kibana
配置Elasticsearch
编辑Elasticsearch的配置文件/etc/elasticsearch/elasticsearch.yml,确保以下配置正确:
network.host: 0.0.0.0 http.port: 9200
然后重启Elasticsearch服务:
sudo systemctl restart elasticsearch
配置Logstash
创建一个新的Logstash配置文件/etc/logstash/conf.d/logstash.conf,并添加以下内容:
input {
file {
path => "/var/log/*.log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
然后重启Logstash服务:
sudo systemctl restart logstash
配置Kibana
编辑Kibana的配置文件/etc/kibana/kibana.yml,确保以下配置正确:
server.host: "0.0.0.0" elasticsearch.hosts: ["http://localhost:9200"]
然后重启Kibana服务:
sudo systemctl restart kibana
测试ELK Stack
打开浏览器,访问http://<your_server_ip>:5601,你应该能看到Kibana的界面,你可以在Kibana中创建索引模式,并开始搜索和分析日志数据。
通过以上步骤,你已经成功搭建了一个基本的ELK Stack,你可以根据需求进一步扩展和优化这个系统,例如添加更多的日志处理器、自定义字段映射、使用Elasticsearch的监控和报警功能等。
在当今的微服务和分布式系统架构中,日志不再是简单的文本记录,而是系统运行状态的“黑匣子”,当故障发生时,排查日志往往需要从数十台服务器、数百个日志文件中手动搜索,效率极低,ELK Stack(Elasticsearch、Logstash、Kibana)作为业界最流行的开源日志分析方案,能够将分散的日志集中采集、索引、可视化,让运维和开发人员能够实时洞察系统状态。
本文将手把手带你从零搭建一套完整的ELK日志分析系统,涵盖环境准备、组件安装、配置优化及生产环境的最佳实践。
ELK Stack核心组件概述
在动手搭建之前,先了解ELK三个核心组件的职责:
| 组件 | 作用 | 类比 |
|---|---|---|
| Elasticsearch | 分布式搜索和分析引擎,负责存储、索引日志数据 | 数据仓库 + 搜索引擎 |
| Logstash | 服务器端数据处理管道,负责采集、过滤、转换日志 | 数据搬运工 + 清洗工 |
| Kibana | 可视化平台,用于搜索、分析和图表展示日志 | 数据仪表盘 |
实际生产环境中常引入 Filebeat(轻量级日志采集器,替代Logstash Agent端),以减少资源消耗。
环境准备
1 服务器规划
假设使用三台服务器(最低配置2核4G,推荐4核8G):
| 主机名 | IP | 部署组件 |
|---|---|---|
| node1 | 168.1.10 | Elasticsearch(主节点)、Kibana |
| node2 | 168.1.11 | Elasticsearch(数据节点) |
| node3 | 168.1.12 | Elasticsearch(数据节点)、Logstash |
单机演示可将所有组件部署在同一台服务器上,但生产环境必须集群化。
2 系统依赖
所有节点执行:
# CentOS/RHEL yum install -y java-11-openjdk wget # Ubuntu/Debian apt update && apt install -y openjdk-11-jdk wget
验证Java版本:
java -version # 需输出 openjdk version "11.0.x"
安装Elasticsearch(7.x版本)
1 下载与安装
# 所有节点执行 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-linux-x86_64.tar.gz tar -xzf elasticsearch-7.17.10-linux-x86_64.tar.gz -C /usr/local/ ln -s /usr/local/elasticsearch-7.17.10 /usr/local/elasticsearch
2 配置集群(修改config/elasticsearch.yml)
node1(主节点)配置:
cluster.name: elk-cluster node.name: node-1 node.master: true node.data: true path.data: /data/elasticsearch/data path.logs: /var/log/elasticsearch network.host: 0.0.0.0 http.port: 9200 discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"] cluster.initial_master_nodes: ["node-1"]
node2、node3(数据节点)配置:
# 仅修改 node.name 和 node.master: false node.name: node-2 # 或 node-3 node.master: false
3 启动与验证
# 创建非root用户运行(Elasticsearch禁止root启动) useradd elk chown -R elk:elk /data/elasticsearch /var/log/elasticsearch /usr/local/elasticsearch # 启动(所有节点) su - elk -c "/usr/local/elasticsearch/bin/elasticsearch -d" # 验证集群状态 curl http://192.168.1.10:9200/_cluster/health?pretty # 应返回 "status" : "green" 或 "yellow"
安装Logstash
1 下载与安装(node3)
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.17.10-linux-x86_64.tar.gz tar -xzf logstash-7.17.10-linux-x86_64.tar.gz -C /usr/local/ ln -s /usr/local/logstash-7.17.10 /usr/local/logstash
2 编写日志采集配置文件(/usr/local/logstash/config/nginx.conf)
input {
beats {
port => 5044 # 接收Filebeat发送的数据
}
# 可选:直接读取文件
# file {
# path => "/var/log/nginx/access.log"
# start_position => "beginning"
# }
}
filter {
if [service][type] == "nginx_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
mutate {
remove_field => ["@version", "host", "message"]
}
}
output {
elasticsearch {
hosts => ["192.168.1.10:9200", "192.168.1.11:9200", "192.168.1.12:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug } # 调试输出
}
3 启动Logstash
# 测试配置 /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/nginx.conf --config.test_and_exit # 后台启动 nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/nginx.conf > /var/log/logstash.log 2>&1 &
安装Filebeat(日志源服务器)
在需要采集日志的服务器上安装Filebeat,而不是直接使用Logstash(避免Logstash agent过于沉重)。
1 下载与配置
# 在Web服务器(例如nginx服务器)上执行 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.10-linux-x86_64.tar.gz tar -xzf filebeat-7.17.10-linux-x86_64.tar.gz -C /usr/local/
2 配置filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
service:
type: nginx_access
fields_under_root: true
output.logstash:
hosts: ["192.168.1.12:5044"] # 指向Logstash
3 启动Filebeat
./filebeat -e -c filebeat.yml -d "publish"
安装Kibana(node1)
1 下载与配置
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.10-linux-x86_64.tar.gz tar -xzf kibana-7.17.10-linux-x86_64.tar.gz -C /usr/local/ ln -s /usr/local/kibana-7.17.10 /usr/local/kibana vi /usr/local/kibana/config/kibana.yml # 关键配置: server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://192.168.1.10:9200", "http://192.168.1.11:9200", "http://192.168.1.12:9200"] kibana.index: ".kibana" i18n.locale: "zh-CN" # 中文界面
2 启动Kibana
# Kibana也可用非root运行 useradd kibana chown -R kibana:kibana /usr/local/kibana su - kibana -c "/usr/local/kibana/bin/kibana &" # 浏览器访问 http://192.168.1.10:5601 # 首次进入需创建索引模式,输入 "nginx-access-*" 匹配索引
配置安全认证(X-Pack)
生产环境必须开启用户认证,防止未授权访问。
1 生成证书
# 任意节点执行 /usr/local/elasticsearch/bin/elasticsearch-certutil cert -out /etc/elasticsearch/certs/elastic-certificates.p12 -pass "" # 将证书复制到所有节点的相同目录
2 开启X-Pack
所有节点的elasticsearch.yml添加:
xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certs/elastic-certificates.p12
重启Elasticsearch后,设置内置用户密码:
/usr/local/elasticsearch/bin/elasticsearch-setup-passwords interactive # 设置 elastic、kibana、logstash_system 等用户密码
3 配置Kibana和Logstash连接
Kibana.yml添加:
elasticsearch.username: "kibana" elasticsearch.password: "your_password"
Logstash output中添加:
elasticsearch {
user => "logstash_system"
password => "your_password"
}
生产环境最佳实践
| 场景 | 建议 |
|---|---|
| 日志量 > 10TB/天 | 使用Kafka作为Logstash与ES之间的缓冲层 |
| 需要实时告警 | 集成ElastAlert或Watcher组件 |
| 日志格式复杂 | 在Logstash filter中编写自定义grok模式 |
| 减少ES存储压力 | 设置ILM(索引生命周期管理),自动删除30天前的索引 |
| 高可用 | ES节点至少3个,Kibana使用Nginx反向代理做负载均衡 |
优化Logstash性能
# 在Logstash启动参数中调整 pipeline.workers: 4 # 根据CPU核心数调整 pipeline.batch.size: 125 # 每次批量处理的事件数 pipeline.batch.delay: 50 # 等待时间(ms)
ES索引模板优化
PUT _template/nginx_log_template
{
"index_patterns": ["nginx-access-*"],
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "30s"
}
}
常见问题排查
Q1:ES集群状态一直为yellow
原因:副本分片未分配(通常是集群节点数少于副本数)
解决:curl -XPUT "localhost:9200/_settings" -H 'Content-Type: application/json' -d '{"index.number_of_replicas": 0}'
Q2:Kibana无法连接Elasticsearch
检查步骤:
- 确认ES端口可达:
telnet 192.168.1.10 9200 - 检查Kibana配置中的ES地址是否正确
- 如果开启了X-Pack,确认用户名密码是否正确
Q3:Filebeat无法连接Logstash
检查:
- Logstash的beat input端口5044是否监听:
netstat -tlnp | grep 5044 - 防火墙是否放行了5044端口
- Filebeat输出配置的IP和端口是否正确
通过本文的步骤,你应该已经成功搭建了一套完整的ELK日志分析系统,从日志采集(Filebeat)→ 处理(Logstash)→ 存储与检索(Elasticsearch)→ 可视化(Kibana),形成了完整的闭环。
ELK Stack的强大之处不仅在于搭建本身,更在于后续的持续优化——根据业务日志格式编写grok正则、设计高效的索引策略、创建直观的Kibana仪表盘,希望这篇指南能成为你日志管理道路上的坚实起点。
下一阶段可以探索:
- 使用ElastAlert实现日志告警
- 通过Kibana Canvas制作实时大屏
- 集成APM监控微服务性能
日志分析不是终点,而是系统可观测性的起点,祝你搭建顺利!
