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

📅 2026/8/16 8:22:16
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-backupES 集群配置快照仓库路径所有 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 } }参数说明typefs本地文件系统类型、compresstrue开启快照压缩节省存储空间。执行以下命令验证仓库创建成功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 /_recoveryES 集群 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初始化系统账号密码集群重启完成后交互式设置所有内置账号密码统一测试密码westoscd /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_userelasticauth_passwordwestosCerebro 访问页面输入 elastic 账号自定义密码登录Logstash 配置输出 ES 时新增账号密码参数Kibana 配置配置 kibana 系统账号密码对接 ESLogstash 输出配置示例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 kibanaMetricbeat 集群监控部署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配置指标输出到 ESvim /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.serviceFilebeat 采集 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 集群环境参数如下server7192.168.72.157Kafka BrokerControllerserver8192.168.72.158Kafka BrokerControllerserver9192.168.72.159Kafka BrokerController基础环境依赖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.178-LTS-360) Java HotSpot(TM) 64-Bit Server VM (build 17.0.178-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.157vim /opt/kafka/config/kraft/server.properties核心配置内容# 节点角色同时作为 Broker 和 Controller process.rolesbroker,controller # 节点唯一 ID集群唯一 node.id157 # 集群仲裁节点列表 controller.quorum.voters157192.168.72.157:9093,158192.168.72.158:9093,159192.168.72.159:9093 # 监听端口业务端口 9092集群管控端口 9093 listenersPLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 # 集群内部通信协议 inter.broker.listener.namePLAINTEXT # 对外暴露访问地址 advertised.listenersPLAINTEXT://192.168.72.157:9092,CONTROLLER://192.168.72.157:9093 # 控制器监听名称 controller.listener.namesCONTROLLER # 协议映射 listener.security.protocol.mapCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL # 网络与 IO 线程配置 num.network.threads2 num.io.threads2 # 缓冲区配置 socket.send.buffer.bytes102400 socket.receive.buffer.bytes102400 socket.request.max.bytes104857600 # 日志存储目录 log.dirs/opt/kafka/logs # 默认分区数、副本数 num.partitions3 num.recovery.threads.per.data.dir1 offsets.topic.replication.factor3 transaction.state.log.replication.factor3 transaction.state.log.min.isr1 # 日志保留策略 log.retention.hours168 log.segment.bytes1073741824 log.retention.check.interval.ms300000 # 允许删除主题 delete.topic.enabletrueserver8 节点配置192.168.72.158仅修改以下两项其余配置与 server7 一致node.id158 advertised.listenersPLAINTEXT://192.168.72.158:9092,CONTROLLER://192.168.72.158:9093server9 节点配置192.168.72.159仅修改以下两项其余配置与 server7 一致node.id159 advertised.listenersPLAINTEXT://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}示例输出 UUIDBjOYwL7tT122QLX8opp6gg三台节点格式化存储目录三台节点统一使用上述 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-beginningLogstash 对接 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 中查询、可视化展示日志数据。