news 2026/8/13 23:43:23

ELK分布式日志平台搭建 + ES集群安全与监控综合实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ELK分布式日志平台搭建 + ES集群安全与监控综合实践

一、Elasticsearch

1.1 集群部署

server1:

  • 本地rpm方式安装Elasticsearch 7.6.1
  • 修改系统资源软硬限制,ES需要大量打开文件、创建线程,系统默认限制过低,运行一段时间会崩溃。

[root@server1 ~]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm

[root@server1 ~]# cd /etc/elasticsearch/

  • 修改ES核心配置文件,义集群名称、节点名称、集群节点地址、开放外部访问,实现多台机器组建集群。

[root@server1 elasticsearch]# vim elasticsearch.yml

  • 修改系统资源软硬限制,ES需要大量打开文件、创建线程,系统默认限制过低,运行一段时间会崩溃。

[root@server1 elasticsearch]# vim /etc/security/limits.conf

  • 修改systemd服务配置,通过systemd启动的程序会忽略limits.conf,必须在服务文件内单独声明资源上限。

[root@server1 elasticsearch]# vim /usr/lib/systemd/system/elasticsearch.service

  • 重载服务

[root@server1 elasticsearch]# systemctl daemon-reload

  • 临时关闭swap交换分区,ES官方禁用swap;内存和磁盘交换会极大降低检索性能,容易引发集群卡顿、节点脱离集群。

[root@server1 elasticsearch]# swapoff -a

  • 将下方图片圈出来的一行注释掉,永久关闭 swap 分区

[root@server1 elasticsearch]# vim /etc/fstab

  • 启动ES并设置开机自启

[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl enable --now elasticsearch

  • 查看是否配置成功

  • 免密登录,将改过的配置文件拷贝给server2和server3,记得修改node.name为本机名称,如果注释掉就不用管了,否则很有可能开启不了

ssh-keygen

ssh-copy-id server2

ssh-copy-id server3

[root@server1 elasticsearch]# scp elasticsearch.yml server2:/etc/elasticsearch/

[root@server1 elasticsearch]# scp /etc/security/limits.conf server2:/etc/security/
[root@server1 elasticsearch]# scp /usr/lib/systemd/system/elasticsearch.service

  • server2和server3上的操作和server1操作一样

[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# systemctl start elasticsearch
[root@server2 ~]# systemctl enable --now elasticsearch

1.2 Cerebro部署

Cerebro:ES集群Web可视化管理工具,图形化查看节点、分片、索引状态,替代大量curl命令。

  • 新打开一个虚拟机server4,不要在ES集群上安装下载,很有可能因为内存不够而崩溃。
  • 安装yum工具集,提供yum-config-manager命令,用来添加第三方软件源。
  • 加阿里云Docker官方yum源
  • 完整安装Docker引擎、客户端、容器运行时、compose插件

yum install -y yum-utils

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

  • 后台运行cerebro容器

systemctl enable --now docker

docker run -d --name cerebro -p 9000:9000 lmenezes/cerebro

  • 浏览器访问,填写集群内任一节点的IP地址

  • 此时master为server1

1.3 集群节点角色划分

  • 修改配置文件/etc/elasticsearch/elasticsearch.yml

server1

server2

server3

  • 重新配置后重启服务,server2为master,会自动选举master

  • 故意down掉server2的elasticsearch,会自动选举server1为master

  • 启动服务,server2自动加入集群,此时为从

二、logstash——数据采集

  • 重新开了个虚拟机server5

2.1 部署

  • 安装JDK11,Logstash7.6.1 运行依赖Java环境,必须预先部署JDK。
  • Logstash负责采集→过滤→输出日志
  • 命令行临时启动一条简易管道,验证Logstash能否正常启动,测试基础输入输出流程。

[root@server5 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm

[root@server5 ~]# yum install -y logstash-7.6.1.rpm
[root@server5 ~]# /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

  • 出现successfully,可输入数据

2.2 输出插件

  • 编写持久化配置文件test.conf

[root@server5 ~]# cd /etc/logstash/
[root@server5 logstash]# cd conf.d/
[root@server5 conf.d]# vim test.conf

  • 加载配置文件启动Logstash

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

  • 此时界面有数据

2.3 head插件

  • 解压phantomjs压缩包
  • 将phantomjs二进制程序复制到全局PATH目录
  • 安装字体依赖库,phantomjs运行缺少字体库会直接启动报错。
  • 验证phantomjs环境是否安装成功,无报错代表环境就绪;Ctrl+C退出。

yum install -y bzip2

tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64
cp bin/phantomjs /usr/local/bin/
yum install -y fontconfig
phantomjs

  • 安装NodeJS,elasticsearch-head基于Node.js开发,npm打包、启动服务必须依赖node环境。
  • 使用国内淘宝镜像下载项目所有依赖包

rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm

yum install -y unzip
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master/
npm install --registry=https://registry.npmmirror.com/

  • 配置Head前端默认连接的ES集群地址

[root@server4 elasticsearch-head-master]# vim _site/app.js

  • 在第4388行,修改成集群内的节点IP

  • 后台启动 head 服务
  • head默认占用9100端口

[root@server4 elasticsearch-head-master]# npm run start &

[root@server4 elasticsearch-head-master]# netstat -antlp|grep :9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 20156/grunt

  • ES集群开启跨域配置,添加下面图片圈出来的两行,开启ES跨域资源共享,允许所有地址跨域访问ES

[root@server1 ~]# vim /etc/elasticsearch/elasticsearch.yml

  • 重启服务

[root@server1 ~]# systemctl restart elasticsearch.service

  • 浏览器访问http://192.168.159.154:9100

  • 停止server2的elasticsearch,集群健康状态变为yellow

  • 将server2再次打开,由于ES集群分片自动均衡机制,会自动加入集群,且在页面,显示server2成功加入集群,ES内部自动同步分片数据;集群状态自动恢复green

2.4 file插件

[root@server5 conf.d]# vim test.conf

  1. file{}作用:文件输入插件,持续采集磁盘日志文件,生产环境主流采集方式,替代stdin 测试插件;可以持续监控日志新增内容,类似 tail -f。
  2. path => "/var/log/messages"作用:指定要监控采集的日志文件路径,/var/log/messages是CentOS系统全局系统日志,用来做实验数据源。
  3. start_position => "beginning"作用:首次读取文件时,默认值是end,首次启动只读取新增日志;实验需要读取历史日志,因此修改为beginning。
  • 加载 file 采集配置启动Logstash:

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

  • 会自动生成

Logstash File插件会维护sincedb偏移量文件,记录:文件inode、已经读到哪个字节位置。

  • 先清理偏移量,保证可以从头读取,如果看不到最新日期的数据写入,则是数据冗余了,删掉下方文件

[root@server5 ~]# cd /usr/share/logstash/data/plugins/inputs/file

[root@server5 file]# l.
. .. .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server5 file]# rm -f .sincedb_452905a167cf4509fd08acb964fdb20c
重新启动Logstash

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf

  • 就能看到新的日期数据写入

2.5 syslog插件

[root@server5 conf.d]# vim rys.conf

  1. input { syslog {} }:启用 syslog 输入插件,默认监听UDP 514端口,接收标准syslog协议报文; 自动解析syslog协议格式,自动拆分出程序名、优先级、设备类型、日志源 IP 等字段,不需要手动正则切割。
  2. stdout {}:控制台打印日志,调试观察解析效果。
  3. elasticsearch { ... }:将解析完成的syslog日志写入ES集群;index => "rsyslog-%{+YYYY.MM.dd}":按日期生成独立索引,区分文件采集日志与syslog转发日志。

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/rys.conf

[root@server1 ~]# vim /etc/rsyslog.conf

  • 加载新的日志转发规则

[root@server1 ~]# systemctl restart rsyslog.service
[root@server1 ~]# logger server1

  • 此时网页页面也有

2.6 多行合并插件

  • 将 server1上ES日志文件拷贝至server5,作为file插件监控的日志源文件。

[root@server1 ~]# cd /var/log/elasticsearch
[root@server1 elasticsearch]# scp my-es.log server5:/var/log/

[root@server5 conf.d]# vim myes.conf

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/myes.conf

  • 此时错误为一行输出


2.7 grok过滤插件

Apache访问日志是单行纯文本字符串,无法直接统计IP、请求方式、状态码、URI。

grok插件:使用正则模板,把非结构化日志自动切割成独立结构化字段,方便ES检索、Kibana绘图统计。

  • 搭建Apache测试环境
  • 压力测试产生访问日志

[root@server5 ~]# yum install -y httpd
[root@server5 ~]# systemctl enable --now httpd
[root@server5 ~]# echo www.westos.org > /var/www/html/index.html
[root@server1 ~]# ab -c1 -n 300 http://192.168.159.155/index.html

[root@server5 conf.d]# vim grok.conf

[root@server5 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf

三、firebeat日志分析

  • Filebeat安装与启用Apache模块

rpm -ivh filebeat-7.6.1-x86_64.rpm

cd /etc/filebeat/modules.d

filebeat modules enableapache

3.1 Filebeat直接输出Elasticsearch

vim apache.yml

  • 日志流向:Filebeat采集 → 直接写入ES。

vim /etc/filebeat/filebeat.yml

# 校验配置语法是否合法

[root@server5 modules.d]# filebeat test config -c /etc/filebeat/filebeat.yml

# 测试输出连通性

[root@server5 modules.d]# filebeat test output -c /etc/filebeat/filebeat.yml

# 测试输出连通性

[root@server5 modules.d]# systemctl enable --now filebeat

3.2 Filebeat输出到Logstash

  • 修改配置文件

vim/etc/logstash/conf.d/beats.conf

  • 修改filebeat.yml,注释elasticsearch输出,启用logstash输出

四、kibana可视化

  • 下载安装kibana,并配置文件,修改成下方图片的模样

[root@server5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm
[root@server5 ~]# cd /etc/kibana/
[root@server5 kibana]# vim kibana.yml

  • 启动kibana服务,确认端口已被监听

[root@server5 kibana]# systemctl enable --now kibana
[root@server5 kibana]# systemctl start kibana
[root@server5 kibana]# netstat -antlp |grep :5601


  • 浏览器访问5601端口,进入后创建索引模式,按以下图片进行

  • 新建可视化,可自行进行选择创建

  • 添加可视化图形或指标

  • 添加仪表板,把多张图表整合到一个大屏,实现日志监控面板。

五、Elasticsearch快照备份与恢复

5.1 备份快照

  • 创建共享目录并配置权限,ES运行用户需要读写目录,放宽权限避免权限拒绝

[root@server5 ~]# yum install -y nfs-utils

[root@server5 ~]# mkdir -p /data/es-backup
[root@server5 ~]# chmod 777 /data/es-backup/
[root@server5 ~]# vim /etc/exports

  • 编辑NFS共享配置文件

[root@server5 ~]# systemctl enable --now nfs

  • 在elasticsearch三个节点,同时安装nfs-utils,并且配置同样的以下操作

[root@server2 ~]# mkdir -p /data/es-backup

  • 挂载远端 NFS 共享目录

[root@server2 ~]# mount 192.168.159.155:/data/es-backup /data/es-backup

  • 确认已经挂载成功

  • 修改配置文件elasticsearch.yml,定义快照仓库允许使用的本地路径

[root@server2 ~]# vim /etc/elasticsearch/elasticsearch.yml

  • 重启服务

[root@server2 ~]# systemctl restart elasticsearch

5.2 滚动重启

  • 点击扳手
  • 设置临时分片策略(滚动重启前执行)

PUT _cluster/settings

{

"transient": {

"cluster.routing.allocation.enable": "primaries"

}

}

  • 出现“true”表示成功

  • 集群全部节点重启完成,恢复默认分片策略

PUT _cluster/settings

{

"transient": {

"cluster.routing.allocation.enable": null

}

}

5.3 API创建快照仓库

  • type: fs:仓库类型为本地文件系统仓库;
  • location:存储路径,与path.repo配置保持一致;
  • compress: true:开启快照文件压缩,节省磁盘空间。

PUT /_snapshot/my_backup

{

"type": "fs",

"settings": {

"location": "/data/es-backup",

"compress": true

}

}

  • 验证已经有了
  • 验证仓库创建成功

GET /_snapshot/my_backup

5.4 创建快照(数据备份操作)

快照支持两种模式:备份集群全部索引、仅备份指定索引。

5.4.1 备份集群内所有索引

PUT /_snapshot/my_backup/snapshot_all_20260811 # 快照名称(快照名称带上日期,方便后期区分管理)

5.4.2 只备份指定索引

  • indices:指定需要备份的索引,支持通配符“*”,多个索引用逗号隔开;
  • ignore_unavailable: true:如果部分索引不存在,不中断备份任务;
  • include_global_state: false:不备份集群全局状态(索引模板、别名等)。恢复时避免覆盖集群现有模板。

PUT /_snapshot/my_backup/snapshot_all_20260811

{

"indices": "syslog-*",

"ignore_unavailable": true,

"include_global_state": false

}

5.4.3 查看仓库内所有快照

GET /_snapshot/my_backup/_all

5.4.4 查看单个快照

GET /_snapshot/my_backup/snapshot_all_20260811

5.4.5 监控快照进度

GET /_snapshot/my_backup/snapshot_all_20260811/_status

5.5 恢复快照

# 关闭待恢复索引 POST /apachelog-*/_close # 执行快照恢复 POST /_snapshot/my_backup/snapshot_apachelog_20260812/_restore { "indices": "apachelog-*", "ignore_unavailable": true, "include_global_state": false } # 恢复完成后开启索引 POST /apachelog-*/_open

六、ES集群监控

6.1 xpack认证

  • server1上生成SSL证书,开启集群传输层SSL加密

cd /usr/share/elasticsearch/

  • 生成CA根证书

bin/elasticsearch-certutil ca

  • 使用CA签发集群通信证书elastic-certificates.p12

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

  • 将证书移动至ES配置目录

cp elastic-certificates.p12 /etc/elasticsearch
cd /etc/elasticsearch/

  • 修改文件属主为elasticsearch运行用户

chown elasticsearch elastic-certificates.p12

  • 修改所有节点elasticsearch.yml配置,三个节点都需要

vim elasticsearch.yml
systemctl restart elasticsearch

  • 证书分发至其余节点

[root@server1 elasticsearch]# scp elastic-certificates.p12 server2:/etc/elasticsearch/
[root@server1 elasticsearch]# scp elastic-certificates.p12 server3:/etc/elasticsearch/

  • server2上执行相同操作,但配置内容有所不一样

[root@server2 ~]# chown elasticsearch /etc/elasticsearch/elastic-certificates.p12
[root@server2 ~]# vim /etc/elasticsearch/elasticsearch.yml

[root@server2 ~]# systemctl restart elasticsearch

  • server3上和server2同样执行相同操作

[root@server3 ~]# chown elasticsearch /etc/elasticsearch/elastic-certificates.p12
[root@server3 ~]# vim /etc/elasticsearch/elasticsearch.yml

[root@server3 ~]# systemctl restart elasticsearch

  • 设置ES内置预留用户密码,server1设置密码

[root@server1 elasticsearch]# bin/elasticsearch-setup-passwords interactive

  • ES启动安全机制后,必须初始化内置账号密码:elastic、kibana、logstash_system、beats_system、apm_system、remote_monitoring_user

  • 配套组件适配账号密码访问 ES
  • 开启安全后Head无法直连,访问地址格式需要追加认证参数http://192.168.159.154:9100/?auth_user=elastic&auth_password=elastic

[root@server4 ~]# cd elasticsearch-head-master/
[root@server4 elasticsearch-head-master]# npm run start &

[root@server4 ~]# docker start cerebro

  • 修改logstash配置文件

[root@server5 ~]# vim /etc/logstash/conf.d/grok.conf

[root@server5 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf

  • 修改kibana文件

[root@server5 kibana]# vim kibana.yml

  • kibana通过用户和密码正常访问

6.2 Metricbeat 部署,实现ES集群监控采集

server1、server2、server3执行相同的操作

  • 安装metricbeat监控

[root@server1 ~]# rpm -ivh metricbeat-7.6.1-x86_64.rpm

[root@server1 ~]# cd /etc/metricbeat/modules.d/

  • 启用ES监控模块

[root@server1 modules.d]# metricbeat modules enable elasticsearch-xpack

  • 修改模块配置elasticsearch-xpack.yml,一般用自己的本机IP,监测的是本机状况和数据

[root@server1 modules.d]# vim elasticsearch-xpack.yml

  • 修改metricbeat.yml,配置输出ES地址与账号,最好统一用一个节点的

[root@server1 metricbeat]# vim metricbeat.yml

[root@server1 metricbeat]# systemctl enable --now metricbeat.service

  • 点击内部检测,进入设置模式,当所有步骤配置好后,会全部metricbeat进行监测

  • server2和server3的操作一样
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 23:42:51

从零基础到行业标杆,揭秘哈尔滨微网站建设的高质量落地全流程解析与避坑指南

在这个手机不离手、万物皆可扫码的时代,对于咱们哈尔滨的商家和企业来说,拥有一张好看的“数字名片”早就不是锦上添花,而是生存发展的必修课。你可能听过很多大词,什么数字化转型啦,什么元宇宙布局啦,听着挺玄乎,但落到实处,最实实在在能帮你做生意、获客、提升品牌形…

作者头像 李华
网站建设 2026/8/13 23:42:06

C# System.IO 文件操作核心指南:从流抽象到异步高性能实战

1. 项目概述:为什么System.IO是C#开发者的必修课 如果你用C#写过任何需要和本地文件、网络流或者内存数据打交道的程序,那你一定绕不开 System.IO 这个命名空间。它就像是C#世界里处理所有输入输出(I/O)操作的“瑞士军刀”&…

作者头像 李华
网站建设 2026/8/13 23:41:57

全面解读2024年卫生局网站建设方案:如何打造亲民高效的健康服务门户

咱们今天不聊那些高大上得让人摸不着头脑的技术架构,也不整那些虚头巴脑的概念堆砌。咱们就坐在茶摊上,掏心窝子地聊聊一个非常实在、又极其容易被忽视的话题——卫生局网站建设方案。你可能觉得,卫生局是干嘛的?不就是管看病、管防疫、管卫生的那些事儿嘛。对,是这么回事…

作者头像 李华
网站建设 2026/8/13 23:41:51

文山微网站建设全攻略:从零基础搭建到获客转化,中小企业必看的深度解析

今天咱们不聊那些虚头巴脑的大道理,也不整那些只有程序员能看懂的代码逻辑。我想和大家聊聊一个实实在在、能帮你省钱又能赚钱的事儿——文山微网站建设。你可能觉得,现在都什么年代了,谁还搞微信公众号或者抖音啊?非得花心思去搞个像样的微网站?这其实是个很大的误区。在…

作者头像 李华
网站建设 2026/8/13 23:39:36

淮安营销型网站建设:如何让企业在激烈的市场浪潮中真正突围而出

在这个互联网流量红利逐渐见顶、获客成本越来越高昂的大环境下,许多淮安的企业主和创业者朋友心里都挺焦虑的。以前那种“只要有个网站,放在上面就能等客上门”的日子,早就一去不复返了。现在的市场竞争,不仅仅是产品的竞争,更是品牌存在感、用户体验和转化逻辑的全面博弈…

作者头像 李华
网站建设 2026/8/13 23:38:29

哪个商城网站建设好,资深从业者深度解析避坑指南与实战经验

做网站这么多年,我见过太多老板在“哪个商城网站建设好”这个问题上绕弯子。有人因为不懂行,被外包公司忽悠着花了几十万,最后拿回来一个连后台都操作不通的“半成品”;也有人为了省钱,自己拿着免费模板硬凑,结果上线第一天就因为并发量太大直接瘫痪。今天我不跟你们谈那…

作者头像 李华