Elasticsearch 数据迁移:基于快照(Snapshot)的完整方案
当 Elasticsearch 服务器更换位置或集群升级时,数据迁移是核心任务。快照(Snapshot)是官方推荐的迁移方式,通过将索引数据备份到共享存储,再在目标集群恢复,实现安全高效的数据迁移。本文详细讲解基于快照的迁移流程,包括源集群备份、目标集群恢复及关键注意事项。
迁移原理与优势
快照迁移的核心原理
- 快照(Snapshot):将 Elasticsearch 索引的元数据、分片数据备份到指定存储(如本地文件系统、S3、HDFS 等)。
- 恢复(Restore):在目标集群中读取快照文件,重建索引结构和数据。
优势
- 完整性:完整备份索引的所有数据(包括映射、设置、分片),无数据丢失风险。
- 灵活性:支持选择性备份 / 恢复指定索引,适合大规模集群。
- 低影响:备份过程为增量式(仅备份变更数据),对源集群性能影响小。
源服务器(旧集群)操作
准备备份目录
创建用于存储快照的本地目录,并授权 Elasticsearch 进程访问:
1 | 创建目录 |
配置快照仓库路径
修改 elasticsearch.yml,添加快照仓库的根目录配置:
1 | path.repo: ["/data/elasticsearch/backups"] # 支持多个路径,用逗号分隔 |
注意:需重启 Elasticsearch 使配置生效。
创建快照仓库(Repository)
通过 API 注册快照仓库(指定存储类型和路径):
1 | curl -X PUT "http://192.168.1.115:9200/_snapshot/my_repository" \ |
- 响应
{"acknowledged": true}表示仓库创建成功。
创建快照(备份数据)
备份指定索引(如 indexName1、indexName2)到仓库:
1 | curl -X PUT "http://192.168.1.115:9200/_snapshot/my_repository/snapshot_20230726?wait_for_completion=true" \ |
wait_for_completion=true:等待快照完成后返回结果(适合小型索引;大型索引建议省略,后台运行)。- 快照文件会生成在
/data/elasticsearch/backups目录下。
目标服务器(新集群)操作
准备恢复环境
在目标服务器执行与源服务器相同的目录准备和配置步骤:
1 | 创建相同目录 |
复制快照文件
将源服务器的快照文件复制到目标服务器的备份目录:
1 | 从源服务器下载快照(示例使用 scp) |
注册快照仓库(目标集群)
在目标集群中注册与源集群同名的仓库(路径需一致):
1 | curl -X PUT "http://192.168.1.116:9200/_snapshot/my_repository" \ |
验证快照可用性
查询仓库中的快照,确认源服务器的快照已被识别:
1 | curl "http://192.168.1.116:9200/_snapshot/my_repository/_all?pretty" |
- 响应中应包含
snapshot_20230726及相关索引信息。
恢复快照(迁移数据)
将快照中的索引恢复到目标集群:
1 | curl -X POST "http://192.168.1.116:9200/_snapshot/my_repository/snapshot_20230726/_restore" \ |
- 重命名索引:若目标集群已存在同名索引,需通过
rename_pattern和rename_replacement重命名,避免冲突。 - 恢复进度可通过
GET _recovery查看。
验证迁移结果
- 检查索引是否存在:
1 | curl "http://192.168.1.116:9200/_cat/indices?v" |
确认 indexName1、indexName2 已存在且状态为 green 或 yellow。
- 验证文档数量:
1 | 源集群查询 |
确保两边文档数一致。
- 抽样检查数据:
1 | curl "http://192.168.1.116:9200/indexName1/_search?size=10&pretty" |
验证文档内容与源集群一致。
关键注意事项
版本兼容性:
- 快照只能恢复到与源集群版本相同或更高的集群(如 7.14 快照可恢复到 7.14 或 8.x,不可恢复到 6.x)。
- 跨大版本迁移(如 6.x → 8.x)需先升级到中间版本(如 7.x),再备份恢复。
存储权限:
- 源和目标集群的
path.repo目录权限必须正确(Elasticsearch 用户可读写),否则快照 / 恢复会失败。
- 源和目标集群的
大型索引处理:
大型索引(TB 级)建议分多次快照,或在低峰期执行,避免影响业务。
恢复时可通过indices.recovery.max_bytes_per_sec调整速度(默认 40MB/s):
1
2curl -X PUT "http://192.168.1.116:9200/_cluster/settings" \
-d '{"transient": {"indices.recovery.max_bytes_per_sec": "100mb"}}'
索引别名与模板:
- 快照不包含索引别名和模板,需手动在目标集群重建(可通过
_template和_aliasesAPI 导出导入)。
- 快照不包含索引别名和模板,需手动在目标集群重建(可通过
清理快照:
迁移完成后,可删除源和目标集群的快照文件释放空间:
1
curl -X DELETE "http://192.168.1.115:9200/_snapshot/my_repository/snapshot_20230726"