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

ELKStack高效部署与架构解析

ELK Stack 部署与架构


一、架构总览

┌──────────────────────────────────────────────────────────────┐ │ 数据采集层 │ │ Node1(nginx) ─── Filebeat 6.7.2 ─── 采集 /var/log/nginx/* │ │ Apache ──────── Logstash 6.7.2 ──── 采集 httpd 日志 │ └────────────────────────┬─────────────────────────────────────┘ │ (5044 / beats 协议) ▼ ┌──────────────────────────────────────────────────────────────┐ │ 数据处理层 │ │ Apache ──────── Logstash ─── parse / filter / route │ │ (host: 192.168.110.130:5044) │ └────────────────────────┬─────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ 数据存储层 │ │ Node1 (192.168.110.130:9200) ─── ES 6.7.2 ─── my-elk-cluster│ │ Node2 (192.168.110.129:9200) ─── ES 6.7.2 │ │ Index: nginx_access-2024.05.23 │ └────────────────────────┬─────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ 可视化层 │ │ Node1 (192.168.110.130:5601) ─── Kibana 6.7.2 │ │ Index Pattern, Discover, Dashboard │ └──────────────────────────────────────────────────────────────┘

节点角色与 IP 规划

节点IP部署组件角色
Node1192.168.110.130ES + Kibana + Filebeat(Nginx)ES 数据节点, 可视化
Node2192.168.110.129ESES 数据节点
ApacheApache + Logstash日志源, 数据处理
Filebeat节点192.168.110.130Filebeat → Logstash轻量采集 + 转发

二、各组件核心配置

2.1 Elasticsearch(双节点集群)

关键配置文件:/etc/elasticsearch/elasticsearch.yml

# 集群与节点 cluster.name: my-elk-cluster node.name: node1 # node2 为 node2 ​ # 数据与日志路径 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch ​ # 网络 network.host: 0.0.0.0 http.port: 9200 ​ # 内存锁(防止 swap) bootstrap.memory_lock: true ​ # 集群发现(6.x 用 unicast) discovery.zen.ping.unicast.hosts: ["node1", "node2"] ​ # 跨域(elasticsearch-head 需要) http.cors.enabled: true http.cors.allow-origin: "*"

启动与状态检查:

操作命令/URL
启动systemctl start elasticsearch
开机自启systemctl enable elasticsearch
查看节点http://IP:9200
集群健康http://IP:9200/_cluster/health?pretty
集群状态http://IP:9200/_cluster/state?pretty

集群健康三色含义:

颜色含义
green所有主分片和副本都正常分配
yellow主分片正常,部分副本未分配
red有主分片未分配(数据不完整)

2.2 elasticsearch-head(可视化管理)

  • 依赖:Node.js(v8.2.1)+ PhantomJS

  • 端口:9100

  • 启动npm run start &(在/opt/elasticsearch-head/下)

  • 访问http://IP:9100/


2.3 Logstash(数据采集 + 处理)

角色:接收 Filebeat 推送 + 直接读 Apache/Nginx 日志,写入 ES。

配置文件结构(三部分):

input → 定义数据源(文件、beats、stdin 等) filter → 数据处理(grok、date、mutate 等) output → 定义输出目标(ES、stdout 等)

核心配置示例(接收 Filebeat + 写入 ES):

# /etc/logstash/conf.d/filebeat.conf input { beats { port => 5044 # 监听 Filebeat 推送 } } ​ output { elasticsearch { hosts => ["192.168.110.130:9200", "192.168.110.129:9200"] index => "%{[fields][service_name]}-%{+yyyy.MM.dd}" } }

按日志类型分流示例(Apache):

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.110.130:9200"] index => "apache_access-%{+yyyy.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.110.130:9200"] index => "apache_error-%{+yyyy.MM.dd}" } } }

关键参数速查:

参数含义
path日志文件路径,支持通配符/var/log/*.log
typeEvent 类型字段,output 中可据此分流
start_positionbeginning从头读,end从尾部读
hostsES 集群地址(数组格式)
index写入的索引名,支持%{+yyyy.MM.dd}日期变量

常用生命周期命令:

# 命令行测试(stdin → stdout) logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }' ​ # 指定配置文件运行 logstash -f /etc/logstash/conf.d/filebeat.conf ​ # 后台运行 nohup logstash -f filebeat.conf --log.level error > /dev/null 2>&1 & ​ # 清理锁文件(进程异常退出后) rm -f /var/lib/logstash/.lock

2.4 Filebeat(轻量日志收集)

配置文件:/usr/local/filebeat/filebeat.yml

filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log - /var/log/*.log tags: ["filebeat"] fields: service_name: nginx log_type: access from: 192.168.110.130 ​ output.logstash: hosts: ["192.168.110.130:5044"]

后台启动:

nohup ./filebeat -e -c filebeat.yml > filebeat.out 2>&1 &

关键配置项:

配置说明
paths日志路径,支持通配符
fields自定义字段,会随日志发送,output 中%{[fields][xxx]}引用
tags标签,用于筛选
output.logstash发送到 Logstash(注释掉 output.elasticsearch)

2.5 Kibana(可视化平台)

配置文件:/etc/kibana/kibana.yml

server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://192.168.110.130:9200", "http://192.168.110.129:9200"] kibana.index: ".kibana"

启动systemctl start kibana

首次使用流程:

  1. 访问http://192.168.110.130:5601

  2. Management → Index Pattern → Create index pattern

  3. 输入nginx_access-*apache_access-*

  4. 选择@timestamp作为时间字段

  5. 进入 Discover 查看日志


三、数据流向总图

┌──────────┐ 采集 ┌──────────┐ 处理+路由 ┌──────────────┐ 展示 ┌─────────┐ │ Filebeat │ ──5044──→ │ Logstash │ ──9200──→ │ Elasticsearch │ ──5601──→ │ Kibana │ │ (Nginx) │ (beats) │ (Apache) │ (ES写入) │ (双节点集群) │ │ │ └──────────┘ └──────────┘ └──────────────┘ └─────────┘ │ │ │ 也可直接读本地日志 │ Index 命名规则 │ /var/log/xxx │ 服务名-YYYY.MM.DD ▼ ▼ Apache access_log nginx_access-2024.05.23 Apache error_log nginx_error-2024.05.23

四、ES 索引管理(CRUD)

# 创建索引 curl -XPUT localhost:9200/index-demo # 查看索引设置 curl -XGET localhost:9200/index-demo/_settings # 修改副本数 curl -XPUT localhost:9200/index-demo/_settings \ -H "Content-Type: application/json" \ -d '{"number_of_replicas": 2}' # 创建别名 curl -XPOST localhost:9200/_aliases \ -H "Content-Type: application/json" \ -d '{"actions":[{"add":{"index":"index-demo","alias":"user_info_alicas"}}]}' # 删除别名 curl -XPOST localhost:9200/_aliases \ -H "Content-Type: application/json" \ -d '{"actions":[{"remove":{"index":"index-demo","alias":"user_info_alicas"}}]}' # 删除单个索引 curl -XDELETE localhost:9200/index-demo # 删除多个索引 curl -XDELETE localhost:9200/index-demo,index-demo2

五、常见故障场景速查

故障现象排查方向
ES 集群无法发现status: red, 各节点孤立检查discovery.zen.ping.unicast.hosts主机名是否可解析(etchosts 或 DNS)
集群 yellow副本未分配查看是否有足够节点承载副本(单节点集群必然 yellow)
Logstash BOM 报错启动失败配置文件编码确保是 UTF-8 without BOM
Logstash 锁文件无法启动rm -f /var/lib/logstash/.lock
npm install 卡住安装超时切换国内镜像npm config set registry https://registry.npmmirror.com
内存不足ES 启动失败配置bootstrap.memory_lock: true+ 调整 JVM 堆内存
Filebeat 不采集数据为空检查start_position: beginning或日志文件 read 权限

http://www.jsqmd.com/news/887754/

相关文章:

  • ARM架构调试寄存器HTRFCR与TRFCR详解
  • TVA 登顶工业视觉的 “iPhone 时刻”(2)
  • 低延迟可解释AI模型架构设计与边缘计算优化
  • 别再死记硬背Floyd算法了!用动态规划思想拆解‘多源最短路径’问题(附Java/Python代码)
  • C语言指针01
  • 告别Unity默认Text!手把手教你用TextMeshPro打造炫酷UI文字(附中文字体制作避坑指南)
  • ARMv8虚拟化核心:HCRX_EL2寄存器架构与配置详解
  • 用XGBoost和SHAP搞定多分类预测:一份Python 3.7下的实战避坑指南
  • 具身智能的发展面临哪些挑战?
  • Spine动画在Unity里卡顿?性能优化实战:从Draw Call、材质实例化到网格合并
  • ARM调试状态核心机制与PSTATE处理详解
  • 你的模型结果总飘忽不定?可能是异常值在捣鬼:实战对比缩尾、截尾与RobustScaler
  • 给OpenGL学完就忘的你:用Unity Shader重温渲染管线,打通任督二脉
  • OpenGL地球渲染踩坑实录:GLFW、GLUT、FreeGLUT到底怎么选?附性能对比
  • UE5多人联机开发:从游戏大厅到玩家生成的完整蓝图流程(含游戏实例传参)
  • 教育科技产品集成AI批改功能时如何通过Taotoken保障服务稳定性
  • Unity URP程序化材质与立方体纹理实战指南
  • ARM调试与复位机制详解及实践技巧
  • LMD优化器:低精度训练与MXFP6格式的突破
  • 混合求解器:用神经网络增强传统微分方程数值方法
  • 技术美术入门必懂:用OpenGL知识反推Unity Shader与渲染管线(实战解析)
  • CentOS 7下‘Development Tools’和‘开发工具’组有区别吗?实测告诉你答案
  • BetterNCM Installer:Rust构建的网易云音乐插件管理器深度解析
  • 低延迟可解释AI模型在实时决策系统中的应用
  • 现代视角下的《周易》浅谈
  • Win10家庭版别再卡了!保姆级教程:手动修复gpedit.msc路径,彻底关闭Antimalware Service
  • 经颅超声刺激(TUS)技术原理与PlanTUS系统应用指南
  • CVPR 2023反无人机数据集实战:用ModelScope上的开源模型快速上手目标检测
  • 用Python手搓SMO算法:从SVM理论到sklearn源码级复现(附避坑指南)
  • 告别卡顿!用Potree+WebGL在浏览器里流畅查看超大规模点云(附Octree原理详解)