文章目录
-
- 一、ELK系统核心概述
- 二、核心组件深度解析
- 三、ELK工作流程与部署方案
-
- (一)核心工作原理
- (二)基础ELK部署方案(3节点架构)
-
- [1. 部署环境规划(按指定架构调整)](#1. 部署环境规划(按指定架构调整))
- [2. 前置环境准备(所有节点)](#2. 前置环境准备(所有节点))
- [3. Elasticsearch集群部署(Node1:192.168.10.11、Node2:192.168.10.12)](#3. Elasticsearch集群部署(Node1:192.168.10.11、Node2:192.168.10.12))
- [4. Logstash部署(Apache节点:192.168.10.10)](#4. Logstash部署(Apache节点:192.168.10.10))
- [5. Kibana部署(Node1节点:192.168.10.11)](#5. Kibana部署(Node1节点:192.168.10.11))
- (三)Filebeat+ELK部署方案(4节点架构,基于指定IP调整)
-
- [1. 架构升级说明](#1. 架构升级说明)
- [2. Filebeat部署(Filebeat节点:192.168.10.16)](#2. Filebeat部署(Filebeat节点:192.168.10.16))
- [3. Logstash配置调整(Apache节点:192.168.10.10)](#3. Logstash配置调整(Apache节点:192.168.10.10))
- [4. Kibana验证(Node1:192.168.10.11)](#4. Kibana验证(Node1:192.168.10.11))
- 四、关键补充与总结
一、ELK系统核心概述
(一)定义与核心价值
ELK是Elasticsearch、Logstash、Kibana三款开源工具的组合缩写,构成一套完整的日志集中处理解决方案。其核心价值在于打破分布式环境下日志分散存储的壁垒,实现日志数据从多源采集、清洗转换、分布式存储到可视化分析的全流程闭环,满足用户对日志的查询、排序、统计、监控等高级需求,广泛应用于运维监控、故障排查、业务分析、安全审计等场景。
(二)为何选择ELK
- 传统日志分析痛点:单台机器可通过grep、awk等命令简单分析日志,但分布式架构下,日志分散在数十上百台服务器,传统登录逐台查阅的方式效率极低;集中化存储后,复杂查询、排序及大规模数据统计需求难以通过基础Linux命令满足。
- ELK的优势:解决分布式日志集中管理问题,提升故障定位效率;支持实时分析与可视化,让数据洞察更直观;具备高扩展性,可随数据量增长灵活扩容。
(三)完整日志系统的五大特征
- 收集:支持采集系统日志、应用日志、安全日志等多种来源数据;
- 传输:稳定解析、过滤日志数据,确保数据可靠传输至存储系统;
- 存储:提供高可用、可扩展的日志存储能力;
- 分析:支持UI可视化分析,简化数据解读流程;
- 警告:具备错误报告与监控机制,可及时响应异常数据。
二、核心组件深度解析
(一)Elasticsearch:分布式存储与搜索核心
-
基础特性
- 技术底座:基于Lucene全文检索引擎开发,采用Java语言编写,支持RESTful Web接口,可通过浏览器直接通信;
- 核心定位:实时、分布式、可扩展的搜索引擎,兼顾全文搜索与结构化搜索能力,专为大容量数据处理设计。
-
核心功能
- 全文搜索:快速实现文本数据的索引与检索,支持复杂搜索场景;
- 实时数据分析:数据更新与查询实时响应,适配日志分析、监控数据处理等场景;
- 分布式架构:跨集群数据存储与检索,保障高可用性与扩展性;
- RESTful API:支持多语言、多平台集成,降低开发对接成本。
-
架构与核心组件
组件 定义与作用 集群(Cluster) 由1个或多个节点组成,节点协同工作,共享数据与负载 节点(Node) 单个Elasticsearch实例,含主节点、数据节点等角色,负责数据存储与查询处理 索引(Index) 类似传统数据库的"表",存储同类数据集,具有唯一名称 文档(Document) 最小数据单元,JSON格式对象,存储于索引中 分片(Shard) 索引的拆分单元,本质是Lucene索引,实现数据分布式存储与并行处理 副本(Replica) 分片的冗余备份,提升数据安全性与系统容错能力 -
适用场景
- 日志/事件数据分析:与Logstash、Kibana配合,处理大规模日志流数据;
- 全文搜索应用:电商产品搜索、社交媒体内容检索等;
- 监控与报警:结合Kibana实现数据可视化与实时监控;
- 商业智能(BI):复杂数据查询与分析,助力企业决策。
-
优缺点分析
- 优点:高性能(Lucene底层支撑)、易扩展(分布式架构)、灵活性强(多数据类型+复杂查询语法)、开源免费(活跃社区支持);
- 缺点:内存密集型(硬件资源要求高)、学习曲线陡(查询DSL与架构理解难度大)、大型集群管理复杂(需专业调优知识)。
(二)Logstash:数据收集与处理管道
- 基础特性
- 开发语言:Ruby编写,运行于JVM(Java虚拟机);
- 核心定位:动态数据收集与处理引擎,专注于数据的"采集-清洗-转发"全流程。
- 核心功能
- 多源数据收集:支持日志文件、数据库、消息队列等多种数据源,依赖输入插件实现数据提取;
- 灵活数据处理:通过过滤器插件完成数据清洗、格式转换、字段解析(正则解析、日期转换等);
- 多目标数据输出:可将处理后的数据发送至Elasticsearch、关系型数据库、消息队列等;
- 插件化扩展:支持输入、过滤、输出、编码等各类插件,适配个性化需求;
- 实时处理:快速响应数据流,适用于实时日志监控、数据流分析等场景。
- 配置核心结构
- 输入(Input):定义数据来源,如文件、标准输入、数据库等;
- 过滤(Filter):可选组件,实现数据清洗与转换;
- 输出(Output):定义数据目的地,如Elasticsearch、文件系统等。
- 替代/补充组件
- Filebeat:轻量级日志收集器,客户端部署,性能优于Logstash,可直接对接Elasticsearch或通过Logstash转发,适用于EFLK架构;
- Fluentd:更轻量、高效的数据收集器,资源消耗低,适用于Kubernetes集群等场景,组成EFK架构,替代重量级的Logstash;
- 缓存/消息队列(Redis、Kafka等):实现流量削峰、数据缓冲,避免数据丢失,同时解耦架构组件。
(三)Kibana:数据可视化与交互平台
- 基础特性
- 核心定位:Elasticsearch的配套可视化工具,提供Web图形界面,无需直接操作底层数据,专注于数据展示与分析;
- 数据依赖:自身不存储数据,完全依赖Elasticsearch作为数据源。
- 核心功能(10大核心能力)
- 数据可视化:支持折线图、饼图、柱状图、地图等多种图表,支持自定义样式与动态更新;
- 仪表板(Dashboards):聚合多个可视化图表,支持交互式过滤,多维度监控数据;
- 日志管理与搜索:通过"Discovery"功能实时检索原始数据,支持KQL/Lucene查询语法;
- 时间序列分析:借助TSVB工具,创建时间维度数据图表,监控系统性能、用户趋势;
- 报警与监控:设置阈值触发自动报警,及时响应数据异常;
- 安全与访问控制:基于角色的权限管理,支持LDAP、OAuth等外部认证集成;
- 机器学习:集成Elastic Stack机器学习功能,实现异常检测、趋势预测;
- 地理可视化:通过Elastic Maps展示地理数据,支持动态过滤与聚合;
- Canvas与报告:自定义可视化报告,支持PDF、CSV格式导出;
- Stack监控:监控Elasticsearch集群、Logstash管道等组件的健康状态与资源使用。
- 工作原理
- 数据存储:数据预先存储于Elasticsearch,来源包括Logstash、Beats、API等;
- 查询分析:用户通过KQL或Lucene语法发起查询,Kibana将请求转发至Elasticsearch;
- 可视化展示:Elasticsearch返回结果后,Kibana通过图表、仪表板等形式呈现。
- 适用场景
- 日志管理与分析:集中管理日志,快速定位系统故障;
- 实时监控:系统性能、服务状态实时监控,异常及时预警;
- 业务数据分析:销售数据、用户行为数据深度分析;
- 安全分析:检测网络威胁,分析安全日志,实现入侵检测;
- 机器学习预测:金融趋势预测、系统异常识别等。
三、ELK工作流程与部署方案
(一)核心工作原理
- 部署Logstash:在日志源服务器或集中日志服务器部署Logstash;
- 数据采集与处理:Logstash收集多源日志,进行格式化、过滤等处理;
- 数据存储:处理后的数据输出至Elasticsearch集群,Elasticsearch完成索引与存储;
- 可视化展示:Kibana查询Elasticsearch数据,生成图表与仪表板,提供前端交互。
(二)基础ELK部署方案(3节点架构)
1. 部署环境规划(按指定架构调整)
| 节点名称 | 配置规格 | IP地址 | 部署服务 |
|---|---|---|---|
| Node1 | 2C/4G | 192.168.10.11 | Elasticsearch(集群)、Kibana |
| Node2 | 2C/4G | 192.168.10.12 | Elasticsearch(集群) |
| Apache节点 | - | 192.168.10.10 | Logstash、Apache(日志源) |
2. 前置环境准备(所有节点)
-
关闭防火墙与SELinux:
bashsystemctl stop firewalld # 关闭防火墙 setenforce 0 # 关闭SELinux增强功能 -
配置主机名与域名解析:
bash# Node1节点 hostnamectl set-hostname node1 # Node2节点 hostnamectl set-hostname node2 # Apache节点 hostnamectl set-hostname apache # 配置/etc/hosts文件(所有节点统一配置) vim /etc/hosts 192.168.10.11 node1 192.168.10.12 node2 192.168.10.10 apache
-
安装Java环境(要求JDK 1.8+):
bashyum -y install java-1.8.0-openjdk java -version # 验证版本,需显示openjdk version "1.8.0_xxx"

3. Elasticsearch集群部署(Node1:192.168.10.11、Node2:192.168.10.12)
-
安装软件包:
bash# 上传elasticsearch-6.6.1.rpm至/opt目录 cd /opt rpm -ivh elasticsearch-6.6.1.rpm -
配置系统服务:
bashsystemctl daemon-reload systemctl enable elasticsearch.service # 设置开机自启 -
修改主配置文件(/etc/elasticsearch/elasticsearch.yml):
yamlcluster.name: my-elk-cluster # 集群名称(两节点保持一致) node.name: node1 # Node1节点配置,Node2节点改为node2 path.data: /data/elk_data # 数据存储路径 path.logs: /var/log/elasticsearch/ # 日志存储路径 bootstrap.memory_lock: false # 启动时不锁定内存 network.host: 0.0.0.0 # 监听所有地址 http.port: 9200 # 默认端口 discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 集群发现节点(通过主机名关联IP) -
创建数据目录并授权:
bashmkdir -p /data/elk_data chown elasticsearch:elasticsearch /data/elk_data/ # 赋予Elasticsearch用户权限 -
启动并验证:
bashsystemctl start elasticsearch.service netstat -antp | grep 9200 # 检查9200端口是否监听 # 浏览器访问验证(Node1) http://192.168.10.11:9200 # 查看节点信息,返回含"name":"node1"的JSON数据 # 查看集群健康状态(任意节点访问均可) http://192.168.10.11:9200/_cluster/health?pretty # 健康状态说明:green(正常)、yellow(数据完整但副本异常)、red(数据不完整)
-
安装Elasticsearch-head插件(可选,集群可视化管理):
-
安装依赖:
bash# 安装编译依赖 yum install gcc gcc-c++ make -y # 编译安装node.js(上传node-v8.2.1.tar.gz至/opt) cd /opt tar zxvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure && make && make install # 安装phantomjs(上传phantomjs-2.1.1-linux-x86_64.tar.bz2至/opt) tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/ cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin cp phantomjs /usr/local/bin -
安装head插件:
bash# 上传elasticsearch-head.tar.gz至/opt cd /opt tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/ cd /usr/local/src/elasticsearch-head/ npm install # 安装依赖包 -
配置Elasticsearch跨域访问:
bashvim /etc/elasticsearch/elasticsearch.yml # 末尾添加以下内容 http.cors.enabled: true # 开启跨域 http.cors.allow-origin: "*" # 允许所有域名访问 systemctl restart elasticsearch # 重启生效 -
启动head插件:
bashcd /usr/local/src/elasticsearch-head/ npm run start & # 后台启动 netstat -antp | grep 9100 # 检查9100端口监听 # 浏览器访问http://192.168.10.11:9100,输入集群地址http://192.168.10.11:9200,连接后查看集群状态
-
测试索引创建:
bash# 在Node1节点执行命令创建测试索引 curl -X PUT 'localhost:9200/index-demo/test/1?pretty' -H 'Content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}' # 访问head插件的数据浏览功能,可查看索引及文档信息
-

4. Logstash部署(Apache节点:192.168.10.10)
-
安装Apache服务(日志源):
bashyum -y install httpd systemctl start httpd systemctl enable httpd # 设置开机自启 -
安装Logstash:
bash# 上传logstash-6.6.1.rpm至/opt目录 cd /opt rpm -ivh logstash-6.6.1.rpm systemctl start logstash.service systemctl enable logstash.service ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ # 创建软链接,方便命令调用 -
功能测试:
-
标准输入输出测试(验证基础功能):
bashlogstash -e 'input { stdin{} } output { stdout{} }' # 输入任意内容(如www.baidu.com),会返回带时间戳的格式化输出 -
对接Elasticsearch测试(验证数据传输):
bashlogstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.10.11:9200"] } }' # 输入任意内容,通过head插件查看Elasticsearch是否新增索引及数据
-
-
配置日志收集(系统日志+Apache日志):
-
授权日志文件读取权限:
bashchmod +r /var/log/messages # 允许Logstash读取系统日志 -
配置系统日志收集(/etc/logstash/conf.d/system.conf):
yamlinput { file { path => "/var/log/messages" # 系统日志路径 start_position => "beginning" # 从日志开头开始收集 } } output { elasticsearch { hosts => ["192.168.10.11:9200"] # 对接Elasticsearch集群(Node1地址) index => "system-%{+YYYY.MM.dd}" # 索引名称格式(按日期拆分) } } -
配置Apache日志收集(/etc/logstash/conf.d/apache_log.conf):
yamlinput { file { path => "/etc/httpd/logs/access_log" # Apache访问日志路径 type => "access" # 自定义日志类型标识 start_position => "beginning" } file { path => "/etc/httpd/logs/error_log" # Apache错误日志路径 type => "error" # 自定义日志类型标识 start_position => "beginning" } } output { # 按日志类型输出到不同索引 if [type] == "access" { elasticsearch { hosts => ["192.168.10.11:9200"] index => "apache_access-%{+YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.10.11:9200"] index => "apache_error-%{+YYYY.MM.dd}" } } } -
启动并验证配置:
bash# 测试配置文件语法 logstash -t -f /etc/logstash/conf.d/system.conf logstash -t -f /etc/logstash/conf.d/apache_log.conf # 重启Logstash生效 systemctl restart logstash.service # 通过head插件查看是否生成system-*、apache_access-*、apache_error-*索引
-

5. Kibana部署(Node1节点:192.168.10.11)
-
安装Kibana:
bash# 上传kibana-6.6.1-x86_64.rpm至/opt目录 cd /opt rpm -ivh kibana-6.6.1-x86_64.rpm -
修改主配置文件(/etc/kibana/kibana.yml):
yamlserver.port: 5601 # 默认监听端口 server.host: "0.0.0.0" # 监听所有地址,允许外部访问 elasticsearch.hosts: ["http://192.168.10.11:9200"] # 对接本地Elasticsearch服务 kibana.index: ".kibana" # 在Elasticsearch中创建的元数据索引 -
启动并验证:
bashsystemctl start kibana.service systemctl enable kibana.service netstat -antp | grep 5601 # 检查5601端口监听 # 浏览器访问http://192.168.10.11:5601,进入Kibana界面

-
配置索引模式与数据查看:
- 创建系统日志索引模式:
- 点击左侧栏"Management"→"Index Patterns"→"Create index Pattern";
- 索引模式输入"system-*",点击"Next step";
- 时间过滤字段选择"@timestamp",点击"Create index Pattern";
- 创建Apache日志索引模式:
- 重复上述步骤,分别输入"apache_access-"和"apache_error-"创建索引模式;
- 查看日志数据:
- 点击左侧栏"Discover";
- 顶部下拉框选择对应的索引模式(如system-*);
- 可通过时间范围筛选、字段过滤(如添加"host"字段)查看日志详情。
- 创建系统日志索引模式:
(三)Filebeat+ELK部署方案(4节点架构,基于指定IP调整)
1. 架构升级说明
在基础ELK架构中新增Filebeat节点,解决Logstash重量级、资源消耗高的问题,实现轻量级日志采集,架构如下:
| 节点名称 | IP地址 | 部署服务 |
|---|---|---|
| Node1 | 192.168.10.11 | Elasticsearch(集群)、Kibana |
| Node2 | 192.168.10.12 | Elasticsearch(集群) |
| Apache节点 | 192.168.10.10 | Logstash、Apache |
| Filebeat节点 | 192.168.10.16 | Filebeat(轻量采集) |
2. Filebeat部署(Filebeat节点:192.168.10.16)
-
环境准备:
bash# 关闭防火墙与SELinux systemctl stop firewalld setenforce 0 # 配置域名解析(添加集群节点映射) vim /etc/hosts 192.168.10.11 node1 192.168.10.12 node2 192.168.10.10 apache -
安装Filebeat(两种方式任选):
-
二进制安装:
bash# 上传filebeat-6.2.4-linux-x86_64.tar.gz至/opt tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz mv filebeat-6.2.4-linux-x86_64/ /usr/local/filebeat -
RPM安装:
bash# 上传filebeat-6.6.1-x86_64.rpm至/opt rpm -ivh filebeat-6.6.1-x86_64.rpm
-
-
修改配置文件(二进制方式:/usr/local/filebeat/filebeat.yml;RPM方式:/etc/filebeat/filebeat.yml):
yamlfilebeat.prospectors: - type: log enabled: true paths: - /var/log/messages # 监控系统日志 - /var/log/*.log # 监控所有.log后缀日志 fields: # 自定义字段,用于索引区分 service_name: filebeat log_type: system service_id: 192.168.10.16 # 注释Elasticsearch输出,启用Logstash输出 #--------------Elasticsearch output------------------- #output.elasticsearch: # hosts: ["localhost:9200"] #----------------Logstash output--------------------- output.logstash: hosts: ["192.168.10.10:5044"] # 对接Apache节点的Logstash(5044端口为Beats默认端口) -
启动Filebeat:
-
二进制方式:
bashcd /usr/local/filebeat ./filebeat -e -c filebeat.yml & # -e开启日志输出,-c指定配置文件 -
RPM方式:
bashsystemctl start filebeat.service systemctl enable filebeat.service
-
3. Logstash配置调整(Apache节点:192.168.10.10)
-
创建Beats输入配置文件(/etc/logstash/conf.d/logstash-beats.conf):
yamlinput { beats { port => "5044" # 监听Beats连接端口,与Filebeat配置一致 } } output { elasticsearch { hosts => ["192.168.10.11:9200"] # 对接Elasticsearch集群 index => "%{[fields][service_name]}-%{+YYYY.MM.dd}" # 按自定义字段生成索引 } stdout { codec => rubydebug # 控制台输出详细格式(可选,用于调试) } } -
启动Logstash并验证:
bash# 测试配置文件 logstash -t -f /etc/logstash/conf.d/logstash-beats.conf # 启动Logstash(后台运行) logstash -f /etc/logstash/conf.d/logstash-beats.conf & # 通过head插件查看是否生成filebeat-*索引

4. Kibana验证(Node1:192.168.10.11)
- 浏览器访问http://192.168.10.11:5601;
- 点击"Management"→"Index Patterns"→"Create index Pattern";
- 输入索引模式"filebeat-*",点击"Next step";
- 时间过滤字段选择"@timestamp",点击"Create index Pattern";
- 点击"Discover",选择"filebeat-*"索引模式,即可查看Filebeat采集的日志数据。
四、关键补充与总结
(一)关键补充说明
- 版本兼容性:Elasticsearch、Logstash、Kibana、Filebeat需保持版本一致(本次均为6.6.1版本),避免出现协议或功能不兼容问题;
- 资源规划:
- Elasticsearch:生产环境建议单节点4C/8G以上配置,数据目录使用SSD存储提升IO性能;
- Logstash:根据日志吞吐量调整CPU和内存,建议2C/4G以上,高并发场景可搭配Kafka缓冲;
- Kibana:对资源要求较低,2C/2G即可满足基础可视化需求;
- 安全配置:
- 生产环境需开启Elasticsearch认证(如X-Pack),设置用户名密码;
- Kibana配置基于角色的访问控制(RBAC),限制普通用户操作权限;
- 防火墙开放必要端口(9200、5601、5044),禁止无关IP访问;
- 日志轮转:配置Elasticsearch索引生命周期管理(ILM),自动删除过期日志,避免磁盘占满;
- 故障排查:
- 查看组件日志:Elasticsearch(/var/log/elasticsearch/)、Logstash(/var/log/logstash/)、Kibana(/var/log/kibana/);
- 集群健康异常:检查节点网络连通性、数据目录权限、内存是否充足。
(二)总结
ELK Stack凭借"采集-存储-可视化"的全流程能力,成为分布式环境下日志分析的首选方案。Elasticsearch提供高性能的分布式存储与搜索支持,Logstash(或Filebeat)解决多源数据的采集与处理,Kibana则通过直观的可视化界面降低数据解读门槛。
本次部署基于指定IP架构(Node1:192.168.10.11、Node2:192.168.10.12、Apache节点:192.168.10.10),提供了基础ELK与Filebeat+ELK两种部署方案:
- 基础ELK架构:部署简单,适用于中小型场景,直接通过Logstash采集日志;
- Filebeat+ELK架构:通过轻量级Filebeat替代Logstash采集端,降低客户端资源消耗,适用于大规模、多客户端的日志采集场景。
使用ELK的核心价值在于:打破日志数据孤岛,实现集中化管理;通过实时分析与可视化,快速定位系统故障、洞察业务趋势;具备灵活的扩展性,可随业务增长持续适配。但需注意,Elasticsearch的资源消耗与集群管理复杂度较高,新手需投入一定时间学习查询DSL与架构原理,才能充分发挥其性能优势。