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
- file{}作用:文件输入插件,持续采集磁盘日志文件,生产环境主流采集方式,替代stdin 测试插件;可以持续监控日志新增内容,类似 tail -f。
path => "/var/log/messages"作用:指定要监控采集的日志文件路径,/var/log/messages是CentOS系统全局系统日志,用来做实验数据源。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
input { syslog {} }:启用 syslog 输入插件,默认监听UDP 514端口,接收标准syslog协议报文; 自动解析syslog协议格式,自动拆分出程序名、优先级、设备类型、日志源 IP 等字段,不需要手动正则切割。stdout {}:控制台打印日志,调试观察解析效果。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的操作一样
