ES 数据快照备份与恢复
ES 官方推荐通过快照(Snapshot)机制实现数据备份恢复,支持全集群备份、指定索引备份、增量快照、跨节点恢复,是生产环境唯一官方容灾方案。本次采用 NFS 共享存储作为快照仓库,保障多节点集群快照数据统一存储。
服务端 NFS 共享仓库部署
搭建 NFS 服务端,提供统一备份存储目录,所有 ES 节点挂载该目录实现快照共享:
# 安装 NFS 依赖
yum install -y nfs-utils
# 创建 ES 备份存储目录
mkdir -p /data/es-backup
chmod 777 /data/es-backup/
# 配置 NFS 共享权限
vim /etc/exports
# 添加配置:允许所有节点读写、同步写入、禁止 root 权限压缩
/data/es-backup *(rw,sync,no_root_squash)
# 启动并开机自启 NFS 服务
systemctl enable --now nfs


所有 ES 节点挂载共享目录
集群所有 ES 节点(server1/server2/server3)统一执行挂载,保证所有节点可读写快照目录:
# 本地创建挂载目录
mkdir -p /data/es-backup
# 挂载 NFS 共享存储
mount 172.25.0.3:/data/es-backup /data/es-backup



ES 集群配置快照仓库路径
所有 ES 节点修改配置文件,声明快照存储路径,重启服务生效:
# 编辑 ES 主配置文件
vim /etc/elasticsearch/elasticsearch.yml
# 新增快照仓库路径配置
path.repo: /data/es-backup
# 重启 ES 服务
systemctl restart elasticsearch



集群滚动重启
生产环境避免直接重启集群导致服务中断,通过临时配置实现滚动重启,仅迁移主分片,保障业务正常访问:
# 关闭分片自动分配,仅保留主分片运行
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "primaries"
}
}
所有节点重启完成后,恢复集群默认分片分配规则:
# 清除临时配置,恢复全部分片分配
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": null
}
}




API 创建快照仓库
通过 Kibana 开发工具或 curl 命令创建快照仓库,关联 NFS 共享目录:
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/data/es-backup",
"compress": true
}
}
参数说明:type=fs(本地文件系统类型)、compress=true(开启快照压缩,节省存储空间)。执行以下命令验证仓库创建成功:
GET /_snapshot/my_backup


创建快照备份
全集群索引备份
# 自定义快照名称(建议带时间戳,便于区分)
PUT /_snapshot/my_backup/snapshot_all_20251026
指定索引备份
仅备份业务核心索引,忽略不存在的索引,不备份集群全局状态:
PUT /_snapshot/my_backup/snapshot_syslog_20251026
{
"indices": "syslog-*",
"ignore_unavailable": true,
"include_global_state": false
}
快照状态查询
# 查询仓库所有快照列表
GET /_snapshot/my_backup/_all
# 查询单个快照详细信息
GET /_snapshot/my_backup/snapshot_syslog_20251026
# 监控快照实时创建进度
GET /_snapshot/my_backup/snapshot_syslog_20251026/_status
快照数据恢复
全量恢复
POST /_snapshot/my_backup/snapshot_syslog_20251026/_restore
指定索引重命名恢复
恢复时重命名索引,防止覆盖现有数据,适合数据回溯测试场景:
POST /_snapshot/my_backup/snapshot_all_20251026/_restore
{
"indices": "syslog-2025.10.26",
"rename_pattern": "syslog-(\\d+)",
"rename_replacement": "restored_syslog-$1",
"include_global_state": false
}
快照删除与进度查看
# 删除无用快照,释放存储
DELETE /_snapshot/my_backup/snapshot_all_20251026
# 查看索引恢复实时进度
GET /_recovery
ES 集群 X-Pack 安全认证加固
ES 默认匿名访问,存在极大安全风险。通过开启 X-Pack TLS 安全认证,实现集群节点通信加密、账号密码登录,杜绝非法访问。
生成集群 SSL 证书
在主节点 server1 执行证书生成,所有节点共用一套证书:
# 进入 ES 安装目录
cd /usr/share/elasticsearch/
# 生成 CA 根证书
bin/elasticsearch-certutil ca
# 生成节点认证证书(绑定 CA 证书)
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 移动证书到配置目录并授权
cp elastic-certificates.p12 /etc/elasticsearch/
chown elasticsearch:elasticsearch /etc/elasticsearch/elastic-certificates.p12
所有节点配置 TLS 认证
三台 ES 节点统一修改 elasticsearch.yml 配置,开启安全认证与加密传输:
vim /etc/elasticsearch/elasticsearch.yml
# 跨域请求头放行
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
# 开启 X-Pack 安全认证
xpack.security.enabled: true
# 开启集群通信 TLS 加密
xpack.security.transport.ssl.enabled: true
# 证书校验模式
xpack.security.transport.ssl.verification_mode: certificate
# 证书路径配置
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
分发证书并重启集群
# 主节点分发证书到子节点
scp elastic-certificates.p12 server2:/etc/elasticsearch/
scp elastic-certificates.p12 server3:/etc/elasticsearch/
# 子节点授权证书文件
chown elasticsearch:elasticsearch /etc/elasticsearch/elastic-certificates.p12
# 所有节点重启 ES 服务
systemctl restart elasticsearch
初始化系统账号密码
集群重启完成后,交互式设置所有内置账号密码(统一测试密码:westos):
cd /usr/share/elasticsearch/
bin/elasticsearch-setup-passwords interactive
需依次设置:elastic、apm_system、kibana、logstash_system、beats_system、remote_monitoring_user 账号密码,所有服务后续对接均需携带认证信息。
上下游服务适配认证
开启认证后,Head 插件、Cerebro、Logstash、Kibana 均需配置账号密码才能正常访问:
- ES-Head 访问:http://192.168.56.171:9100/?auth_user=elastic&auth_password=westos
- Cerebro 访问:页面输入 elastic 账号+自定义密码登录
- Logstash 配置:输出 ES 时新增账号密码参数
- Kibana 配置:配置 kibana 系统账号密码对接 ES
Logstash 输出配置示例:
output {
elasticsearch {
hosts => "192.168.56.11:9200"
index => "apachelog-%{+YYYY.MM.dd}"
user => "elastic"
password => "westos"
}
}
Kibana 配置示例:
vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana"
elasticsearch.password: "westos"
systemctl restart kibana
Metricbeat 集群监控部署
Metricbeat 是轻量级指标采集工具,可实时采集 ES 集群节点状态、分片信息、资源负载,对接 Kibana 实现可视化监控大屏。
Metricbeat 安装与模块启用
# 安装对应版本 Metricbeat
rpm -ivh metricbeat-7.6.1-x86_64.rpm
# 启用 ES 监控模块(xpack 增强模块)
cd /etc/metricbeat/modules.d
metricbeat modules enable elasticsearch-xpack
# 编辑 ES 监控模块配置
vim elasticsearch-xpack.yml
模块核心配置:
- module: elasticsearch
metricsets:
- ccr
- cluster_stats
- enrich
- index
- index_recovery
- index_summary
- ml_job
- node_stats
- shard
period: 10s
hosts: ["http://localhost:9200"]
username: "remote_monitoring_user"
password: "westos"
xpack.enabled: true
配置指标输出到 ES
vim /etc/metricbeat/metricbeat.yml
输出配置:
output.elasticsearch:
hosts: ["http://192.168.56.11:9200"]
username: "elastic"
password: "westos"
启动监控服务
systemctl enable --now metricbeat.service
所有 ES 节点重复以上配置,即可在 Kibana 监控面板查看全集群节点状态、分片负载、资源使用率等指标。
Kibana 监控优化
关闭 Kibana 自带采集,统一通过 Metricbeat 采集数据,避免数据重复:
vim /etc/kibana/kibana.yml
xpack.monitoring.kibana.collection.enabled: false
systemctl restart kibana.service
Filebeat 采集 ES 集群日志
通过 Filebeat 实时采集 ES 服务日志、GC 日志、慢查询日志、审计日志,实现日志集中存储与可视化分析,便于故障排查。
启用 ES 日志采集模块
# 安装 Filebeat
rpm -ivh filebeat-7.6.1-x86_64.rpm
# 启用 ES 专属模块
cd /etc/filebeat/modules.d
filebeat modules enable elasticsearch
配置多类型日志采集
vim elasticsearch.yml
完整采集配置,覆盖 ES 全场景日志:
- module: elasticsearch
# 服务运行日志
server:
enabled: true
var.paths:
- /var/log/elasticsearch/*.log
- /var/log/elasticsearch/*_server.json
# GC 垃圾回收日志
gc:
enabled: true
var.paths:
- /var/log/elasticsearch/gc.log.[0-9]*
- /var/log/elasticsearch/gc.log
# 审计日志
audit:
enabled: true
var.paths:
- /var/log/elasticsearch/*_access.log
- /var/log/elasticsearch/*_audit.json
# 慢查询日志(索引检索/写入慢日志)
slowlog:
enabled: true
var.paths:
- /var/log/elasticsearch/*_index_search_slowlog.log
- /var/log/elasticsearch/*_index_indexing_slowlog.log
- /var/log/elasticsearch/*_index_search_slowlog.json
- /var/log/elasticsearch/*_index_indexing_slowlog.json
# 废弃日志
deprecation:
enabled: true
var.paths:
- /var/log/elasticsearch/*_deprecation.log
- /var/log/elasticsearch/*_deprecation.json
配置日志输出与启动服务
vim /etc/filebeat/filebeat.yml
输出认证配置:
output.elasticsearch:
hosts: ["http://192.168.56.11:9200"]
username: "elastic"
password: "westos"
# 启动并开机自启
systemctl enable --now filebeat.service
部署完成后,可在 Kibana 中检索 ES 所有运行日志,快速定位集群异常、慢查询、内存 GC 问题。
ELFK + kafka 架构部署环境准备
集群节点规划
本次部署采用 Kafka KRaft 去中心化架构,三台节点搭建高可用 Kafka 集群,环境参数如下:
- server7:192.168.72.157(Kafka Broker+Controller)
- server8:192.168.72.158(Kafka Broker+Controller)
- server9:192.168.72.159(Kafka Broker+Controller)
基础环境依赖
Kafka 运行依赖 JDK 环境,三台节点统一安装 JDK 17:
# 安装 JDK 17
rpm -ivh jdk-17.0.17_linux-x64_bin.rpm
# 验证版本
java -version
版本输出即为安装成功:
java version "17.0.17" 2025-10-21 LTS
Java(TM) SE Runtime Environment (build 17.0.17+8-LTS-360)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.17+8-LTS-360, mixed mode, sharing)



Kafka 集群部署
Kafka 安装与目录初始化
三台节点统一执行以下安装操作,使用 3.9.1 稳定版本:
# 解压安装包
tar zxf kafka_2.12-3.9.1.tgz -C /opt
# 重命名目录
mv /opt/kafka_2.12-3.9.1 /opt/kafka
# 进入配置目录
cd /opt/kafka/config/kraft
# 备份默认配置文件
cp server.properties{,.bak}
# 创建日志存储目录
mkdir -p /opt/kafka/logs



核心配置文件修改
KRaft 模式核心配置包含节点角色、集群仲裁、监听地址、性能参数等,三台节点仅 node.id 和 advertised.listeners 不同,其余配置完全一致。
server7 节点配置(192.168.72.157)
vim /opt/kafka/config/kraft/server.properties
核心配置内容:
# 节点角色:同时作为 Broker 和 Controller
process.roles=broker,controller
# 节点唯一 ID(集群唯一)
node.id=157
# 集群仲裁节点列表
controller.quorum.voters=157@192.168.72.157:9093,158@192.168.72.158:9093,159@192.168.72.159:9093
# 监听端口:业务端口 9092,集群管控端口 9093
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 集群内部通信协议
inter.broker.listener.name=PLAINTEXT
# 对外暴露访问地址
advertised.listeners=PLAINTEXT://192.168.72.157:9092,CONTROLLER://192.168.72.157:9093
# 控制器监听名称
controller.listener.names=CONTROLLER
# 协议映射
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
# 网络与 IO 线程配置
num.network.threads=2
num.io.threads=2
# 缓冲区配置
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
# 日志存储目录
log.dirs=/opt/kafka/logs
# 默认分区数、副本数
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=1
# 日志保留策略
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
# 允许删除主题
delete.topic.enable=true

server8 节点配置(192.168.72.158)
仅修改以下两项,其余配置与 server7 一致:
node.id=158
advertised.listeners=PLAINTEXT://192.168.72.158:9092,CONTROLLER://192.168.72.158:9093

server9 节点配置(192.168.72.159)
仅修改以下两项,其余配置与 server7 一致:
node.id=159
advertised.listeners=PLAINTEXT://192.168.72.159:9092,CONTROLLER://192.168.72.159:9093

集群初始化与启动
生成集群唯一 UUID
仅在 server7 节点执行,生成全局唯一集群 ID:
# 生成集群唯一 UUID
KAFKA_CLUSTER_ID="$(/opt/kafka/bin/kafka-storage.sh random-uuid)"
# 打印查看 UUID
echo ${KAFKA_CLUSTER_ID}
示例输出 UUID:BjOYwL7tT122QLX8opp6gg

三台节点格式化存储目录
三台节点统一使用上述 UUID 执行格式化:
# 三台节点统一执行格式化,替换为自己生成的 UUID
/opt/kafka/bin/kafka-storage.sh format -t BjOYwL7tT122QLX8opp6gg -c /opt/kafka/config/kraft/server.properties
启动 Kafka 集群
三台节点依次后台启动 Kafka 服务:
# 后台启动 Kafka 服务
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
启动后通过 jps 验证进程,出现 Kafka 进程即为启动成功。



Kafka 集群可用性验证
创建测试 Topic
# 创建 3 分区 3 副本测试主题
/opt/kafka/bin/kafka-topics.sh --create --topic testtopics --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3
参数说明:3 个分区、3 副本,最大化保证高可用,适配集群三节点架构。
查看所有 Topic
# 查看集群所有主题
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
生产者推送测试数据
# 启动控制台生产者
/opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic testtopics
交互式输入测试内容:111、222、333、444、555

消费者消费数据
# 启动控制台消费者,从头消费数据
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testtopics --from-beginning
可正常读取生产者推送的所有数据,说明集群读写正常。
查看 Topic 详细信息
# 查看主题详细分区、副本、ISR 状态
/opt/kafka/bin/kafka-topics.sh --bootstrap-server server7:9092,server8:9092,server9:9092 --topic testtopics --describe
可查看分区分布、副本节点、ISR 同步状态,验证集群高可用配置生效。

Filebeat 对接 Kafka 配置
修改 Filebeat 核心配置,将采集的 Apache 日志推送至 Kafka 集群,替代直接输出 ES,实现日志缓冲。
vim /etc/filebeat/filebeat.yml
核心输出配置:
# 开启 gzip 压缩,减少网络传输开销
compression: gzip
# 单条消息最大 1MB,避免超大日志阻塞
max_message_bytes: 1048576
# Kafka 集群多节点高可用输出配置
output.kafka:
hosts: ["192.168.36.157:9092", "192.168.36.158:9092", "192.168.36.159:9092"]
# 日志推送目标主题
topic: "apache-logs"
# 轮询分发分区,均衡负载
partition.round_robin:
reachable_only: true
# 至少 1 个副本确认接收,平衡可靠性与性能
required_acks: 1
配置校验与服务重启
# 校验配置语法
filebeat test config -c /etc/filebeat/filebeat.yml
# 测试输出连通性
filebeat test output -c /etc/filebeat/filebeat.yml
# 重启服务生效
systemctl restart filebeat.service
验证日志推送
在 Kafka 任意节点消费 apache-logs 主题,可读取 Filebeat 推送的 Apache 访问日志,证明推送链路正常。
# 消费 apache-logs 主题验证日志推送
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic apache-logs --from-beginning
Logstash 对接 Kafka 配置
配置 Logstash 作为 Kafka 消费者,读取缓冲日志、结构化清洗后,输出至 Elasticsearch 存储。
vim /etc/logstash/conf.d/kafka.conf
完整配置文件:
input {
# 消费 Kafka 日志数据
kafka {
bootstrap_servers => "192.168.72.157:9092,192.168.72.158:9092,192.168.72.159:9092"
topics => ["apache-logs"]
group_id => "logstash-consumer-group"
consumer_threads => 3
auto_offset_reset => "earliest"
codec => "json"
}
}
filter {
# 结构化解析 Apache 日志
grok {
match => { "message" => "%{HTTPD_COMBINEDLOG}" }
}
}
output {
# 输出至 ES 集群存储
elasticsearch {
hosts => ["192.168.72.151:9200","192.168.72.152:9200","192.168.72.153:9200"]
index => "apachelog-%{+YYYY.MM.dd}"
user => "elastic"
password => "westos"
}
}
启动 Logstash 消费服务
# 前台启动 Logstash 加载 kafka 消费配置
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/kafka.conf
启动成功后,Logstash 会实时消费 Kafka 中的 Apache 日志,清洗结构化后写入 ES,最终可在 Kibana 中查询、可视化展示日志数据。
3万+



被折叠的 条评论
为什么被折叠?



