三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

第五阶段 47 · snapshot 备份与恢复

第五阶段 47 · snapshot 备份与恢复

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 对照

ESPostgreSQL
注册 repository配置备份存储位置
打 snapshotpg_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. 坑与最佳实践

  1. 必须先注册 repositoryfs类型要在所有节点配同一path.repo并可访问。
  2. 恢复前先关/改名目标索引:不能直接恢复到已 open 的同名索引,用 rename 或先 close。
  3. include_global_state谨慎:含集群设置/模板,跨集群恢复时可能不想要,一般设false
  4. 快照是增量、恢复是全量:删除旧快照不会破坏后续快照的可恢复性(ES 自动处理引用)。
  5. 定期演练恢复:备份能打 ≠ 能恢复,定期在隔离环境试 restore。
  6. 别拷 data 目录当备份:段文件在写入/合并中,直接拷会损坏。

← 返回列表