前言
在企业运维场景中,服务器、应用、安全日志分散存储,传统grep/awk命令检索效率低下,ELK Stack 是目前主流的开源日志集中化管理方案,可实现日志采集、清洗、存储、检索、可视化全流程管理,广泛用于运维监控、故障排查、安全审计、业务分析等场景。
本手册基于CentOS 7.9 + ELK 7.10.0 完整部署,包含全部命令、配置文件、关键知识点与排错方案。
一、ELK 核心组件与架构
1.1 组件定义
- Elasticsearch(ES) :分布式搜索引擎,负责日志存储、索引、检索,支持集群高可用与水平扩展。
- Logstash :数据处理管道,负责日志采集、过滤、格式化、转发。
- Kibana:可视化平台,提供 Web 界面,用于日志查询、图表展示、报表生成。
- Filebeat:轻量级日志采集器,部署在业务服务器,低资源占用采集日志并发送给 Logstash/ES。
1.2 工作流程
- Filebeat 采集业务服务器日志 → 发送至 Logstash
- Logstash 清洗格式化日志 → 输出至 Elasticsearch
- Elasticsearch 建立索引存储 → 提供检索能力
- Kibana 对接 Elasticsearch → 可视化展示日志
1.3 补充知识点
- ELK 版本必须一致:避免组件兼容问题,本手册统一使用 7.10.0。
- ES 集群节点数建议奇数:防止脑裂问题,提升选举稳定性。
- Logstash 依赖 JDK:运行在 JVM 上,建议使用 JDK 11。
- Filebeat 替代 Logstash Agent:Logstash 耗资源,生产环境用 Filebeat 做前端采集。
二、实验环境规划
2.1 主机清单
表格
| 主机名 | IP 地址 | 系统版本 | 部署组件 |
|---|---|---|---|
| web01 | 192.168.10.101 | CentOS 7.9 | httpd、Filebeat |
| logstash | 192.168.10.102 | CentOS 7.9 | JDK 11、Logstash |
| elk1 | 192.168.10.103 | CentOS 7.9 | JDK 11、ES、Kibana |
| elk2 | 192.168.10.104 | CentOS 7.9 | JDK 11、ES |
2.2 基础环境配置(所有节点执行)
bash
运行
# 1. 设置主机名
hostnamectl set-hostname 主机名
bash
# 2. 配置hosts解析
cat <<EOF>>/etc/hosts
192.168.10.101 web01
192.168.10.102 logstash
192.168.10.103 elk1
192.168.10.104 elk2
EOF
# 3. 关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
# 4. 系统优化参数
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
sysctl -p
三、Elasticsearch 集群部署
3.1 ES 节点前置配置(elk1、elk2 执行)
bash
运行
# 1. 创建专用用户(ES禁止root启动)
useradd es
echo "es123" | passwd --stdin es
gpasswd -a es wheel
# 2. 配置sudo免密
sed -i '/%wheel/s/^#//' /etc/sudoers
# 3. 安装JDK 11
sudo yum -y install java-11-openjdk java-11-openjdk-devel
java -version
3.2 安装与配置 Elasticsearch(elk1 节点)
bash
运行
# 1. 解压安装
su - es
cd /opt
sudo tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
sudo mv elasticsearch-7.10.0 /etc/elasticsearch
# 2. JVM内存配置(建议物理内存50%)
sudo vim /etc/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g
# 3. 主配置文件
sudo vim /etc/elasticsearch/config/elasticsearch.yml
cluster.name: my-es-cluster
node.name: elk1
path.data: /data/es/data
path.logs: /data/es/logs
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk1","elk2"]
cluster.initial_master_nodes: ["elk1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
# 4. 创建数据目录并授权
sudo mkdir -p /data/es/{data,logs}
sudo chown -R es:es /data/es
sudo chown -R es:es /etc/elasticsearch
# 5. 后台启动ES
/etc/elasticsearch/bin/elasticsearch &
3.3 elk2 节点 ES 配置
bash
运行
# 重复3.2步骤,仅修改node.name
sudo vim /etc/elasticsearch/config/elasticsearch.yml
cluster.name: my-es-cluster
node.name: elk2
path.data: /data/es/data
path.logs: /data/es/logs
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk1","elk2"]
cluster.initial_master_nodes: ["elk1"]
http.cors.enabled: true
http.cors.allow-origin: "*"
# 启动ES
/etc/elasticsearch/bin/elasticsearch &
3.4 集群验证
bash
运行
# 查看端口
netstat -anpt | grep 9200
# 查看集群节点(*为master节点)
curl http://192.168.10.103:9200/_cat/nodes
3.5 补充知识点
- bootstrap.memory_lock:锁定物理内存,禁用 swap 交换,提升 ES 性能。
- discovery.seed_hosts:集群发现节点列表,必须包含所有 ES 节点。
- 分片与副本:ES 7.x 默认 1 主分片 1 副本,副本不能与主分片同节点。
- 常见报错:max file descriptors 太低 → 调整 limits.conf。
四、Logstash 部署(192.168.10.102)
4.1 安装 Logstash
bash
运行
# 1. 安装JDK
yum -y install java-11-openjdk java-11-openjdk-devel
# 2. 解压安装
cd /opt
tar zxvf logstash-7.10.0-linux-x86_64.tar.gz
mv logstash-7.10.0 /etc/logstash
chmod -R 777 /etc/logstash/data
4.2 功能测试
bash
运行
# 标准输入→标准输出测试
/etc/logstash/bin/logstash -e 'input { stdin { } } output { stdout {codec => rubydebug} }'
# 输入内容,查看格式化输出,Ctrl+C退出
4.3 配置 1:采集本机系统日志
bash
运行
# 授权日志读取权限
chmod o+r /var/log/messages
# 创建配置文件
vim /etc/logstash/config/system_log.conf
input {
file {
path => "/var/log/messages"
type => "system-log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.10.103:9200"]
index => "system-log-%{+YYYY.MM.dd}"
}
}
# 后台启动
/etc/logstash/bin/logstash -f /etc/logstash/config/system_log.conf &
4.4 补充知识点
- start_position :
beginning从头采集,end从最新日志采集。 - codec => rubydebug:标准输出格式化,便于调试。
- index 命名:按日期分割索引,便于管理与清理。
五、Filebeat 部署(web01:192.168.10.101)
5.1 安装 httpd 模拟业务日志
bash
运行
yum -y install httpd
systemctl start httpd
echo "ELK Test Page" > /var/www/html/index.html
curl 127.0.0.1
5.2 安装配置 Filebeat
bash
运行
cd /opt
tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz
mv filebeat-7.10.0-linux-x86_64 /etc/filebeat
# 备份默认配置
mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak
# 新建配置
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/httpd/access_log
- /var/log/httpd/error_log
output.logstash:
hosts: ["192.168.10.102:5044"]
# 后台启动
/etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
5.3 Logstash 对接 Filebeat
bash
运行
vim /etc/logstash/config/beats_log.conf
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["192.168.10.103:9200"]
index => "web-log-%{+YYYY.MM.dd}"
}
}
# 启动(指定独立data目录,支持多实例)
/etc/logstash/bin/logstash -f /etc/logstash/config/beats_log.conf --path.data=/etc/logstash/data/web &
5.4 补充知识点
- Filebeat 优势:轻量、占用 CPU / 内存极低,适合大规模部署。
- 5044 端口:Logstash 默认监听 Beats 输入端口。
- codec => json:自动解析 JSON 格式日志,无需额外过滤。
六、Kibana 部署(elk1:192.168.10.103)
6.1 安装配置 Kibana
bash
运行
su - es
cd /opt
sudo tar zxvf kibana-7.10.0-linux-x86_64.tar.gz
sudo mv kibana-7.10.0-linux-x86_64 /etc/kibana
sudo chown -R es:es /etc/kibana
# 修改配置
sudo vim /etc/kibana/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.10.103:9200"]
i18n.locale: "zh-CN"
# 后台启动
/etc/kibana/bin/kibana &
6.2 Web 界面使用
- 访问:
http://192.168.10.103:5601 - 创建索引模式:Stack Management → Index Patterns → Create index pattern
- 日志查询:Discover 选择索引模式,查看实时日志
- 可视化:Visualize 创建图表,Dashboard 组合报表
6.3 补充知识点
- i18n.locale: zh-CN:开启中文界面,降低使用门槛。
- 索引模式:Kibana 必须创建索引模式才能读取 ES 数据。
- KQL 查询语法 :
response:200 AND clientip:192.168.*精准检索日志。
七、常用运维命令
7.1 Elasticsearch 常用命令
bash
运行
# 查看所有索引
curl http://192.168.10.103:9200/_cat/indices?v
# 删除指定索引
curl -X DELETE http://192.168.10.103:9200/system-log-2026.04.27
# 查看集群健康状态
curl http://192.168.10.103:9200/_cluster/health?pretty
7.2 进程管理
bash
运行
# 查看进程
ps -ef | grep elasticsearch
ps -ef | grep logstash
ps -ef | grep filebeat
ps -ef | grep kibana
# 杀死进程
kill -9 进程ID
八、常见问题排错
- ES 启动失败
- 原因:root 用户启动、内存不足、系统参数未优化。
- 解决:使用 es 用户启动,调整 JVM 内存,重新配置 limits.conf。
- Logstash 无法接收 Filebeat 日志
- 原因:5044 端口未监听、防火墙拦截、配置文件错误。
- 解决:netstat 检查端口,关闭防火墙,核对 hosts 配置。
- Kibana 无法连接 ES
- 原因:elasticsearch.hosts 配置错误、ES 未启动。
- 解决:核对 ES 地址,重启 ES 服务。
- 日志不显示
- 原因:索引未创建、日志未生成、索引模式错误。
- 解决:访问业务服务生成新日志,重新创建索引模式。
九、生产环境优化建议
- ES 集群扩容:3 节点起步,分离 master、data、coordinating 节点。
- 日志清理:配置索引生命周期策略,自动删除 7 天前日志。
- 安全加固:开启 ES 认证、HTTPS、限制 IP 访问。
- 资源配置:ES 内存不超过 32G,Logstash 单机不超过 4 实例。