企业级日志分析利器:ELK Stack从入门到实战部署

文章目录

    • [一、ELK Stack 核心概念:是什么?为什么用?](#一、ELK Stack 核心概念:是什么?为什么用?)
      • [1.1 什么是 ELK?](#1.1 什么是 ELK?)
      • [1.2 为什么需要 ELK?](#1.2 为什么需要 ELK?)
    • [二、ELK 三大组件深度解析](#二、ELK 三大组件深度解析)
      • [2.1 Elasticsearch:日志存储与检索的"大脑"](#2.1 Elasticsearch:日志存储与检索的“大脑”)
      • [2.2 Logstash:日志收集与处理的"管道"](#2.2 Logstash:日志收集与处理的“管道”)
        • 核心功能
        • [替代工具:为什么需要 Filebeat/Fluentd?](#替代工具:为什么需要 Filebeat/Fluentd?)
      • [2.3 Kibana:日志可视化的"窗口"](#2.3 Kibana:日志可视化的“窗口”)
    • [三、实战:ELK Stack 部署步骤(CentOS 环境)](#三、实战:ELK Stack 部署步骤(CentOS 环境))
      • [3.1 环境准备(所有节点通用)](#3.1 环境准备(所有节点通用))
        • [1. 基础配置](#1. 基础配置)
        • [2. 部署节点规划](#2. 部署节点规划)
      • [3.2 部署 Elasticsearch 集群(Node1 + Node2)](#3.2 部署 Elasticsearch 集群(Node1 + Node2))
        • [1. 安装 ES(两节点操作相同)](#1. 安装 ES(两节点操作相同))
        • [2. 修改 ES 配置文件(关键!)](#2. 修改 ES 配置文件(关键!))
        • [3. 创建数据目录并授权](#3. 创建数据目录并授权)
        • [4. 启动 ES 并验证](#4. 启动 ES 并验证)
        • [5. 安装 ES-Head 插件(可视化管理集群)](#5. 安装 ES-Head 插件(可视化管理集群))
      • [3.3 部署 Logstash(Apache 节点:192.168.10.97)](#3.3 部署 Logstash(Apache 节点:192.168.10.97))
        • [1. 安装 Logstash](#1. 安装 Logstash)
        • [2. 测试 Logstash 功能](#2. 测试 Logstash 功能)
        • [3. 配置 Logstash 收集 Apache 日志](#3. 配置 Logstash 收集 Apache 日志)
        • [4. 启动 Logstash 并验证](#4. 启动 Logstash 并验证)
      • [3.4 部署 Kibana(Node1 节点:192.168.10.98)](#3.4 部署 Kibana(Node1 节点:192.168.10.98))
        • [1. 安装 Kibana](#1. 安装 Kibana)
        • [2. 修改 Kibana 配置文件](#2. 修改 Kibana 配置文件)
        • [3. 验证 Kibana 并添加索引](#3. 验证 Kibana 并添加索引)
      • [3.5 扩展:Filebeat + ELK 部署(轻量日志收集)](#3.5 扩展:Filebeat + ELK 部署(轻量日志收集))
        • [1. 环境规划](#1. 环境规划)
        • [2. 安装 Filebeat(192.168.10.96)](#2. 安装 Filebeat(192.168.10.96))
        • [3. 配置 Filebeat(收集系统日志,发送到 Logstash)](#3. 配置 Filebeat(收集系统日志,发送到 Logstash))
        • [4. 配置 Logstash 接收 Filebeat 数据(Apache 节点)](#4. 配置 Logstash 接收 Filebeat 数据(Apache 节点))
        • [5. 启动并验证](#5. 启动并验证)
    • [四、总结:ELK 实战建议](#四、总结:ELK 实战建议)

在运维和开发工作中,你是否遇到过这样的痛点:数十上百台服务器的日志分散存储,排查问题时需要逐个登录机器用grep/awk检索,效率极低?面对海量日志,想做实时监控、异常报警却无从下手?

今天要介绍的ELK Stack,正是解决这些问题的企业级日志分析方案。它将 Elasticsearch(存储分析)、Logstash(数据收集)、Kibana(可视化)三个开源工具无缝整合,实现了日志从"分散存储"到"集中化、实时化、可视化分析"的闭环。

一、ELK Stack 核心概念:是什么?为什么用?

1.1 什么是 ELK?

ELK 是 Elasticsearch、Logstash、Kibana 三者的缩写,三者各司其职,共同构成完整的日志处理链路:

  • Elasticsearch(ES):核心引擎,负责日志的存储、索引和快速检索,支持分布式架构,能应对海量数据。
  • Logstash:数据管道,从日志文件、数据库、消息队列等来源收集数据,经过过滤、格式化后,发送到 ES。
  • Kibana:可视化工具,通过 Web 界面展示 ES 中的数据,支持图表、仪表盘、日志搜索,让数据"看得见"。

简单说,ELK 就是一套"日志收集→处理→存储→分析→展示"的一体化工具包,除了日志分析,还能用于系统监控、业务数据分析等场景。

1.2 为什么需要 ELK?

传统日志管理的痛点,正是 ELK 的优势所在:

  • 分散日志集中化:无需登录多台机器,所有日志统一存储到 ES 集群。
  • 高效检索与分析:ES 支持全文搜索和实时分析,秒级定位关键日志(比如某条错误日志的出现时间、频率)。
  • 可视化与监控:Kibana 生成折线图、饼图、仪表盘,直观展示系统状态,还能设置异常报警。
  • 应对海量数据:分布式架构支持横向扩展,数据量增长时只需增加节点即可。

一套完整的日志系统需要具备"收集、传输、存储、分析、警告"5大特征,ELK 恰好完美覆盖。

二、ELK 三大组件深度解析

2.1 Elasticsearch:日志存储与检索的"大脑"

ES 是基于 Lucene 开发的分布式搜索引擎,用 Java 编写,通过 RESTful API 与外部交互,核心优势是"快"和"可扩展"。

核心功能
  • 全文搜索:对日志中的文本内容(如错误信息、用户 ID)快速索引和检索,支持模糊匹配、关键词过滤。
  • 实时分析:数据写入后立即可查,适合实时监控(比如实时统计接口报错次数)。
  • 分布式架构:支持跨集群部署,数据自动分片存储,确保高可用和扩展性。
  • RESTful API:用 HTTP 请求即可操作 ES(比如创建索引、查询数据),支持多语言集成。
关键架构组件

理解 ES 架构是部署和调优的基础,核心概念如下:

组件 作用说明
集群(Cluster) 多个 ES 节点组成的集群,共享数据和负载,有唯一集群名(如 my-elk-cluster)。
节点(Node) 单个 ES 实例,分主节点(管理集群)、数据节点(存储数据)等角色。
索引(Index) 类似数据库的"表",存储一类日志(如 system-2024.05.20 表示5月20日的系统日志)。
文档(Document) ES 中最小数据单元,每条日志就是一个文档,格式为 JSON。
分片(Shard) 索引拆分后的片段,每个分片是独立的 Lucene 索引,实现并行处理和水平扩展。
副本(Replica) 分片的备份,用于数据冗余(防止节点宕机丢失数据)和分担查询压力。
优缺点
  • 优点:性能强(全文搜索快)、易扩展、支持复杂查询、开源免费。
  • 缺点:内存消耗大(内存密集型应用)、学习曲线陡(复杂的查询 DSL 语言)、大型集群管理复杂。

2.2 Logstash:日志收集与处理的"管道"

Logstash 是用 Ruby 编写、运行在 JVM 上的数据处理工具,核心是"输入(Input)→过滤(Filter)→输出(Output)"的管道模型。

核心功能
  1. 多源数据收集:支持日志文件、数据库(MySQL)、消息队列(Kafka)、HTTP 等多种输入源,通过"输入插件"扩展。
  2. 灵活数据处理:用"过滤插件"清洗数据(比如提取日志中的 IP、时间字段)、格式转换(比如将字符串时间转为时间戳)、过滤无用日志。
  3. 多目标输出:处理后的数据可发送到 ES、数据库、文件系统,甚至 Kafka,通过"输出插件"适配。
  4. 实时处理:支持流数据实时处理,适合日志监控场景。
替代工具:为什么需要 Filebeat/Fluentd?

Logstash 虽强,但有个明显缺点------重量级(运行在 JVM 上,资源消耗高)。如果需要在大量客户端机器上收集日志,更推荐轻量级工具:

  • Filebeat:ES 官方推出的轻量日志收集器,资源占用低,适合部署在客户端,可直接发送日志到 ES 或转发给 Logstash。
  • Fluentd:比 Logstash 更轻量、性能更高,在 Kubernetes 集群中常用(组成 EFK 架构),支持更多数据格式。

2.3 Kibana:日志可视化的"窗口"

Kibana 是 ES 的可视化前端,无需写代码,通过界面就能实现日志分析和监控,是 ELK 中"最直观"的组件。

核心功能(必用)
  1. 日志搜索(Discovery):实时检索 ES 中的原始日志,支持按时间范围、关键词过滤,可快速定位错误日志。
  2. 数据可视化(Visualizations):生成折线图(趋势分析)、饼图(占比统计)、柱状图(对比分析),比如"按小时统计接口报错次数"。
  3. 仪表盘(Dashboards):将多个可视化图表组合成仪表盘,比如"系统监控仪表盘"包含 CPU 使用率、内存占用、日志报错数。
  4. 报警与监控:设置阈值报警(比如"5分钟内报错次数超过10次则告警"),支持邮件、短信等通知方式。
  5. 机器学习:自动检测数据异常(比如突然飙升的错误日志),适合无人值守监控。
工作原理

Kibana 本身不存储数据,所有数据都来自 ES:

  1. 用户在 Kibana 界面发起查询(比如搜索"ERROR"日志);
  2. Kibana 将查询请求转为 ES 支持的语法(KQL 或 Lucene),发送给 ES;
  3. ES 返回查询结果,Kibana 用图表或列表展示。

三、实战:ELK Stack 部署步骤(CentOS 环境)

接下来我们手把手部署一套 ELK 集群,包含 2 个 ES 节点、1 个 Logstash 节点、1 个 Kibana 节点,最后用 Filebeat 扩展日志收集。

3.1 环境准备(所有节点通用)

1. 基础配置
  • 关闭防火墙和 SELinux(避免端口被拦截):

    bash 复制代码
    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  • 配置主机名和域名解析(以 ES 节点为例):

    bash 复制代码
    # Node1 节点(192.168.10.98)
    hostnamectl set-hostname node1
    # Node2 节点(192.168.10.99)
    hostnamectl set-hostname node2
    # 所有节点添加解析
    echo "192.168.10.98 node1" >> /etc/hosts
    echo "192.168.10.99 node2" >> /etc/hosts
    echo "192.168.10.97 apache" >> /etc/hosts  # Logstash 节点(Apache 服务器)
  • 安装 Java 环境(ES/Logstash 依赖 Java):

    bash 复制代码
    yum -y install java-1.8.0-openjdk
    java -version  # 验证,需显示 1.8.0 及以上
2. 部署节点规划
节点名称 IP 地址 配置 部署服务
Node1 192.168.10.98 2C/4G Elasticsearch、Kibana
Node2 192.168.10.99 2C/4G Elasticsearch
Apache(Logstash) 192.168.10.97 1C/2G Logstash、Apache(日志源)

3.2 部署 Elasticsearch 集群(Node1 + Node2)

1. 安装 ES(两节点操作相同)
bash 复制代码
# 下载 ES 6.6.1 RPM 包(版本需与 Logstash/Kibana 一致)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.1.rpm
# 安装
rpm -ivh elasticsearch-6.6.1.rpm
# 设置开机启动
systemctl daemon-reload && systemctl enable elasticsearch
2. 修改 ES 配置文件(关键!)
bash 复制代码
# 备份默认配置
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
# 编辑配置文件
vim /etc/elasticsearch/elasticsearch.yml

Node1 节点配置 (Node2 节点只需修改 node.namenode2):

yaml 复制代码
# 集群名称(所有节点必须一致)--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
# 监听地址(0.0.0.0 允许所有机器访问)--55--取消注释
network.host: 0.0.0.0
# ES 默认端口(9200 用于 HTTP 通信,9300 用于节点间通信)--59--取消注释
http.port: 9200
# 集群发现节点(指定所有 ES 节点)   --68--取消注释
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
3. 创建数据目录并授权
bash 复制代码
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/  # 给 ES 用户权限
4. 启动 ES 并验证
bash 复制代码
# 启动 ES
systemctl start elasticsearch
# 验证端口(9200 端口监听则正常)
netstat -antp | grep 9200
  • 浏览器访问 http://192.168.10.98:9200,看到以下信息说明 Node1 正常:

    json 复制代码
    {
      "name" : "node1",
      "cluster_name" : "my-elk-cluster",
      "version" : { "number" : "6.6.1" }
    }
  • 查看集群健康状态:访问 http://192.168.10.99:9200/_cluster/health?prettystatusgreen 表示集群健康(yellow 表示副本未就绪,red 表示数据丢失)。

5. 安装 ES-Head 插件(可视化管理集群)

ES-Head 是第三方插件,用于直观查看集群状态、索引信息:

bash 复制代码
# 安装依赖(NodeJS + phantomjs)
yum -y install gcc gcc-c++ make
# 安装 NodeJS(需 8.x 版本,太高版本不兼容)
wget https://nodejs.org/dist/v8.2.1/node-v8.2.1.tar.gz
tar zxvf node-v8.2.1.tar.gz  -C /opt && cd /opt/node-v8.2.1
./configure && make && make install
# 安装 phantomjs
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cp /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
# 安装 ES-Head
wget https://github.com/mobz/elasticsearch-head/archive/master.zip -O elasticsearch-head.tar.gz #该网址不在国内可能下载不了。需要找第三方安装包。
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
npm install  # 安装依赖
# 允许 ES 跨域访问(修改 ES 配置)
echo "http.cors.enabled: true" >> /etc/elasticsearch/elasticsearch.yml
echo "http.cors.allow-origin: \"*\"" >> /etc/elasticsearch/elasticsearch.yml
systemctl restart elasticsearch
# 启动 ES-Head
npm run start &  # 后台运行
  • 浏览器访问 http://192.168.10.98:9100,在"连接"框输入 http://192.168.10.98:9200,看到"集群健康值:green"即成功。

3.3 部署 Logstash(Apache 节点:192.168.10.97)

Logstash 用于收集 Apache 服务器的日志,发送到 ES 集群。

1. 安装 Logstash
bash 复制代码
# 下载 RPM 包
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.1.rpm
# 安装
rpm -ivh logstash-6.6.1.rpm
# 设置开机启动
systemctl enable logstash && systemctl start logstash
# 创建软链接(方便命令行调用)
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
2. 测试 Logstash 功能

先通过简单命令测试 Logstash 的"输入→输出"管道:

bash 复制代码
# 标准输入→标准输出(输入内容后按回车,会输出格式化日志)
logstash -e 'input { stdin{} } output { stdout{} }'
# 测试对接 ES:输入内容会发送到 ES(无标准输出,需在 ES-Head 查看)
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.10.98:9200"] } }'
3. 配置 Logstash 收集 Apache 日志

创建 Logstash 配置文件,收集 Apache 的访问日志和错误日志:

bash 复制代码
# 安装 Apache(生成日志源)
yum -y install httpd && systemctl start httpd
# 创建 Logstash 配置文件
vim /etc/logstash/conf.d/apache_log.conf

配置内容:

yaml 复制代码
# 输入:收集 Apache 日志
input {
  file {
    path => "/etc/httpd/logs/access_log"  # Apache 访问日志路径
    type => "apache_access"               # 日志类型(用于区分输出)
    start_position => "beginning"         # 从日志开头收集
  }
  file {
    path => "/etc/httpd/logs/error_log"   # Apache 错误日志路径
    type => "apache_error"                # 日志类型
    start_position => "beginning"
  }
}

# 输出:根据日志类型发送到 ES 不同索引
output {
  if [type] == "apache_access" {
    elasticsearch {
      hosts => ["192.168.10.98:9200"]    # ES 地址
      index => "apache_access-%{+YYYY.MM.dd}"  # 索引名(按日期拆分)
    }
  }
  if [type] == "apache_error" {
    elasticsearch {
      hosts => ["192.168.10.98:9200"]
      index => "apache_error-%{+YYYY.MM.dd}"
    }
  }
}
4. 启动 Logstash 并验证
bash 复制代码
# 重启 Logstash(加载新配置)
systemctl restart logstash
# 在 ES-Head 查看:在索引栏会出现 apache_access-2024.05.20 等索引

3.4 部署 Kibana(Node1 节点:192.168.10.98)

Kibana 对接 ES 集群,实现日志可视化。

1. 安装 Kibana

cd /opt

bash 复制代码
# 下载 RPM 包
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.1-x86_64.rpm
# 安装
rpm -ivh kibana-6.6.1-x86_64.rpm
# 设置开机启动
systemctl enable kibana && systemctl start kibana
2. 修改 Kibana 配置文件
bash 复制代码
vim /etc/kibana/kibana.yml

关键配置:

yaml 复制代码
# Kibana 监听端口(默认 5601)--2--取消注释
server.port: 5601
# 监听地址(0.0.0.0 允许外部访问)--7--取消注释,
server.host: "0.0.0.0"
# 对接 ES 集群地址--28--取消注释, 
elasticsearch.hosts: ["http://192.168.10.98:9200"]
# Kibana 在 ES 中创建的索引(存储 Kibana 配置)--37--取消注释
kibana.index: ".kibana"
systemctl start kibana.service    #开启服务
systemctl enable kibana.service   #设置开机自启动
netstat -natp | grep 5601         #查看端口状态
3. 验证 Kibana 并添加索引
  • 浏览器访问 http://192.168.10.98:5601,首次登录需添加 ES 索引:

    1. 点击左侧 Management → Index Patterns → Create index pattern

    2. 输入索引前缀(如 apache_access-*),点击 Next step

    3. 时间字段选择 @timestamp(日志时间),点击 Create index pattern

    4. 重复步骤添加 apache_error-* 索引。

  • 查看日志:点击左侧 Discover ,选择索引(如 apache_access-*),即可看到 Apache 访问日志,支持按时间、关键词过滤。

3.5 扩展:Filebeat + ELK 部署(轻量日志收集)

如果需要在多台客户端机器收集日志,用 Filebeat 替代 Logstash 作为前端收集器,资源消耗更低。

1. 环境规划

新增 Filebeat 节点:

节点名称 IP 地址 配置 部署服务
Filebeat 192.168.10.16 1C/1G Filebeat
2. 安装 Filebeat(192.168.10.96)
bash 复制代码
# 安装 RPM 包
cd /opt
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.1-x86_64.rpm
rpm -ivh filebeat-6.6.1-x86_64.rpm
3. 配置 Filebeat(收集系统日志,发送到 Logstash)
bash 复制代码
vim /etc/filebeat/filebeat.yml

关键配置:

yaml 复制代码
# 收集的日志路径
filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/messages  # 系统日志
    - /var/log/*.log     # 其他日志

# 输出到 Logstash(而非直接到 ES)
output.logstash:
  hosts: ["192.168.10.97:5044"]  # Logstash 地址和端口(5044 是 beats 输入默认端口)
4. 配置 Logstash 接收 Filebeat 数据(Apache 节点)
bash 复制代码
vim /etc/logstash/conf.d/logstash_beats.conf

配置内容:

yaml 复制代码
# 输入:接收 Filebeat 数据
input {
  beats {
    port => 5044  # 监听 5044 端口
  }
}

# 输出:发送到 ES
output {
  elasticsearch {
    hosts => ["192.168.10.98:9200"]
    index => "filebeat-%{+YYYY.MM.dd}"  # 索引名
  }
  stdout { codec => rubydebug }  # 同时输出到控制台(调试用)
}
5. 启动并验证
bash 复制代码
# 启动 Filebeat
systemctl start filebeat && systemctl enable filebeat
# 启动 Logstash(加载新配置)
logstash -f /etc/logstash/conf.d/logstash_beats.conf &
# 在 Kibana 添加索引 `filebeat-*`,查看系统日志

四、总结:ELK 实战建议

  1. 版本一致性:ES、Logstash、Kibana、Filebeat 版本必须一致(如均用 6.6.1),否则可能出现兼容性问题。
  2. 资源配置:ES 对内存要求高,生产环境建议每个节点至少 4G 内存,且避免与其他服务混部署。
  3. 索引管理 :日志索引按日期拆分(如 apache_access-2024.05.20),定期删除旧索引(可用 ES 索引生命周期管理 ILM)。
  4. 监控 ELK 自身:用 Kibana 监控 ES 集群健康、Logstash 管道状态,避免 ELK 自身故障导致日志丢失。
  5. 安全加固:生产环境需开启 ES 认证(如 X-Pack)、限制 Kibana 访问 IP,防止未授权访问。

ELK Stack 是企业级日志分析的"标配",从入门到精通需要不断实践------比如用它监控微服务日志、分析用户行为数据。希望本文的部署教程能帮你快速搭建起第一套 ELK 系统,后续可根据业务需求逐步优化!

相关推荐
纳切威4 小时前
CentOS 9部署Zabbix7.0 Agent2端
linux·运维·centos·zabbix
qyhua4 小时前
Linux CentOS 修改主机名称详解
linux·运维·centos
我不是立达刘宁宇5 小时前
实验室:将 XSS 反映到 HTML 上下文中,大多数标记和属性都被阻止
运维
ZYMFZ5 小时前
Linux系统Nginx服务(三)
linux·运维·nginx
TeleostNaCl5 小时前
SMBJ 简单使用指南 实现在 Java/Android 程序中访问 SMB 服务器
android·java·运维·服务器·经验分享·kotlin
weixin_749949905 小时前
当没办法实现从win复制东西到Linux虚拟机时的解决办法
linux·运维·服务器
时空自由民.5 小时前
SC3336 rgb sensor linux
linux·运维·服务器
我就要用Cx3305 小时前
微服务配置管理
java·运维·微服务
我好饿16 小时前
自动化运维工具 Ansible 集中化管理服务器
运维·自动化·ansible