当前位置: 首页 > news >正文

ELK学习记录

ELK

一、ELK 简介:为什么选择 ELK?

在运维工作中,日志是排查故障、优化性能的核心依据,但分散在多台服务器的日志管理效率极低。传统的grep/awk/wc命令在面对海量日志时力不从心,而ELK 开源日志分析平台完美解决了这一痛点。

1. ELK 核心组件

ELK 由三大开源工具组成,各司其职又无缝协作:

  • Elasticsearch:分布式搜索引擎,负责日志的索引、存储与快速检索
  • Logstash:日志采集与格式化工具,支持多源输入、过滤处理、多目标输出
  • Kibana:可视化分析平台,提供 Web 界面实现日志的可视化查询、统计与报表
2. 工作流程
【应用服务器集群】→【Logstash采集器】→【Elasticsearch集群】→【Kibana】→【浏览器】

核心步骤:

  1. 日志集中采集(Beats/Logstash)
  2. 日志格式化处理(Logstash)
  3. 索引与存储(Elasticsearch)
  4. 可视化展示(Kibana)

二、前置知识:ELK 核心概念速览

1. Elasticsearch 关键概念
ES 概念关系型数据库类比说明
集群(Cluster)数据库集群由多个节点组成,共同存储数据
节点(Node)数据库服务器单个 Elasticsearch 实例
索引(Index)数据库相似文档的集合(需小写命名)
类型(Type)数据表索引内的逻辑分类(ES7 + 已废弃)
文档(Document)数据行最小数据单元,JSON 格式存储
副本(Replica)数据备份提升可用性,分担查询压力

默认配置:Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片

2. Logstash 核心能力
  • 三大核心功能:采集(Collect)→ 处理(Enrich)→ 传输(Transport)
  • 核心组件:Shipper(采集端)、Indexer(存储端)、Broker(转发枢纽)
  • 配置结构:Input(输入)→ Filter(过滤,可选)→ Output(输出)
3. Kibana 核心功能
  • 无缝集成 Elasticsearch,支持多种可视化图表(柱状图、折线图、地图等)
  • 提供 Dashboard 自定义仪表盘,实时展示关键指标
  • 支持日志全文检索、过滤、导出

三、实验环境准备

1. 服务器规划
主机名IP 地址操作系统核心软件角色
node1192.168.100.41CentOS 7Elasticsearch、Kibana、Elasticsearch-headES 主节点、Kibana 服务器
node2192.168.100.42CentOS 7Elasticsearch、Elasticsearch-headES 从节点
apache192.168.100.43CentOS 7Logstash、Apache日志采集端、应用服务器
2. 基础环境配置(所有节点)
(1)主机名与域名解析
# node1节点
[root@localhost ~]# hostnamectl set-hostname node1
[root@node1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.100.41/24 ipv4.gateway 192.168.100.2 ipv4.dns 192.168.100.2 autoconnect yes
[root@node1 ~]# nmcli connection up ens33[root@node1 ~]# echo -e "192.168.100.41 node1\n192.168.100.42 node2" >> /etc/hosts# node2节点
[root@localhost ~]# hostnamectl set-hostname node2
[root@node2 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.100.42/24 ipv4.gateway 192.168.100.2 ipv4.dns 192.168.100.2 autoconnect yes
[root@node2 ~]# nmcli connection up ens33[root@node2 ~]# echo -e "192.168.100.41 node1\n192.168.100.42 node2" >> /etc/hosts# apache节点
[root@localhost ~]# hostnamectl set-hostname apache
[root@apache ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.100.43/24 ipv4.gateway 192.168.100.2 ipv4.dns 192.168.100.2 autoconnect yes[root@apache ~]# nmcli connection up ens33
(2)Java 环境检查

ELK 依赖 Java 8,确保所有节点已安装:

[root@localhost ~]# java -version      # 需输出openjdk 1.8.0_xxx
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
# 未安装则执行:yum -y install java-1.8.0-openjdk
(3)关闭防火墙与 SELinux
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config    

四、Elasticsearch 集群部署(node1+node2)

1. 安装 Elasticsearch(两节点操作一致)
# 上传安装包到/opt目录,执行安装
[root@node1,2 ~]# cd /opt
[root@node1,2 opt]# rpm -ivh elasticsearch-5.5.0.rpm# 配置系统服务
[root@node1,2 opt]# systemctl daemon-reload
[root@node1,2 opt]# systemctl enable elasticsearch.service --now
2. 更改elasticsearch主配置文件
(1)node1 节点配置(/etc/elasticsearch/elasticsearch.yml)
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-elk-cluster  # 集群名称(两节点必须一致)
23 node.name: node1              # 节点名称(唯一)
33 path.data: /data/elk_data     # 数据存储路径
37 path.logs: /var/log/elasticsearch/  # 日志存放路径
43 bootstrap.memory_lock: false  # 不锁定内存(生产环境建议开启)
55 network.host: 0.0.0.0         # 提供服务绑定的IP地址,0.0.0.0代表所有地址
59 http.port: 9200               # 侦听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]  # 集群发现节点
(2)node2 节点配置(仅修改节点名称)
[root@node2 opt]# cp /etc/elasticsearch/elasticsearch.yml
[root@node2 opt]# vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-elk-cluster  # 集群名称(两节点必须一致)
23 node.name: node2              # 节点名称(唯一)
33 path.data: /data/elk_data     # 数据存储路径
37 path.logs: /var/log/elasticsearch/  # 日志存放路径
43 bootstrap.memory_lock: false  # 不锁定内存(生产环境建议开启)
55 network.host: 0.0.0.0         # 提供服务绑定的IP地址,0.0.0.0代表所有地址
59 http.port: 9200               # 侦听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]  # 集群发现节点
3. 数据目录授权与服务启动
# 创建数据目录并授权
[root@node1,2 opt]# mkdir -p /data/elk_data
[root@node1,2 opt]# chown elasticsearch:elasticsearch /data/elk_data/# 启动服务
[root@node1,2 elasticsearch]# systemctl start elasticsearch.service
[root@node1,2 elasticsearch]# netstat -antp | grep 9200  # 验证9200端口监听
tcp6       0      0 :::9200                 :::*                    LISTEN      64463/java 
4. 集群状态验证
(1)浏览器访问验证
  • 访问 http://192.168.100.41:9200,显示 node1 节点信息

    在这里插入图片描述

  • 访问 http://192.168.100.42:9200,显示 node2 节点信息

    在这里插入图片描述

(2)集群健康检查

访问 http://192.168.100.41:9200/_cluster/health?pretty,状态为green表示健康:

{"cluster_name" : "my-elk-cluster","status" : "green",         # green=健康,yellow=副本缺失,red=主分片缺失"timed_out" : false,"number_of_nodes" : 2,"number_of_data_nodes" : 2,"active_primary_shards" : 26,"active_shards" : 52,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0

访问 http://192.168.100.41:9200/_cluster/state?pretty 检查群集状态信息:

{"cluster_name" : "my-elk-cluster","version" : 3,"state_uuid" : "zuaMTDpvSda623YUbT9cug","master_node" : "57eKWdF6Q8u5Te0EI70OfA","blocks" : { },"nodes" : {"copPtNelTvKnHfAd51GXMw" : {"name" : "node2","ephemeral_id" : "kU5iJbKASEScfPSLBuEbpw","transport_address" : "192.168.100.42:9300","attributes" : { }},"57eKWdF6Q8u5Te0EI70OfA" : {"name" : "node1","ephemeral_id" : "I4r9U6oMQRKOBCgxL747-A","transport_address" : "192.168.100.41:9300","attributes" : { }}},"metadata" : {"cluster_uuid" : "kWji5N02SvmMjKRzvKoMrw","templates" : { },"indices" : { },"index-graveyard" : {"tombstones" : [ ]}},"routing_table" : {"indices" : { }},"routing_nodes" : {"unassigned" : [ ],"nodes" : {"57eKWdF6Q8u5Te0EI70OfA" : [ ],"copPtNelTvKnHfAd51GXMw" : [ ]}}
}

五、Elasticsearch-head 插件安装(可视化管理)

1. 依赖安装(node1和node2两节点操作一致)
# 上传node-v8.2.1.tar.gz到/opt
# 安装编译依赖
[root@node1,2 ~]# yum install -y gcc gcc-c++ make# 编译安装node组件依赖包,耗时比较长,约47分钟
[root@node1,2 ~]# cd /opt
[root@node1,2 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node1,2 opt]# cd node-v8.2.1/
[root@node1,2 node-v8.2.1]# ./configure 
[root@node1,2 node-v8.2.1]# make -j2   (等待时间较长)
[root@node1,2 node-v8.2.1]# make install
# 安装PhantomJS前端框架(上传软件包到/usr/local/src/)
[root@node1,2 node-v8.2.1]# cd /usr/local/src
[root@node1,2 src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1,2 src]# cp phantomjs-2.1.1-linux-x86_64/bin
[root@node1,2 bin]# cp phantomjs /usr/local/bin
2. 安装并启动 head 插件
# 解压插件包
[root@node1,2 bin]# cd /usr/local/src
[root@node1,2 src]# tar xzvf elasticsearch-head.tar.gz
[root@node1,2 src]# cd elasticsearch-head
[root@node1,2 elasticsearch-head]# npm instal# 配置ES跨域访问(修改elasticsearch.yml)
[root@node1,2 elasticsearch-head]# cd ~
[root@node1,2 ~]# vim /etc/elasticsearch/elasticsearch.yml 
# 下面的配置文件,插入文件的末尾
http.cors.enabled: true       ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*"   ## 跨域访问允许的域名地址
[root@node1,2 ~]# systemctl restart elasticsearch.service# 启动head插件(后台运行)
[root@node1,2 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1,2 elasticsearch-head]# npm run start &     # 切换到后台运行
[1] 114729
[root@node1,2 elasticsearch-head]# 
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt serverRunning "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100[root@node1,2 elasticsearch-head]# netstat -lnupt | grep 9100  # 验证9100端口
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      114739/grunt    
[root@node1,2 elasticsearch-head]# netstat -lnupt |grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      114626/java     
3. 访问 head 管理界面

浏览器访问 http://192.168.100.41:9100,输入 ES 地址 http://192.168.100.41:9200,即可看到集群状态、索引信息等。(可以看见集群很健康是绿色)

在这里插入图片描述

六、Logstash 部署与日志采集(apache 节点)

0. 安装Apache服务(httpd)
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl enable httpd --now
1. 安装 Logstash
# 上传logstash-5.5.1.rpm到/opt目录下
[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service --now
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/  # 建立软连接
2. 功能测试(确保 Logstash 正常工作)

确认logstash(Apache)与elasticsearch(node)功能是否正常,做对接测试
Logstash这个命令测试,字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是” ”,则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出

(1)标准输入→标准输出(登录192.168.100.43 在Apache服务器上)
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
。。。。。。。。。。省略。。。。。。。。
10:08:54.060 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
2025-11-04T02:08:54.116Z apache 
10:08:54.164 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com                                       ####需要输入www.baidu.com
2025-11-04T02:10:11.313Z apache www.baidu.com
www.sina.com.cn                                     ####需要输入www.sina.com.cn
2025-11-04T02:10:29.778Z apache www.sina.com.cn# 使用rubydebug显示详细输出,codec为一种编解码器
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
。。。。。。。。省略。。。。。。。。。
10:15:07.665 [[main]-pipeline-manager] INFO  logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
The stdin plugin is now waiting for input:
10:15:07.693 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
10:15:07.804 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com
{"@timestamp" => 2025-11-04T02:15:39.136Z,"@version" => "1","host" => "apache","message" => "www.baidu.com"
}
(2)标准输入→Elasticsearch
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.41:9200"] } }'
# 输入测试内容,在head插件中查看是否生成logstash-*索引
。。。。。。。。省略。。。。。。。
The stdin plugin is now waiting for input:
10:40:06.558 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com                    ###输入内容
www.sina.com.cn                   ###输入内容
www.google.com.cn                ###输入内容

打开浏览器 输入http://192.168.100.41:9100/ 查看索引信息

在这里插入图片描述

3. 配置日志采集(系统日志 + Apache 日志)

登录192.168.100.43 Apache主机 做对接配置

Logstash配置文件:主要由三部分组成:input、output、filter(根据需要)

# 给所有非root用户开放系统核心日志的读取权限(方便普通用户查看日志排查问题)
[root@apache opt]# chmod o+r /var/log/messages[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 956537 114 17:01 /var/log/messages
(1)采集系统日志(/var/log/messages)
# 创建配置文件 `/etc/logstash/conf.d/system.conf`
[root@apache opt]# vim /etc/logstash/conf.d/system.conf 
input {file {path => "/var/log/messages"    # 日志路径type => "system"               # 日志类型标识start_position => "beginning"  # 从文件开头读取}
}
output {elasticsearch {hosts => ["192.168.100.41:9200"]  # ES集群地址index => "system-%{+YYYY.MM.dd}"  # 索引名称(按日期拆分)}
}# 重启服务
[root@apache opt]# systemctl restart logstash.service

打开浏览器 输入http://192.168.100.41:9100/ 查看索引信息:多出 system-2025.11.04

在这里插入图片描述

(2)采集 Apache 日志(访问日志 + 错误日志)
# 创建配置文件 `/etc/logstash/conf.d/apache_log.conf`
[root@apache opt]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vim apache_log.conf
input {# 访问日志file {path => "/etc/httpd/logs/access_log"type => "access"start_position => "beginning"}# 错误日志file {path => "/etc/httpd/logs/error_log"type => "error"start_position => "beginning"}
}
output {# 按日志类型拆分索引if [type] == "access" {elasticsearch {hosts => ["192.168.100.41:9200"]index => "apache_access-%{+YYYY.MM.dd}"}}if [type] == "error" {elasticsearch {hosts => ["192.168.100.41:9200"]index => "apache_error-%{+YYYY.MM.dd}"}}
}# 运行Logstash,使用 apache_log.conf 配置文件采集/处理Apache日志(Logstash是日志收集分析工具)
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf

打开浏览器 输入http://192.168.100.41:9100/ 查看索引信息:(多出了apache_error-2025.11.04 apache_access-2025.11.04 )

在这里插入图片描述

七、Kibana 部署与可视化(仅node1 节点)

1. 安装 Kibana
# 上传kibana-5.5.1-x86_64.rpm 到/usr/local/src目录
[root@node1 ~]# cd /usr/local/src
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
2. 核心配置文件修改(/etc/kibana/kibana.yml)
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
2 server.port: 5601                # kibana打开的端口
7 server.host: "0.0.0.0"           # kibana侦听的地址,监听所有IP
21 elasticsearch.url: "http://192.168.100.41:9200"  # 和elasticsearch建立联系
30 kibana.index: ".kibana"         # 在elasticsearch中添加.kibana索引
3. 启动 Kibana
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
# 验证5601端口
[root@node1 kibana]# netstat -antp | grep 5601
tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      1575/node         
4. Kibana 可视化配置
(1)访问 Kibana 界面

浏览器访问 http://192.168.100.41:5601

在这里插入图片描述

(2)创建索引模式
  1. 点击左侧 Management → Index Patterns → Create index pattern
  2. 分别创建以下索引模式(匹配 Logstash 生成的索引):
    • 系统日志:system-*
    • Apache 访问日志:apache_access-*
    • Apache 错误日志:apache_error-*
  3. 每个索引模式创建时,选择时间字段(默认@timestamp

在这里插入图片描述

(3)日志查询与可视化
  1. 点击左侧 Discover,选择对应的索引模式,即可查看日志详情
  2. 可通过过滤条件(如host:apache)筛选日志
  3. 点击字段旁的Add,可自定义展示字段
  4. 点击 Visualize,可创建柱状图、折线图等可视化图表
  5. 点击 Dashboard,可组合多个可视化图表,创建自定义仪表盘

在这里插入图片描述

八、总结

通过以上步骤,我们完成了 ELK 集群的完整部署,实现了:

  1. Elasticsearch 双节点集群,提供高可用的索引与存储服务
  2. Logstash 采集 Apache 服务器的系统日志与 Apache 日志,格式化后写入 ES
  3. Kibana 提供可视化界面,支持日志查询、过滤、统计与报表展示

ELK 平台的优势在于其分布式架构、强大的检索能力和灵活的可视化功能,适用于中小型企业的日志集中化管理需求。生产环境中,还可结合 Beats(轻量级采集器)替代 Logstash 采集端,进一步提升采集效率。

http://www.dtcms.com/a/568796.html

相关文章:

  • Paho MQTT C 客户端源码深入解析
  • 零基础学AI大模型之RAG系统链路构建:文档切割转换全解析
  • Vue 核心语法详解:模板语法中的绑定表达式与过滤器(附 Vue3 替代方案)
  • CentOS7.6 部署 k3s 单机版
  • 【算法训练营 · 专项练习篇】Stream流与函数式编程
  • 泰州企业做网站百度地图怎么导航环线
  • int8_to_float(output_tensor->data.int8, output_float, load_class_num);
  • 使用Nmap扫描某个服务器所有开放端口
  • 如何看网站是用什么程序做的如何把qq音乐导入到wordpress
  • SpringCloud网关实战:路由与鉴权全解析
  • 基于ResNet50和PyTorch的猫狗图像分类系统设计与实现
  • 自回归模型例题(AR)与ACF/PACF图绘制
  • ESP32-WROOM-32E LED点灯系列
  • 《红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》 第15篇 | 结语:无尽的前沿——PLMN的未来与中国的全球角色
  • 付网站开发费计入什么科目seo外包杭州
  • 外贸网站域名被封免费网络游戏大全
  • PySide6 Win10记事本从零到一——第七章 格式菜单界面与功能实现
  • PDF文件损坏打不开怎么修复?2025年最新修复工具测评与对比
  • 谈谈MYSQL索引失效场景
  • Qwen-Image-Edit本地到底如何部署使用?怎么还有comfyui
  • 佳能LBP6018L打印浅淡问题的尝试性解决方法
  • 微算法科技(NASDAQ MLGO):以隐私计算区块链筑牢多方安全计算(MPC)安全防线
  • SpringCache :让缓存开发更高效
  • 电路分析 | Phasor Analysis(篇 1)
  • 网站备案取消长春网站建设模板样式
  • get_ccopt系列命令介绍(二)
  • 成都工业学院文献检索在哪个网站做破解wordpress密码
  • 做网站用什么系统好网站登录验证码是怎么做的
  • SQL语法基础教程
  • 算法25.0