ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ES 运维实战:快照备份恢复 + X-Pack 安全加固 + 集群监控和ELFK + kafka 架构部署

2026/8/16 8:30:56 拓冰建站 浏览量
ES 运维实战:快照备份恢复 + X-Pack 安全加固 + 集群监控和ELFK + kafka 架构部署

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 中查询、可视化展示日志数据。