> 技术文档 > 【Elasticsearch】快照生命周期管理 SLM(实战篇)

【Elasticsearch】快照生命周期管理 SLM(实战篇)

Elasticsearch 集群》系列,共包含以下文章:

  • 1️⃣ 冷热集群架构
  • 2️⃣ 合适的锅炒合适的菜:性能与成本平衡原理公式解析
  • 3️⃣ ILM(Index Lifecycle Management)策略详解
  • 4️⃣ Elasticsearch 跨机房部署
  • 5️⃣ 快照与恢复功能详解
  • 6️⃣ Elasticsearch 快照恢复 API 参数详解
  • 7️⃣ 安全地删除快照仓库、快照
  • 8️⃣ 快照生命周期管理 SLM(理论篇)
  • 9️⃣ 快照生命周期管理 SLM(实战篇)
  • 🔟 跨集群检索(Cross-Cluster Search)

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

快照生命周期管理 SLM(实战篇)

  • 1.案例背景
  • 2.实战演练
    • 2.1 SLM 实现全流程
      • 2.1.1 步骤 1:配置 S3 快照仓库
      • 2.1.2 步骤 2:创建 SLM 策略
      • 2.1.3 步骤 3:手动执行测试
      • 2.1.4 步骤 4:监控 SLM 运行
      • 2.1.5 步骤 5:恢复数据测试
    • 2.2 关键运维操作详解
      • 2.2.1 清理失效快照
      • 2.2.2 修改保留策略
      • 2.2.3 灾难恢复流程
    • 2.3 SLM 执行逻辑剖析
    • 2.4 最佳实践建议
    • 2.5 常见问题排查

本文是一个基于 Elasticsearch 快照生命周期管理(SLM) 的详细实现案例,涵盖从配置到恢复的全流程。我们将以一个电商平台的日志集群为例,演示如何通过 SLM 实现自动化备份与保留策略。

1.案例背景

电商平台每天产生 2TB 日志(索引格式:logs-nginx-2024.07.21)。

  • 业务需求
    • 每天凌晨备份全量索引
    • 保留最近 7 天快照(高频恢复点)
    • 每月 1 日快照保留 1 年(合规审计)
    • 存储成本优化(自动清理旧快照)
  • 基础设施
    • Elasticsearch 集群:8 节点(版本 7.10+)
    • 快照仓库:AWS S3(桶名:es-snapshots-prod
    • 定时任务:Kibana 调度

2.实战演练

2.1 SLM 实现全流程

2.1.1 步骤 1:配置 S3 快照仓库

在 Elasticsearch 中注册 S3 仓库(需提前配置 IAM 权限):

PUT _snapshot/es-s3-backup{ \"type\": \"s3\", \"settings\": { \"bucket\": \"es-snapshots-prod\", \"region\": \"us-east-1\", \"role_arn\": \"arn:aws:iam::123456789012:role/es-snapshot-role\" }}

验证:检查仓库状态

GET _snapshot/es-s3-backup/_status

2.1.2 步骤 2:创建 SLM 策略

定义两个策略:

  • 1️⃣ 每日备份(保留 7 天)
  • 2️⃣ 月度归档(保留 1 年)
# 策略1:每日备份(保留7天)PUT _slm/policy/daily_logs_backup{ \"schedule\": \"0 2 * * *\", // 每天凌晨2点执行 \"name\": \"\", // 快照名称格式 \"repository\": \"es-s3-backup\", \"config\": { \"indices\": [\"logs-nginx-*\"], // 备份所有Nginx日志索引 \"include_global_state\": false }, \"retention\": { \"expire_after\": \"7d\" // 7天后自动删除 }}# 策略2:月度归档(保留1年)PUT _slm/policy/monthly_logs_archive{ \"schedule\": \"0 3 1 * *\", // 每月1日凌晨3点执行 \"name\": \"\", \"repository\": \"es-s3-backup\", \"config\": { \"indices\": [\"logs-nginx-*\"], \"include_global_state\": false }, \"retention\": { \"expire_after\": \"365d\" // 365天后删除 }}

2.1.3 步骤 3:手动执行测试

触发一次策略以验证配置:

POST _slm/policy/daily_logs_backup/_execute

检查结果

GET _snapshot/es-s3-backup/_all?pretty // 查看已生成快照

2.1.4 步骤 4:监控 SLM 运行

通过 Kibana 或 API 监控任务状态:

  • Kibana 路径ManagementSnapshot and RestorePolicies
  • API 监控
    GET _slm/policy/daily_logs_backup?human // 查看上次执行时间/错误信息

2.1.5 步骤 5:恢复数据测试

模拟从快照恢复数据(恢复前 3 天的日志):

POST _snapshot/es-s3-backup/logs-daily-2024.07.18/_restore{ \"indices\": \"logs-nginx-2024.07.18\", // 指定索引 \"rename_pattern\": \"(.+)\", // 重命名恢复的索引(避免冲突) \"rename_replacement\": \"restored_$1\" // 如 restored_logs-nginx-2024.07.18}

恢复验证

GET _cat/indices/restored_logs-nginx* // 检查索引是否恢复

2.2 关键运维操作详解

2.2.1 清理失效快照

手动清理因策略变更遗留的快照:

DELETE _snapshot/es-s3-backup/logs-daily-2024.07.01?pretty

2.2.2 修改保留策略

将每日备份保留期从 7 天延长至 14 天:

PUT _slm/policy/daily_logs_backup{ ... // 其他参数不变 \"retention\": { \"expire_after\": \"14d\" // 更新保留时间 }}

2.2.3 灾难恢复流程

若生产集群崩溃,从 S3 重建集群:

  • 在新集群注册同一 S3 仓库。
  • 列出可恢复的快照:
    GET _snapshot/es-s3-backup/_all?pretty
  • 恢复最新快照:
    POST _snapshot/es-s3-backup/logs-daily-2024.07.20/_restore

2.3 SLM 执行逻辑剖析

#mermaid-svg-ms5QNmjfsYpKnQfv {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv .error-icon{fill:#552222;}#mermaid-svg-ms5QNmjfsYpKnQfv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ms5QNmjfsYpKnQfv .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ms5QNmjfsYpKnQfv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ms5QNmjfsYpKnQfv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ms5QNmjfsYpKnQfv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ms5QNmjfsYpKnQfv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ms5QNmjfsYpKnQfv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ms5QNmjfsYpKnQfv .marker.cross{stroke:#333333;}#mermaid-svg-ms5QNmjfsYpKnQfv svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ms5QNmjfsYpKnQfv .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ms5QNmjfsYpKnQfv text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-ms5QNmjfsYpKnQfv .actor-line{stroke:grey;}#mermaid-svg-ms5QNmjfsYpKnQfv .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv .sequenceNumber{fill:white;}#mermaid-svg-ms5QNmjfsYpKnQfv #sequencenumber{fill:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv .messageText{fill:#333;stroke:#333;}#mermaid-svg-ms5QNmjfsYpKnQfv .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ms5QNmjfsYpKnQfv .labelText,#mermaid-svg-ms5QNmjfsYpKnQfv .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-ms5QNmjfsYpKnQfv .loopText,#mermaid-svg-ms5QNmjfsYpKnQfv .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-ms5QNmjfsYpKnQfv .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ms5QNmjfsYpKnQfv .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ms5QNmjfsYpKnQfv .noteText,#mermaid-svg-ms5QNmjfsYpKnQfv .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-ms5QNmjfsYpKnQfv .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ms5QNmjfsYpKnQfv .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ms5QNmjfsYpKnQfv .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ms5QNmjfsYpKnQfv .actorPopupMenu{position:absolute;}#mermaid-svg-ms5QNmjfsYpKnQfv .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-ms5QNmjfsYpKnQfv .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ms5QNmjfsYpKnQfv .actor-man circle,#mermaid-svg-ms5QNmjfsYpKnQfv line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ms5QNmjfsYpKnQfv :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} SLM 调度器 Elasticsearch AWS S3 每天 02:00 (Cron) 触发 daily_logs_backup 策略 创建快照(名称: logs-daily-2024.07.21) 上传快照数据 检查保留策略(expire_after=7d) 自动删除 logs-daily-2024.07.14(过期) SLM 调度器 Elasticsearch AWS S3

2.4 最佳实践建议

  • 仓库分离
    • 生产快照存于独立 S3 Bucket(与应用程序数据隔离)。
    • 启用 S3 版本控制防止误删。
  • 加密与权限
    // 创建仓库时启用加密\"settings\": { \"server_side_encryption\": true, \"readonly\": true // 禁止直接写入仓库}
  • 性能优化
    • 避免备份期间进行 force_merge(可能阻塞 SLM)。
    • 大型集群分批次备份(通过 indices 参数拆分)。
  • 监控告警
    • 配置 Kibana Alert:当 SLM 连续失败 2 次时触发邮件告警。
    • 定期检查 S3 存储量(避免快照占满空间)。

2.5 常见问题排查

问题现象 原因分析 解决方案 SLM 任务状态为 FAILED 仓库权限不足 / S3 桶空间不足 检查 IAM 角色策略 / 清理 S3 旧数据 快照恢复后索引为只读 未正确关闭索引 执行 POST /restored_index/_open 保留策略未删除旧快照 时间计算错误(时区问题) 调整策略为 UTC 时间或时区偏移

关键命令总结

  • 创建策略PUT _slm/policy/
  • 手动执行POST _slm/policy//_execute
  • 恢复数据POST _snapshot///_restore
  • 删除快照DELETE _snapshot//

相信聪明的你已经完整掌握 SLM 在真实场景中的落地过程,实现 “备份自动化 + 成本可控 + 一键恢复” 的核心目标。