47 · snapshot 备份与恢复
阶段:第五阶段 / 运维进阶
ES:_snapshot/ SLM | PostgreSQL:pg_dump/ 基础备份 + PITR
1. 概念
ES 的备份是快照(snapshot):把索引数据增量存到一个仓库(repository)
(共享文件系统、S3、Azure、GCS 等)。快照是增量的——只存与上次不同的段,省空间。
- repository:备份存哪里(先注册)。
- snapshot:某时刻的一份备份(可含全部或部分索引)。
- SLM(Snapshot Lifecycle Management):定时自动打快照 + 按保留策略清理。
不要用「拷贝 data 目录」当备份——快照是唯一官方安全方式。
2. PostgreSQL 对照
| ES | PostgreSQL |
|---|---|
| 注册 repository | 配置备份存储位置 |
| 打 snapshot | pg_basebackup/pg_dump |
| restore | 从备份恢复 |
| SLM 定时策略 | cron + 保留策略 |
| 增量快照 | WAL 归档 / 增量备份 |
3. ES DSL
3.1 注册仓库(以共享文件系统为例)
PUT _snapshot/my_repo { "type": "fs", "settings": { "location": "/mnt/es_backup" } // 需在 elasticsearch.yml 配 path.repo }3.2 打快照 / 恢复
# 打一份包含指定索引的快照 PUT _snapshot/my_repo/snap_20260801?wait_for_completion=true { "indices": "sales-*,orders_idx", "include_global_state": false } # 恢复(可改名,避免覆盖现有索引) POST _snapshot/my_repo/snap_20260801/_restore { "indices": "orders_idx", "rename_pattern": "(.+)", "rename_replacement": "restored_$1" }3.3 SLM 自动快照策略
PUT _slm/policy/daily { "schedule": "0 30 1 * * ?", // 每天 01:30 "name": "<daily-snap-{now/d}>", "repository": "my_repo", "config": { "indices": ["*"], "include_global_state": false }, "retention": { "expire_after": "30d", "min_count": 5, "max_count": 50 } }4. Spring Boot 实现
@ComponentpublicclassDoc47Snapshot{@AutowiredprivateElasticsearchClientelasticsearchClient;/** 打一份快照(阻塞直到完成) */publicvoidcreateSnapshot(Stringrepo,Stringsnapshot,List<String>indices)throwsIOException{elasticsearchClient.snapshot().create(c->c.repository(repo).snapshot(snapshot).waitForCompletion(true).indices(indices).includeGlobalState(false));}/** 恢复快照到改名后的索引 */publicvoidrestore(Stringrepo,Stringsnapshot,List<String>indices)throwsIOException{elasticsearchClient.snapshot().restore(r->r.repository(repo).snapshot(snapshot).indices(indices).renamePattern("(.+)").renameReplacement("restored_$1").waitForCompletion(true));}}快照/恢复客户端在
elasticsearchClient.snapshot()。生产建议用SLM托管,代码里少手动打。
5. 坑与最佳实践
- 必须先注册 repository:
fs类型要在所有节点配同一path.repo并可访问。 - 恢复前先关/改名目标索引:不能直接恢复到已 open 的同名索引,用 rename 或先 close。
include_global_state谨慎:含集群设置/模板,跨集群恢复时可能不想要,一般设false。- 快照是增量、恢复是全量:删除旧快照不会破坏后续快照的可恢复性(ES 自动处理引用)。
- 定期演练恢复:备份能打 ≠ 能恢复,定期在隔离环境试 restore。
- 别拷 data 目录当备份:段文件在写入/合并中,直接拷会损坏。