企业级应用技术-ELK日志分析系统

发布于:2025-07-02 ⋅ 阅读:(46) ⋅ 点赞:(0)

目录

#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 是三个开源工具的缩写,分别是ElasticsearchLogstashKibana,三者组合形成了一套完整的日志收集、存储、分析与可视化解决方案,广泛应用于日志管理、数据分析、监控告警等场景。

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)

  • 定义:类似数据库中的 “表结构”,用于定义文档中字段的类型(如textkeyworddate)、分词器、是否索引等元数据。

  • 分类

    • 动态映射: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.103
    hosts => ["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" 200


12 "-" "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.yml

filebeat.inputs:
- type: log
  paths:
    - /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.conf

input {
  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 &

  验证Kibana


网站公告

今日签到

点亮在社区的每一天
去签到