ELK 介绍
ELK 是 Elasticsearch、Logstash、Kibana 三款开源工具的合称,是一套成熟的日志收集、存储、分析与可视化 解决方案,广泛用于日志管理、运维监控、安全审计等场景。后来 Beats 加入,技术栈也被称为 ELK Stack 或 Elastic Stack。
一、ELK 核心组件及功能
1. Elasticsearch(核心存储与搜索引擎)
- 定位 :分布式、RESTful 风格的全文搜索引擎,同时也是 NoSQL 数据库,负责存储日志数据并提供高效的查询、聚合分析能力。
- 核心特性
- 分布式架构:支持水平扩展,通过分片(Shard)和副本(Replica)保证数据高可用和查询性能。
- 全文检索:基于 Lucene 实现,支持模糊查询、精准匹配、范围查询等多种检索方式。
- 实时分析:内置聚合函数(如统计、分组、排序),可快速对海量日志进行指标计算。
- REST API:通过 HTTP 请求即可完成数据的增删改查,支持多种编程语言客户端。
2. Logstash(数据采集与预处理管道)
- 定位 :开源的数据采集引擎,负责从多源收集日志数据,对数据进行过滤、转换、清洗后,输出到 Elasticsearch 等目标。
- 核心架构(三段式 Pipeline)
- Input(输入):支持从文件、TCP/UDP 端口、Kafka、Redis、数据库等多种来源采集数据。
- Filter(过滤) :对采集的数据进行加工,例如:
- 解析非结构化日志(如 Nginx 日志、Syslog 日志)为结构化 JSON 格式。
- 过滤无用字段、添加自定义标签、数据格式转换(如时间格式统一)。
- 常用过滤器:
grok(正则解析)、mutate(字段修改)、date(时间解析)。
- Output(输出):将处理后的结构化数据发送到 Elasticsearch,也可输出到 Kafka、文件、邮件等。
- 缺点:资源消耗较高,适合在服务器端处理海量数据。
3. Kibana(数据可视化与交互平台)
- 定位 :基于浏览器的可视化工具,与 Elasticsearch 深度集成,负责将存储的数据转化为直观的图表、仪表盘。
- 核心功能
- Discover(探索):交互式查询日志,支持按字段筛选、高亮匹配结果,实时查看原始数据。
- Visualize(可视化):支持创建折线图、柱状图、饼图、热力图、地图等多种图表,展示日志的趋势、分布。
- Dashboard(仪表盘):将多个可视化图表组合成仪表盘,实时监控系统状态(如服务器 CPU 使用率、接口请求量、错误日志数)。
- Dev Tools:提供 Elasticsearch 的 REST API 调试界面,可直接编写 DSL(领域特定语言)查询语句。
- Alerting(告警):配置告警规则,当数据满足阈值时(如错误日志数超过 100),触发邮件、钉钉等通知。
4. Beats(轻量级数据采集器,补充组件)
Beats 是 Elastic 推出的轻量级、单一用途的数据采集器,相比 Logstash 更轻量,资源占用低,适合部署在采集端服务器。
- 常用 Beats 类型
- Filebeat:采集日志文件(如 Nginx、Tomcat 日志),替代 Logstash 作为轻量级日志采集工具。
- Metricbeat:采集系统和服务的监控指标(如 CPU、内存、磁盘、MySQL 性能指标)。
- Packetbeat:采集网络流量数据,分析 TCP/UDP 通信。
- Heartbeat:监控服务可用性,定期检查 HTTP/TCP/ICMP 端口是否存活。
- 作用:Beats 采集数据后,可直接发送到 Elasticsearch,也可先发送到 Logstash 进行复杂处理,降低 Logstash 的节点压力。
二、ELK 典型工作流程
- 数据采集:Filebeat 部署在业务服务器上,实时采集应用日志、系统日志。
- 数据预处理:Filebeat 将日志发送到 Logstash,Logstash 通过 grok 解析非结构化日志为结构化数据,过滤无用字段。
- 数据存储:Logstash 将处理后的结构化数据写入 Elasticsearch,Elasticsearch 对数据建立索引并存储。
- 数据可视化与分析:运维人员通过 Kibana 编写查询语句,创建可视化图表和仪表盘,实时监控系统状态、排查故障。
三、ELK 的核心优势
- 开源免费:核心组件均为开源,支持商业化扩展(Elastic 官方提供企业版)。
- 全栈式解决方案:从采集、处理、存储到可视化一站式完成,无需整合第三方工具。
- 高性能:Elasticsearch 分布式架构支持海量数据存储与秒级查询,适合 TB/PB 级日志场景。
- 灵活扩展:支持添加 Beats 采集器、集成 Kafka 做缓冲、对接第三方告警工具(如 Alertmanager)。
- 生态丰富:支持主流编程语言客户端,可与 K8s、Prometheus、Docker 等云原生工具无缝集成。
四、ELK 的典型应用场景
- 运维日志管理:集中收集服务器、应用、数据库的日志,快速定位故障(如接口报错、服务器宕机原因)。
- 系统监控:监控 CPU、内存、磁盘等指标,结合日志分析系统性能瓶颈。
- 安全审计:收集防火墙日志、用户登录日志,检测异常登录、恶意攻击行为。
- 业务分析:分析用户访问日志(如电商网站的用户浏览路径、下单转化率)。
五、ELK 与同类工具对比
| 工具栈 | 优势 | 劣势 |
|---|---|---|
| ELK | 开源免费、生态完善、查询性能强、可视化能力突出 | 资源占用较高、大规模集群运维成本高 |
| EFK(Elasticsearch+Fluentd+Kibana) | Fluentd 轻量、适合 K8s 容器日志采集 | 可视化能力依赖 Kibana,与 ELK 差异不大 |
| Prometheus+Grafana | 时序数据存储更高效、监控告警能力强 | 日志检索能力弱,适合指标监控而非全文日志分析 |
操作实例
前提准备
准备三台centos,其中两台node、一台web
两台node都需要安装elasticsearch
- 关闭所有防火墙、修改hosts文件(三台操作)
bash
#关闭防火墙
systemctl stop firewalld && systemctl enable firewalld
setenforce 0
#修改host文件以及主机名称
vim /etc/hosts
192.168.180.130 node1
192.168.180.140 node2
192.168.180.150 apache
- 安装java环境(三台操作)
bash
yum install -y java-1.8.0-openjdk.x86_64
java -version

- 安装elasticsearch软件(两台node)
bash
rpm -ivh elasticsearch-5.5.0.rpm
systemctl daemon-reload
systemctl enable elasticsearch

- 修改主配置文件(两台node)
找到以下几点并修改
bash
vim /etc/elasticsearch/elasticsearch.yml

node1:

node2:






- 创建目录授权(两台node)
bash
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data
- 开启elasticsearch(两台node)
bash
systemctl start elasticsearch
netstat -antp | grep 9200

- 查看信息,在浏览器内

在node1上操作:
- 安装node插件
bash
#解压
tar zxf node-v8.2.1.tar.gz
#安装gcc
yum install -y gcc gcc-c++
#编译安装
cd node-v8.2.1/
./configure && make && make install

- 安装phantomjs
bash
tar xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin
- 安装elasticsearch-head
bash
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head
npm install

- 修改主配置文件
bash
vim /etc/elasticsearch/elasticsearch.yml
#在文件最后添加
http.cors.enabled: true
http.cors.allow-origin: "*"
#保存退出重启服务
systemctl restart elasticsearch

- 启动elasticsearch-head插件并测试
bash
cd /usr/local/src/elasticsearch-head/
npm run start &
#浏览器访问192.168.180.130:9100


- 插入索引
bash
curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'Content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'


- 安装kibana
bash
rpm -ivh kibana-5.5.1-x86_64.rpm
systemctl enable kibana
- 修改kibana主配置文件
bash
vim /etc/kibana/kibana.yml
#保存退出后开启服务
systemctl start kibana



在web上操作:
- 安装java
bash
yum install -y java-1.8.0-openjdk.x86_64

- 安装httpd
bash
yum install -y httpd
systemctl start httpd
systemctl enable httpd
- 安装logstash
bash
rpm -ivh logstash-5.5.1.rpm
systemctl daemon-reload
systemctl enable logstash
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
- 配置logstash文件
bash
vim /etc/logstash/conf.d/apache_log.conf
input {
file {
path => "/var/log/httpd/access_log"
type => "access"
start_position => "beginning"
}
file {
path => "/var/log/httpd/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.180.130:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.180.130:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
- 生产系统索引
bash
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

查看浏览器

bash
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.180.101"] } }'

- 编写脚本
bash
vim /elk.sh
#!/bin/bash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache_log.conf
#添加执行权限
chmod a+x /elk.sh
. /elk.sh &
#执行
. /elk.sh

- 浏览器访问192.168.180.130:5601
