Elasticsearch 的 snapshot 和 restore 怎么理解?
简化版
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 前要考虑同名索引、全局状态、容量和版本兼容。副本不是备份,快照也不是实时容灾,真正可靠的方案一定包含定期恢复演练。