1 ELK 概述
1.1 日志管理背景
服务器、应用会产生系统日志、应用日志、安全日志。传统方式逐台登录服务器 grep/awk 查看日志,服务器数量多的时候效率低下。 ELK(Elastic Stack)开源集中式日志分析平台 ,实现日志统一采集、解析、存储、检索、可视化。 ELK 三大组件:Elasticsearch、Logstash、Kibana;Beats (Filebeat/Metricbeat) 为轻量采集器,替代 Logstash 做前端采集。
数据流:日志源 → Filebeat/Logstash(采集过滤处理) → Elasticsearch(存储索引) → Kibana(Web可视化) → 浏览器
1.2 三大组件作用
- Elasticsearch(ES):分布式搜索分析引擎,"金库"
- 底层基于 Lucene,使用倒排索引,实现近乎实时搜索(毫秒‑1 秒延迟)。
- 分布式架构,分片 + 副本机制,PB 级海量数据,高可用。
- 全部操作提供 RESTful HTTP API;支持全文检索、复杂聚合统计(类似 SQL 的 group by)。
- 端口:9200(HTTP 客户端访问),9300(集群节点之间内部通信)。
- Logstash:服务端数据处理管道,"预处理车间搬运工" 处理流水线三段式:
Input输入 → Filter过滤解析 → Output输出
- Input:多源采集,文件、syslog、kafka、数据库、beats、tcp 等。
- Filter:日志清洗解析,核心插件
- Grok:正则解析非结构化原始日志,提取字段;
- Mutate:修改、重命名、删除字段;
- Date:格式化时间戳;
- GeoIP:根据 IP 解析地理位置;
- KV:解析 key=value 格式日志。
- Output:输出到 Elasticsearch、数据库、消息队列、文件。
Logstash 重量级,资源消耗高;生产前端推荐 Filebeat 轻量采集,再交给 Logstash 做过滤处理。
- Kibana:Web 可视化平台,"监控大屏"
- Discover:交互式日志数据查询浏览,支持 KQL/Lucene 查询语法。
- Visualize:制作图表:折线图、柱状图、饼图、地图、指标看板。
- Dashboard:把多个图表组合成监控大屏。
- Stack Management:索引生命周期 ILM、用户权限、导入导出仪表盘。 端口:5601。
类比理解
- Logstash:柜台运钞,收集整理数据;
- Elasticsearch:金库,存储建立精细索引,快速查找;
- Kibana:监控大屏,可视化展示分析结果。
2 实验环境规划
表格
| 主机 | 系统 | 主机名 | IP | 软件 |
|---|---|---|---|---|
| node1 | CentOS7.9 | node1 | 192.168.108.41 | Elasticsearch、Kibana、elasticsearch‑head |
| node2 | CentOS7.9 | node2 | 192.168.108.42 | Elasticsearch、elasticsearch‑head |
| apache | CentOS7.9 | apache | 192.168.108.43 | Apache httpd、Logstash |
实验目标:搭建 2 节点 ES 集群,采集 apache 访问日志、系统日志送入 ES,Kibana 可视化查看。
3 Elasticsearch 集群部署(node1、node2)
前置准备
- 修改
/etc/hosts主机名解析,两台节点互相解析 node1、node2。 - JDK 环境:openjdk 1.8。
- rpm 包安装 elasticsearch‑5.5.0,systemd 管理服务。
elasticsearch.yml 核心配置
cluster.name: my‑elk‑cluster #集群名称,所有节点必须一致
node.name: node1 #节点名称,每台节点不同
path.data: /data/elk_data #数据存储目录,手动创建,属主elasticsearch
path.logs: /var/log/elasticsearch/ #日志目录
bootstrap.memory_lock: false #关闭内存锁,防止swap交换
network.host: 0.0.0.0 #监听所有IP
http.port: 9200 #http访问端口
discovery.zen.ping.unicast.hosts: ["node1","node2"] #单播集群发现节点
http.cors.enabled: true #开启跨域(给head插件使用)
http.cors.allow‑origin: "*"
创建数据目录:
mkdir -p /data/elk_data ; chown elasticsearch:elasticsearch /data/elk_data
集群验证
- 启动两台节点服务;访问
http://ip:9200输出节点版本信息。 - 集群健康检查 API:
http://192.168.108.41:9200/_cluster/health?pretty
- status 状态:
green:全部主分片 + 副本分片正常,集群健康;yellow:主分片正常,副本分片未分配;red:主分片丢失,数据损坏。
number_of_nodes:2代表识别 2 个节点。
- 查看集群状态:
_cluster/state?pretty。
elasticsearch‑head 插件(可视化集群管理工具,端口 9100)
- 依赖 Node.js、phantomjs;源码 npm 安装依赖。
- ES 配置开启跨域支持,重启 ES。
npm run start &后台启动 head;浏览器访问http://ip:9100,填入 ES 地址http://ip:9200连接集群。
功能:查看节点、分片、索引,执行 REST 测试请求。
curl 简单测试创建索引文档
curl -XPUT 'localhost:9200/index‑demo/test/1?pretty' -H 'Content‑Type:application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
ES5.5 索引默认 5 个主分片 + 1 副本分片,两个节点分担分片。
4 Logstash 部署(apache 节点 192.168.108.43)
- 安装 httpd,产生 apache 访问日志
/var/log/httpd/access_log、error_log;安装 JDK1.8,rpm 安装 logstash。 - logstash 常用命令参数
-e:命令行直接写 pipeline 配置;-f:读取配置文件;-t:测试配置语法是否正确。
测试 1:标准输入→标准输出
logstash -e 'input { stdin{} } output { stdout{} }'
测试 2:rubydebug 格式化输出,观察事件字段
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
测试 3:输入 stdin,输出写入 Elasticsearch
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
不指定索引名,自动生成索引格式
logstash‑YYYY.MM.dd。
读取系统日志文件写入 ES(conf.d 配置文件)
配置文件/etc/logstash/conf.d/system.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.108.41:9200"]
index => "system‑%{+YYYY.MM.dd}"
}
}
重启 logstash,ES-head 观察自动生成system‑日期索引。
5 Kibana 部署(node1 节点,端口 5601)
- rpm 安装 kibana‑5.5.1;修改 kibana 配置指定 elasticsearch 集群地址。
- 启动服务,浏览器访问
http://192.168.108.41:5601。 - 配置索引模式,加载 ES 索引;使用 Discover 查看原始日志,制作可视化图表、Dashboard 大屏。
端口汇总
表格
| 组件 | 端口 | 说明 |
|---|---|---|
| Elasticsearch HTTP | 9200 | 客户端、head、kibana、logstash 访问 |
| Elasticsearch Transport | 9300 | ES 集群节点内部通信 |
| elasticsearch‑head | 9100 | 集群管理 web 插件 |
| Kibana | 5601 | 可视化 web 界面 |
| Logstash API | 9600 | logstash 内部监控 api |
思维导图
