【云运维】ELK笔记

ELK

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

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

1. ELK 核心组件

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

  • Elasticsearch:分布式搜索引擎,负责日志的索引、存储与快速检索
  • Logstash:日志采集与格式化工具,支持多源输入、过滤处理、多目标输出
  • Kibana:可视化分析平台,提供 Web 界面实现日志的可视化查询、统计与报表
2. 工作流程
plaintext 复制代码
【应用服务器集群】→【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 地址 操作系统 核心软件 角色
node1 192.168.100.41 CentOS 7 Elasticsearch、Kibana、Elasticsearch-head ES 主节点、Kibana 服务器
node2 192.168.100.42 CentOS 7 Elasticsearch、Elasticsearch-head ES 从节点
apache 192.168.100.43 CentOS 7 Logstash、Apache 日志采集端、应用服务器
2. 基础环境配置(所有节点)
(1)主机名与域名解析
bash 复制代码
# 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,确保所有节点已安装:

bash 复制代码
[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
bash 复制代码
[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(两节点操作一致)
bash 复制代码
# 上传安装包到/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)
bash 复制代码
[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 节点配置(仅修改节点名称)
bash 复制代码
[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. 数据目录授权与服务启动
bash 复制代码
# 创建数据目录并授权
[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表示健康:

bash 复制代码
{
  "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 检查群集状态信息:

bash 复制代码
{
  "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两节点操作一致)
bash 复制代码
# 上传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 插件
bash 复制代码
# 解压插件包
[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 server

Running "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)
bash 复制代码
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl enable httpd --now
1. 安装 Logstash
bash 复制代码
# 上传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服务器上)
bash 复制代码
[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
bash 复制代码
[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(根据需要)

bash 复制代码
# 给所有非root用户开放系统核心日志的读取权限(方便普通用户查看日志排查问题)
[root@apache opt]# chmod o+r /var/log/messages

[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 956537 11月  4 17:01 /var/log/messages
(1)采集系统日志(/var/log/messages)
bash 复制代码
# 创建配置文件 `/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 日志(访问日志 + 错误日志)
bash 复制代码
# 创建配置文件 `/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
bash 复制代码
# 上传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)
bash 复制代码
[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
bash 复制代码
[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 采集端,进一步提升采集效率。

相关推荐
AWS官方合作商2 小时前
深入解析:利用EBS直接API实现增量快照与精细化数据管理(AWS)
运维·云计算·aws
waves浪游2 小时前
基础开发工具(下)
linux·运维·服务器·开发语言·c++
Miki Makimura2 小时前
KVStore 多行文章型键值扩展解析:切片存储与客户端多行交互
运维·服务器·网络·学习
春风霓裳3 小时前
ubuntu磁盘管理、磁盘扩容
linux·运维·ubuntu
广州服务器托管4 小时前
WIN11.26H1.27982.1中简优化版 45进程(2025.11.8)
运维·人工智能·计算机网络·云计算·可信计算技术
拾心214 小时前
【云运维】LNMP 架构部署与应用
运维·架构
亮子AI5 小时前
【Nginx】怎样清除 Nginx 的缓存?
运维·nginx·缓存
vvw&5 小时前
如何在 Ubuntu 24.04 上安装和使用 AdGuard
linux·运维·服务器·ubuntu·adguard
weixin_453253655 小时前
python+playwright自动化如何解决文件上传问题
运维·自动化