← 返回题目列表

Elasticsearch 的 snapshot 和 restore 怎么理解?

高频 中等 第 8 / 30 题 更新于 2026/07/29
ElasticsearchSnapshotRestore备份恢复

简化版

Snapshot 是 Elasticsearch 官方推荐的备份方式,会把索引、数据流和部分集群状态备份到仓库中,支持增量快照。Restore 用于恢复索引或迁移数据。不能把直接拷贝 data 目录当成可靠备份。

详细版

ES 快照需要先注册 repository,例如文件系统、S3、HDFS 等,再创建 snapshot:

PUT /_snapshot/my_repo/snap_20260729
{
  "indices": "logs-*",
  "include_global_state": false
}

快照通常是增量的,后续快照只存储新增变化的 segment。面试重点:快照不是简单文件复制;恢复前要考虑版本兼容、索引是否已存在、别名和全局状态、集群容量、恢复限速和演练。

完整版教学

一、为什么不能直接拷贝 data 目录

Elasticsearch 节点的数据目录包含 Lucene segment、translog、集群元数据和节点本地状态。运行中直接拷贝目录,很难保证跨节点、跨分片的一致性。

快照机制由 ES 自己协调,能在集群运行时生成一致的备份视图。

wrong: cp data nodes manually
right: snapshot repository + snapshot API

记忆钩子:ES 备份走 snapshot,不靠手拷 data 目录赌一致性。

二、Snapshot 需要 repository

创建快照前要注册仓库。仓库可以是共享文件系统、对象存储等。

PUT /_snapshot/my_repo
{
  "type": "fs",
  "settings": {
    "location": "/mnt/es_backup"
  }
}

生产常用对象存储作为仓库,因为容量、可靠性和跨机房能力更好。无论哪种仓库,都要确保所有相关节点有权限访问。

注册仓库后才能创建具体 snapshot。

三、快照是基于 segment 的增量备份

Lucene segment 一旦写成通常不可变。ES 可以利用这个特性做增量快照:已经备份过的 segment 不必重复上传,新快照主要引用旧 segment 加新增 segment。

snapshot-1: segA + segB
snapshot-2: segA + segB + segC
only segC needs new upload

这也是为什么快照删除不是简单删除目录。一个 segment 可能被多个 snapshot 引用,ES 会管理引用关系,只删除不再被任何快照使用的数据。

四、Restore 前要规划目标状态

恢复时要考虑索引是否已经存在。如果目标集群已有同名 open index,直接恢复可能失败。常见做法是关闭原索引、删除后恢复,或者恢复时改名。

POST /_snapshot/my_repo/snap_20260729/_restore
{
  "indices": "logs-*",
  "rename_pattern": "logs-(.+)",
  "rename_replacement": "restored-logs-$1"
}

还要考虑 include_global_state。恢复全局状态可能带回模板、ILM、集群设置和安全相关状态,跨环境恢复时要谨慎。

五、快照不是实时容灾

快照适合备份和恢复,但不是零 RPO 的实时复制。快照间隔是 30 分钟,就可能丢失最近 30 分钟内尚未进入快照的数据。

方案目标RPO/RTO 特点
Snapshot备份恢复分钟到小时级
CCR跨集群复制更接近实时
双写应用级容灾复杂度更高

面试里要区分备份、容灾和高可用。副本也不是备份,因为误删索引会同步删除副本。

六、快照策略要演练恢复

只创建快照但从未恢复演练,等于没有验证备份有效性。

生产策略至少包括:

1. 定期快照,例如每小时或每天
2. 保留策略,例如保留 7 天、30 天
3. 跨可用区或对象存储仓库
4. 定期恢复演练
5. 监控 snapshot 成功率和耗时

恢复演练要关注容量、权限、版本兼容、索引模板和业务切流。

七、常见误区与追问

  • 误区:有副本就不需要快照。 副本解决节点故障,不能防误删、误写、集群级灾难。
  • 误区:直接备份 data 目录就行。 运行中手动拷贝难以保证一致性,官方推荐 snapshot。
  • 误区:快照每次都是全量复制。 快照基于 segment 增量复用,重复 segment 不会反复上传。
  • 追问:恢复为什么可能失败? 目标索引已存在、版本不兼容、仓库不可访问、容量不足都可能导致失败。
  • 追问:include_global_state 要不要开? 同集群灾备可能需要,跨环境迁移通常要谨慎。
  • 追问:快照和 CCR 有什么区别? 快照是周期备份恢复,CCR 是跨集群近实时复制。

八、加强记忆

ES 备份恢复记成“仓库、快照、恢复、演练”。Snapshot 通过 repository 保存 segment 级增量备份,不能用手拷 data 目录替代;restore 前要考虑同名索引、全局状态、容量和版本兼容。副本不是备份,快照也不是实时容灾,真正可靠的方案一定包含定期恢复演练。