目录
简介
一、ELK 平台核心组件概述
1. ELK 架构与功能定位
2. Elasticsearch 核心概念
二、ELK 集群部署
1. 环境规划与准备
2. 部署 Elasticsearch 集群
三、Logstash 日志收集与处理
1. Logstash 安装与基础配置
2. 配置 Logstash 收集系统日志
四、Filebeat 轻量级日志收集器
1. 安装 Filebeat 并配置 Nginx 日志收集
2. 配置 Logstash 处理 Filebeat 数据
五、Kibana 可视化平台部署
1. 安装与配置 Kibana
2. 访问 Kibana 并创建索引模式
六、ELK 集群维护与优化
1. 索引管理
2. 性能优化关键点
七、总结与应用场景
简介
在数字化时代,企业 IT 系统每天都会产生海量日志数据,这些数据蕴含着系统运行状态、用户行为和安全事件等关键信息。传统日志管理方式因分散存储、检索效率低等问题,已难以满足现代运维与业务洞察的需求。ELK(Elasticsearch+Logstash+Kibana)作为业界主流的开源日志分析解决方案,为我们提供了从日志采集、处理、存储到可视化分析的完整闭环。本文将深入解析 ELK 的核心组件,并通过实战案例演示其部署与应用。
一、ELK 平台核心组件概述
1. ELK 架构与功能定位
ELK 由三个核心组件组成,各自承担不同的职责:
- Elasticsearch:分布式搜索引擎,基于 Lucene 构建,提供实时搜索、分析和存储能力。支持分布式架构、自动分片与副本机制,能高效处理海量日志数据。
- Logstash:数据处理管道,负责日志的收集、过滤和格式化。通过灵活的插件机制,可对接多种数据源并输出到不同目标。
- Kibana:可视化平台,为 Elasticsearch 提供友好的 Web 界面,支持日志检索、数据分析和图表展示。
日志处理的典型流程包括:
- 集中化管理日志
- 使用 Logstash 格式化日志并输出到 Elasticsearch
- Elasticsearch 对数据进行索引和存储
- Kibana 实现前端可视化展示
2. Elasticsearch 核心概念
(1)近实时搜索(NRT)
Elasticsearch 实现了近实时搜索,从文档索引到可搜索的延迟通常为 1 秒,满足大多数实时分析场景。
(2)集群与节点
- 集群(Cluster):由一个或多个节点组成,共同存储数据并提供索引和搜索功能,通过唯一名称标识(默认 "elasticsearch")。
- 节点(Node):集群中的服务器,存储数据并参与集群操作,节点名称在启动时自动生成(默认漫威角色名)。
(3)索引与文档
- 索引(Index):相似特征文档的集合,如系统日志索引、应用日志索引,名称需为小写。
- 文档(Document):可索引的基本数据单元,以 JSON 格式存储,属于某个索引的类型。
(4)分片与复制
- 分片(Shards):将索引拆分为多个子索引,实现水平扩展和并行处理。默认情况下,Elasticsearch 7.0 + 的索引主分片数为 1(旧版本为 5)。
- 复制(Replicas):分片的副本,提供高可用性和查询吞吐量,副本不会与主分片位于同一节点。
二、ELK 集群部署
1. 环境规划与准备
实验拓扑
主机名 | IP 地址 | 操作系统 | 安装组件 |
elk1 | 192.168.10.101 | OpenEuler 24 | Elasticsearch、Logstash、Kibana |
elk2 | 192.168.10.102 | OpenEuler 24 | Elasticsearch、Filebeat、httpd |
elk3 | 192.168.10.103 | OpenEuler 24 | Elasticsearch |
基础环境配置(以 elk1 为例)
# 1. 设置主机名
hostnamectl set-hostname elk1# 2. 配置hosts文件(三台主机均需执行)
cat <<EOF >>/etc/hosts
192.168.10.101 elk1
192.168.10.102 elk2
192.168.10.103 elk3
EOF# 3. 关闭防火墙与SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 4. 创建es用户(安全考虑,避免以root运行)
useradd es# 5. 安装Java环境(Elasticsearch依赖Java 11+)
dnf -y install java-11-openjdk# 6. 配置系统资源限制(优化Elasticsearch性能)
vim /etc/security/limits.conf
# 添加以下内容
es soft nofile 65535 # 单个进程最大打开文件数
es hard nofile 65535
es soft nproc 65535 # 单个用户最大进程数
es hard nproc 65535
es soft memlock unlimited # 最大锁定内存
es hard memlock unlimited# 7. 配置系统内核参数
vim /etc/sysctl.conf
# 添加以下内容
vm.max_map_count=655360 # 提高虚拟内存区域限制
sysctl -p # 加载配置
2. 部署 Elasticsearch 集群
安装与配置
# 1. 解压安装包
tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
mv elasticsearch-7.10.0 /usr/local/elasticsearch# 2. 配置JVM内存(关键参数,建议设置为物理内存的50%且不超过32GB)
vim /usr/local/elasticsearch/config/jvm.options
# 修改以下两行
-Xms2g # 堆初始大小
-Xmx2g # 堆最大大小# 3. 配置Elasticsearch主文件
vim /usr/local/elasticsearch/config/elasticsearch.yml
# 添加以下内容
node.name: elk1 # 节点名称
cluster.name: kgc-elk-cluster # 集群名称
path.data: /elk/data # 数据存储路径
path.logs: /elk/logs # 日志存储路径
bootstrap.memory_lock: false # 禁用内存锁定(若启用需确保系统配置正确)
network.host: 0.0.0.0 # 监听所有网络接口
http.port: 9200 # HTTP端口
discovery.seed_hosts: ["elk1", "elk2", "elk3"] # 集群节点列表
cluster.initial_master_nodes: ["elk1"] # 初始主节点列表# 4. 创建数据目录并授权
mkdir -p /elk/{data,logs}
chown -R es:es /elk/
chown -R es:es /usr/local/elasticsearch/# 5. 启动Elasticsearch(需切换到es用户)
su - es
nohup /usr/local/elasticsearch/bin/elasticsearch &# 6. 验证启动状态
netstat -anpt | grep 9200 # 检查端口是否监听
curl http://192.168.10.101:9200 # 访问API确认服务运行
集群状态检查
# 查看集群节点信息
curl http://192.168.10.101:9200/_cat/nodes?v
# 输出示例(带有*的为master节点)
192.168.10.101 126500 0.03 0.01 0.00 cdhilmrstw* elk1
192.168.10.102 22 97 0 0.12 0.05 0.01 cdhilmrstw- elk2
192.168.10.103 20 91 0 0.01 0.02 0.00 cdhilmrstw- elk3
三、Logstash 日志收集与处理
1. Logstash 安装与基础配置
# 1. 解压安装包
tar zxvf logstash-7.10.0-linux-x86_64.tar.gz
mv logstash-7.10.0 /usr/local/logstash# 2. 赋予数据目录权限
chmod -R 777 /usr/local/logstash/data/# 3. 测试安装(标准输入输出演示)
/usr/local/logstash/bin/logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
# 输入"nihao"后会输出格式化日志,包含@timestamp、host等字段
2. 配置 Logstash 收集系统日志
# 1. 允许Logstash读取系统日志
chmod o+r /var/log/messages# 2. 创建配置文件
vim /usr/local/logstash/system.conf
# 配置内容(input、filter、output三部分)
input {file {path => "/var/log/messages" # 日志文件路径type => "system" # 日志类型标识start_position => "beginning" # 从文件开头读取}
}
output {elasticsearch {hosts => ["192.168.10.101:9200"] # Elasticsearch地址index => "system-%{+YYYY.M.dd}" # 索引命名格式,按日期生成}
}# 3. 启动Logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/system.conf# 4. 验证索引创建
curl -XGET "http://localhost:9200/_cat/indices?v"
# 输出示例
green open system-2025.04.28 251 25 0 10.9mb 16k5pBbgQ10yp5d1ZjhJMA 4.5mb
四、Filebeat 轻量级日志收集器
1. 安装 Filebeat 并配置 Nginx 日志收集
# 1. 安装httpd服务(模拟Web服务产生日志)
yum -y install httpd
systemctl start httpd
echo "www.kgc.com" > /var/www/html/index.html# 2. 解压安装Filebeat
tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz
mv filebeat-7.10.0-linux-x86_64 /usr/local/filebeat# 3. 配置Filebeat输出到Logstash
vim /usr/local/filebeat/filebeat.yml
# 修改以下内容
filebeat.inputs:
- type: logpaths:- /var/log/httpd/access_log # Apache访问日志路径
output.logstash:hosts: ["192.168.10.102:5044"] # Logstash地址和端口# 4. 启动Filebeat
/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml &
2. 配置 Logstash 处理 Filebeat 数据
# 1. 创建Beats配置文件
vim /usr/local/logstash/config/beats.conf
# 配置内容
input {beats {port => "5044" # 监听Filebeat发送的端口codec => "json" # 解析JSON格式数据}
}
output {elasticsearch {hosts => ["192.168.10.103:9200"] # Elasticsearch地址index => "weblog-beat-%{+YY.M.dd}" # 索引命名}
}# 2. 启动Logstash(指定数据路径避免冲突)
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/beats.conf --path.data=/usr/local/logstash/config.d/web01
五、Kibana 可视化平台部署
1. 安装与配置 Kibana
# 1. 解压安装包
tar zxvf kibana-7.10.0-linux-x86_64.tar.gz
mv kibana-7.10.0-linux-x86_64 /usr/local/kibana# 2. 配置Kibana主文件
vim /usr/local/kibana/config/kibana.yml
# 修改以下内容
server.port: 5601 # 监听端口
server.host: "0.0.0.0" # 监听地址
elasticsearch.hosts: ["http://192.168.10.103:9200"] # Elasticsearch地址
kibana.index: ".kibana" # Kibana元数据索引# 3. 授权Kibana目录
chown -R es:es /usr/local/kibana/# 4. 启动Kibana
su - es
nohup /usr/local/kibana/bin/kibana &
2. 访问 Kibana 并创建索引模式
- 浏览器访问
http://192.168.10.101:5601
,进入 Kibana 界面。 - 点击 "Create index pattern",输入索引名称(如
system-*
或weblog-beat-*
)。 - 选择时间字段(如
@timestamp
),完成索引模式创建。 - 通过 "Discover" 页面查看和搜索日志数据,使用 "Visualize" 创建图表和仪表盘。
六、ELK 集群维护与优化
1. 索引管理
# 查看所有索引
curl -XGET "http://localhost:9200/_cat/indices?v"# 删除单个索引
curl -XDELETE "http://localhost:9200/system-2025.04.28"# 批量删除索引(通配符或逗号分隔)
curl -XDELETE "http://localhost:9200/logs-*,old-index"
2. 性能优化关键点
- Elasticsearch 分片策略:根据数据量设置主分片数,默认 1 片适用于中小规模集群,大数据量需提前规划分片数(创建后不可修改)。
- JVM 内存配置:设置
Xms
和Xmx
为相同值,避免 GC 频繁回收,建议不超过物理内存的 50% 且不超过 32GB。 - 冷热数据分层:将历史数据迁移到低速硬件,降低存储成本,提高热数据查询性能。
- Logstash 缓冲配置:调整
input
和output
的缓冲参数,避免数据积压(如queue.max_size
)。
七、总结与应用场景
ELK 架构通过 "采集 - 处理 - 存储 - 可视化" 的四层模型,将海量日志转化为可行动的业务洞察。其典型应用场景包括:
- 微服务日志追踪:通过统一日志格式定位分布式系统中的故障点。
- 安全合规审计:实时分析安全日志,检测异常访问和攻击行为。
- 性能瓶颈分析:结合 APM 工具,追踪请求链路,定位性能瓶颈。
- 用户行为分析:通过日志挖掘用户操作模式,优化产品体验。
尽管 ELK 在资源消耗和动态扩容方面存在挑战,但其开放生态(如与 Beats、APM 集成)和活跃社区支持,使其成为日志分析领域的事实标准。随着可观测性需求的升级,ELK 与机器学习、Service Mesh 的融合将进一步释放数据价值,为企业数字化转型提供坚实支撑。