企业级应用技术-ELK日志分析系统
目录
#1.1ELK平台介绍
1.1.1ELK概述
1.1.2Elasticsearch
1.1.3Logstash
1.1.4Kibana
#2.1部署ES群集
2.1.1基本配置
2.1.2安装Elasticsearch
2.1.3安装Logstash
2.1.4Filebeat
2.1.5安装Kibana
1.1ELK平台介绍
1.1.1ELK概述
ELK 是三个开源工具的缩写,分别是Elasticsearch、Logstash和Kibana,三者组合形成了一套完整的日志收集、存储、分析与可视化解决方案,广泛应用于日志管理、数据分析、监控告警等场景。
1.1.2Elasticsearch
(1)Elasticsearch概述
Elasticsearch(简称 ES)是一款基于 Lucene 构建的分布式、高扩展、实时的全文搜索引擎和数据分析引擎,主要用于海量数据的存储、检索、聚合与分析,广泛应用于日志分析、全文检索、实时监控等场景。
(2)Elasticsearch核心概念
1. 索引(Index)
-
定义:类似关系型数据库中的 “数据库” 或 “表”,是一组具有相似结构的文档集合(例如 “用户日志索引”“商品信息索引”)。
-
特点:
-
索引名称需小写,且不能包含特殊字符;
-
每个索引对应多个分片(分布式存储的基础);
-
可通过 “索引模板” 预先定义字段映射规则(如字段类型、分词器等)。
-
2. 文档(Document)
-
定义:索引中的单条数据,是 ES 的最小数据单元,以JSON 格式表示(类似数据库中的 “行”)。
-
特点:
-
每个文档有唯一的
_id
(可手动指定或自动生成),用于标识文档; -
文档字段支持动态映射(无需预先定义结构,ES 会自动推断字段类型,如字符串、数字等)。
-
3. 类型(Type)
-
定义:早期版本中用于区分索引内不同结构的文档(类似数据库中 “表” 里的 “子表”),但在 ES 7.x 后被移除。
-
原因:类型的存在会导致同一索引内不同类型文档的字段映射冲突,不符合分布式存储的设计逻辑,目前推荐一个索引只存储一种类型的文档。
4. 映射(Mapping)
-
定义:类似数据库中的 “表结构”,用于定义文档中字段的类型(如
text
、keyword
、date
)、分词器、是否索引等元数据。 -
分类:
-
动态映射:ES 自动推断字段类型(如输入数字则映射为
long
); -
静态映射:手动定义字段规则(更精准,避免自动映射出错,如将 “手机号” 指定为
keyword
类型以支持精确匹配)。
-
5. 分片(Shard)
-
定义:索引的细分存储单元,一个索引会被拆分为多个分片(默认 5 个),分布式存储在不同节点上。
-
作用:
-
实现水平扩展:通过增加分片(或节点)提升存储容量和查询并发能力;
-
并行处理:查询时多个分片同时工作,提高检索效率。
-
-
类型:
-
主分片(Primary Shard):数据的原始存储位置,不可修改数量(创建索引后固定);
-
副本分片(Replica Shard):主分片的备份,用于故障恢复和分担查询压力,数量可动态调整。
-
6. 节点(Node)
-
定义:运行 ES 实例的服务器,一个集群由多个节点组成,节点通过集群名称(默认
elasticsearch
)加入集群。 -
角色分类:
-
主节点(Master Node):管理集群元数据(如索引创建、分片分配),不处理数据请求,建议单独部署以保证稳定性;
-
数据节点(Data Node):存储数据(分片),负责数据的 CRUD(增删改查)和聚合分析,消耗 CPU、内存和磁盘资源;
-
协调节点(Coordinating Node):接收客户端请求,分发任务到其他节点,汇总结果后返回(所有节点默认具备此功能);
-
ingest 节点:预处理数据(如日志清洗),类似 Logstash 的轻量版功能。
-
7. 集群(Cluster)
-
定义:由多个节点组成的集合,共同管理全量数据,提供分布式服务。
-
特点:
-
集群有唯一名称(默认
elasticsearch
),节点通过名称加入集群; -
集群会自动选举主节点,保证高可用;
-
数据通过分片分布式存储,副本机制确保数据不丢失(如主分片故障,副本分片会升级为主分片)。
-
1.1.3Logstash
(1)Logstash介绍
Logstash 是 Elastic Stack(ELK Stack)中的数据收集与处理引擎,主要用于对分散的、多源的日志或数据进行采集、转换、过滤,再输出到目标存储(如 Elasticsearch、数据库、文件等),是数据链路中的 “管道” 角色。
(2)Logstash工作的三个阶段
1. 输入阶段(Input)
-
作用:从外部数据源收集数据,是 Logstash 的数据入口。
-
支持的数据源:通过输入插件(Input Plugins)实现,覆盖多种场景:
-
文件(如
file
插件读取服务器日志文件); -
网络流(如
tcp
/udp
插件接收实时数据、kafka
插件消费消息队列); -
数据库(如
jdbc
插件定时同步数据库数据); -
云服务、API 接口等。
-
-
特点:可同时配置多个输入源,实现多渠道数据的集中采集。
2. 过滤阶段(Filter)
-
作用:对输入的数据进行清洗、转换、 enrichment(补充信息),是数据处理的核心环节。
-
常见操作:通过过滤插件(Filter Plugins)实现:
-
解析格式(如
json
插件解析 JSON 字符串为结构化字段); -
字段处理(如
mutate
插件添加 / 删除 / 重命名字段、修改字段类型); -
过滤筛选(如
grok
插件从非结构化日志中提取关键信息,drop
插件丢弃无效数据); -
补充信息(如
geoip
插件通过 IP 地址获取地理位置信息)。
-
-
特点:可选阶段(若无需处理,数据可直接从输入流向输出),但通常是提升数据质量的关键。
3. 输出阶段(Output)
-
作用:将处理后的结构化数据发送到目标存储或系统,是 Logstash 的数据出口。
-
支持的目标:通过输出插件(Output Plugins)实现:
-
Elasticsearch(最常用,用于后续检索分析);
-
存储系统(如
file
插件写入文件、s3
插件上传至云存储); -
消息队列(如
kafka
插件转发数据); -
数据库(如
jdbc
插件写入 MySQL)等。
-
-
特点:可配置多个输出目标,实现 “一次处理,多端分发”。
总结
三个阶段通过 “输入→过滤→输出” 的流水线模式,实现了从原始数据到高质量结构化数据的转化。例如:
1.输入阶段:file
插件读取服务器的 Nginx 日志文件;
2.过滤阶段:grok
插件提取日志中的 IP、URL、响应时间等字段, geoip
插件补充 IP 对应的地区;
3.输出阶段:将处理后的结构化日志发送到 Elasticsearch,供后续 可视化分析。
这种架构让 Logstash 能够灵活适配各种数据场景,成为数据链路中 “预处理中枢” 的核心工具。
1.1.4Kibana
(1)Kibana介绍
Kibana 是 Elastic Stack(ELK Stack)中用于数据可视化与交互分析的开源平台,与 Elasticsearch 无缝集成,主要功能是将存储在 Elasticsearch 中的数据通过直观的图表、仪表盘等形式展示,帮助用户快速挖掘数据价值、监控业务状态或排查问题。
(2)Kibana主要功能
1.数据检索与探索:通过 Elasticsearch 查询语法快速检索数据,实时浏览、筛选、导出数据,支持全文检索、字段过滤等操作,方便临时分析或故障排查。
2.可视化与仪表盘:提供丰富图表(柱状图、折线图、地图等),可将数据转化为直观可视化效果;支持组合多图表为自定义仪表盘,集中展示核心指标(如系统性能、业务数据)。
3.监控与告警:对关键指标(如错误率、响应时间)设置告警规则,触发阈值时通过邮件、Slack 等渠道通知,实现实时业务或系统监控。
4.数据管理:管理 Elasticsearch 索引模式、字段映射等元数据,支持导入导出可视化成果,便于团队协作。
5.进阶分析:集成机器学习功能检测异常数据,联动 APM 工具分析应用性能,深度挖掘数据价值。
2.1部署ES群集
主机名 | ip 地址 | 操作系统 | 软件包 |
---|---|---|---|
elk1 | 192.168.10.101 | Openeuler24 | Elasticsearch、logstash、kibana |
elk2 | 192.168.10.102 | Openeuler24 | Elasticsearch、filebeat、httpd |
elk3 | 192.168.10.103 | Openeuler24 | Elasticsearch |
2.1.1基本配置
在两台ES主机上设置hosts文件
192.168.10.101 elk1
192.168.10.102 elk2
192.168.10.103 elk3
关闭所有节点的防火墙
systemctl stop firewalld
setenforce 0
创建es运行用户
[root@elk1 ~]#useradd es
安装java环境
[root@elkl ~]# dnf -y install java-11 [root@elkl ~]# java -version openjdk version "11.0.9.1" 2020-11-04 LTS OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing)
为用户设置资源访问限制
[root@elkl ~]# 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
[root@elkl ~]#vim /etc/sysctl.conf 添加下面配置: vm.max_map_count=655360 [root@elkl ~]#sysctl -p
2.1.2 安装Elasticsearch
[root@elkl ~]#tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz [root@elkl ~]# mv elasticsearch-7.10.0 /usr/local/elasticsearch [root@elkl ~]# vim /etc/elasticsearch/config/jvm.options -Xms2g -Xmx2g
更改Elasticsearch主配置文件
[root@elkl ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml cluster.name: kgc-elk-cluster ##17 行,群集名称 node.name: elk1 ##23 行,本节点主机名,以 elk1 节点为例,其它节点请改成相对应的节点名称 path.data: /elk/data ##33 行,数据文件路径 path.logs: /elk/logs ##37 行,日志文件路径 bootstrap.memory_lock: false ##43 行,锁定物理内存 network.host: 0.0.0.0 ##55 行,监听地址 http.port: 9200 ##59 行,监听端口 discovery.seed_hosts: ["elk1", "elk2", "elk3"] ##68 行,群集中的主机列表 cluster.initial_master_nodes: ["elk1"] ##72,master 主机名称,群集的初始化会将此节点选举为 master
创建数据存放路径并授权
[root@elkl ~]# mkdir -p/elk/data [root@elkl ~]#mkdir -p /elk/logs [root@elkl ~]#chown -R es:es /elk/ [root@elkl ~]#chown -R es:es /usr/local/elasticsearch/
启动es
[root@elkl ~]#su - es #es 限制使用 root 启动,需要切换至 es [es@elkl ~]$ nohup /usr/local/elasticsearch/bin/elasticsearch &[es@elkl ~]$ sudo netstat -anpt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN
查看节点信息
[root@localhost ~]# curl http://192.168.10.103:9200/_cat/nodes 192.168.10.101 12 65 0 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
2.1.3 安装logstash
在logstash服务器上安装logstas
[root@losstash ~]# systemctl stop firewalld [root@losstash ~]# setenforce 0[root@losstash ~]# yum -y install java-11 [root@losstash ~]# tar zxvf logstash-7.10.0-linux-x86_64.tar.gz [root@losstash ~]# mv logstash-7.10.0 /usr/local/logstash [root@losstash ~]# chmod -R 777 /usr/local/logstash/data/
测试安装结果
[root@losstash ~]# /usr/local/logstash/bin/logstash -e 'input { stdin {} } output { stdout {codec => rubydebug} }' nihao {"@timestamp" => 2020-03-14T03:20:24.229Z,"@version" => "1","host" => "elk1","message" => "nihao " }
[root@losstash ~]# /usr/local/logstash/bin/logstash -e 'input { stdin {} } output { stdout {codec => rubydebug} } output { elasticsearch { hosts => ["192.168.10.103:9200"] } }'
[root@nodel src]# chmod o+r /var/log/messages //让 Logstash 可以读取日志 [root@nodel src]# ll /var/log/messages -rw----r--. 1 root root 2730043 Sep 11 14:21 /var/log/messages [root@nodel src]# touch /usr/local/logstash/system.conf [root@nodel src]# vim /usr/local/logstash/system.conf input {file{path =>"/var/log/messages"type =>"system"start_position =>"beginning"} } output {elasticsearch { 192.168.10.103hosts => ["192.168.10.101:9200"]index =>"system-%{+YYYY.MM.dd}"} }
运行logstash
[root@elk1 ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/system.conf
2.1.4Filebeat
在产生日志的客户端服务器上安装filebeat(本案例为elk2主机)
[root@elk2 ~]# yum -y install httpd [root@elk2 ~]# systemctl start httpd [root@elk2 ~]# echo 'www.kgc.com' > /var/www/html/index.html [root@elk2 ~]# curl 192.168.10.102 www.kgc.com [root@elk2 ~]# cat /var/log/httpd/access_log 192.168.10.102 - - [28/Apr/2025:20:31:02 +0800] "GET / HTTP/1.1" 20012 "-" "curl/8.4.0" [root@elk2 ~]# cat /var/log/httpd/error_log
安装filebeat
[root@elk2 ~]# tar zxvf filebeat-7.10.0-linux-x86_64.tar.gz [root@elk2 ~]# mv filebeat-7.10.0-linux-x86_64 /usr/local/filebeat
配置web01服务器filebeat的输出
[root@elk2 ~]# cd /usr/local/filebeat/ [root@elk2 filebeat]# mv filebeat.yml filebeat.yml.bak [root@elk2 filebeat]# vim filebeat.ymlfilebeat.inputs: - type: logpaths:- /var/log/httpd/access_log:set paste output.logstash:hosts: ["192.168.10.102:5044"](2)启动 filebeat 服务 [root@elk2 ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml &
修改logstash的配置文件,使日志输出到elasticsearch
[root@elkl ~]# vim /usr/local/logstash/config/beats.confinput {beats {port => "5044"codec => "json"} }output{elasticsearch {hosts => ["192.168.10.103:9200"]index => "weblog-beat-%{+YYYY.MM.dd}"} }
运行logstash
[root@elk1 ~]#/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/beats.conf --path.data=/usr/local/logstash/config.d/web01 &
2.1.5安装Kibana
在elk上安装Kibana
[root@elk1 ~]# tar zxvf kibana-7.10.0-linux-x86_64.tar.gz [root@elk1 ~]# mv kibana-7.10.0-linux-x86_64 /usr/local/kibana
修改Kibana主配置文件
[root@elkl opt]$ vim /usr/local/kibana/config/kibana.yml server.port: 5601 ##2 行,监听端口 server.host: "0.0.0.0" ##7 行,监听地址 elasticsearch.hosts: "http://192.168.10.103:9200" ##28 行,ES 主机的 IP 地址 kibana.index: ".kibana" ##32 行 [root@elkl ~]# chown -R es:es /usr/local/kibana/
启动Kibana服务
[root@localhost ~]# su - es[es@elk1 ~]$ nohup /usr/local/kibana/bin/kibana &