文章目录
- [Elasticsearch 8.2.3 快照迁移实战:从备份到恢复的完整指南](#Elasticsearch 8.2.3 快照迁移实战:从备份到恢复的完整指南)
-
- 一、为什么选快照而不是其他方案
- 二、源服务器:创建快照
-
- [1. 准备备份目录](#1. 准备备份目录)
- [2. 配置 path.repo](#2. 配置 path.repo)
- [3. 注册快照仓库](#3. 注册快照仓库)
- [4. 创建快照](#4. 创建快照)
- [5. 确认快照状态](#5. 确认快照状态)
- [6. 打包传输](#6. 打包传输)
- 三、目标服务器:恢复数据
-
- [1. 版本必须一致](#1. 版本必须一致)
- [2. 同样配置 path.repo 并重启](#2. 同样配置 path.repo 并重启)
- [3. 解压备份文件](#3. 解压备份文件)
- [4. 注册仓库](#4. 注册仓库)
- [5. 恢复快照](#5. 恢复快照)
- 四、进阶:恢复时重命名索引
- 五、验证数据完整性
-
- [1. 对比索引列表](#1. 对比索引列表)
- [2. 对比文档数](#2. 对比文档数)
- [3. 抽样查询比对](#3. 抽样查询比对)
- [4. 检查 mapping 和 settings](#4. 检查 mapping 和 settings)
- [5. 别名验证](#5. 别名验证)
- 六、回滚方案
- 七、常见问题
- 八、总结
Elasticsearch 8.2.3 快照迁移实战:从备份到恢复的完整指南
迁移 Elasticsearch 数据,最稳妥的方式不是 dump 索引再重建,而是用 ES 自带的 snapshot(快照) 功能------mapping、settings、别名、数据一次打包,恢复时一条命令搞定,结构零丢失。
下面以 ES 8.2.3 单节点环境为例,完整走一遍从源服务器导出到目标服务器恢复的全流程,并附上数据完整性验证和回滚方案。
一、为什么选快照而不是其他方案
常见的 ES 数据迁移方式有几种:
-
reindex 远程重建:需要在目标集群重建 mapping,字段类型一旦对不上就报错,别名、同义词、分析器配置也容易漏。
-
导出 JSON 再 bulk 导入:只搬数据,结构全丢,恢复成本极高。
-
直接拷贝 data 目录:ES 官方明确不推荐,跨版本、跨平台极易损坏。
-
snapshot 快照:官方推荐,结构和数据一并保留,支持增量备份,恢复时可选索引、可重命名,是目前最稳的方案。
-
集群ES快照
txt1、使用 fs 类型快照仓库时,集群中所有 master 节点和数据节点都需要在 elasticsearch.yml 中配置 path.repo,并滚动重启,不然建立仓库将失败。 2、path.repo 指向的路径必须是所有节点都能访问的共享存储,例如 NFS/SMB,且挂载路径一致,不然建立仓库将失败。 3、多节点集群如果都是 master-eligible 节点,投票配置通常需要 至少 2 票才能选主。 只启动 1 个节点时,确实达不到法定人数,所以无法完成选举,集群不可用,导出失败 4、不能简单把集群节点改成单机部署来读取快照数据。如果直接修改集群发现配置、投票配置或数据目录,可能导致原集群状态异常、分片无法分配或启动失败。 5、作者没有共享存储,所以集群导出数据失败了
二、源服务器:创建快照
1. 准备备份目录
bash
# 创建目录,属主必须与 ES 进程用户一致
mkdir -p /data/es_backup
# 确认 ES 进程用户(通常是 elasticsearch)
ps -ef | grep elasticsearch
# 修改属主
chown elasticsearch:elasticsearch /data/es_backup
如果属主不对,ES 会报
AccessDeniedException,这一步务必确认。
2. 配置 path.repo
编辑 elasticsearch.yml,添加:
yaml
path.repo: ["/data/es_backup"]
这个配置必须提前写在配置文件里 ,仅通过 API 注册仓库是不够的,ES 会拒绝。改完后重启 ES。
3. 注册快照仓库
bash
curl -u elastic:'<你的密码>' -k -X PUT \
"https://localhost:9200/_snapshot/es_repo" \
-H 'Content-Type: application/json' -d '{
"type": "fs",
"settings": {
"location": "/data/es_backup",
"compress": true
}
}'
返回 "acknowledged": true 即成功。
4. 创建快照
bash
curl -u elastic:'<你的密码>' -k -X PUT \
"https://localhost:9200/_snapshot/es_repo/snap1?wait_for_completion=true" \
-H 'Content-Type: application/json' -d '{
"indices": "atlas_test2025_new_vertex_index,test2025_sample_data,atlas_test2025_ana_data_index,resourcecatalog_table_index,resourcecatalog_column_index,atlas_object_ana_data_index,pro_sampledata_index",
"include_global_state": false
}'
要点:
wait_for_completion=true让请求阻塞直到完成,方便脚本化。include_global_state: false非常关键,否则会连带恢复源集群的系统索引和集群级设置,可能覆盖目标环境。
5. 确认快照状态
bash
curl -u elastic:'<你的密码>' -k \
"https://localhost:9200/_snapshot/es_repo/snap1"
返回中 "state": "SUCCESS" 表示快照完成。如果看到 PARTIAL,说明部分分片失败,需要排查。
6. 打包传输
bash
cd /data
tar czf es_backup_$(date +%Y%m%d).tar.gz es_backup
然后通过 scp、rsync 或其他方式传到目标服务器。
三、目标服务器:恢复数据
1. 版本必须一致
源和目标 ES 版本需同为 8.2.3。跨大版本恢复不被支持,小版本之间也可能有兼容问题。
bash
curl -u elastic:'<你的密码>' -k "https://localhost:9200"
查看 version.number 确认。
2. 同样配置 path.repo 并重启
和源服务器一样,在 elasticsearch.yml 中设置:
yaml
path.repo: ["/data/es_backup"]
重启 ES。
3. 解压备份文件
bash
tar xzf es_backup_20261029.tar.gz -C /data
chown -R elasticsearch:elasticsearch /data/es_backup
4. 注册仓库
bash
curl -u elastic:'<你的密码>' -k -X PUT \
"https://localhost:9200/_snapshot/es_repo" \
-H 'Content-Type: application/json' -d '{
"type": "fs",
"settings": {
"location": "/data/es_backup"
}
}'
5. 恢复快照
bash
curl -u elastic:'<你的密码>' -k -X POST \
"https://localhost:9200/_snapshot/es_repo/snap1/_restore?wait_for_completion=true" \
-H 'Content-Type: application/json' -d '{
"include_global_state": false
}'
返回 "accepted": true 且后续查询状态为 SUCCESS 即恢复完成。
四、进阶:恢复时重命名索引
如果生产环境需要把 test2025 前缀换成 prod,可以在恢复时直接重命名,无需手动重建:
json
POST _snapshot/es_repo/snap1/_restore
{
"indices": "atlas_test2025_*",
"rename_pattern": "(.*)test2025(.*)",
"rename_replacement": "$1prod$2",
"include_global_state": false
}
例如 atlas_test2025_new_vertex_index 会恢复为 atlas_prod_new_vertex_index。
恢复后记得同步修改 Nacos 中
datamanage-common.yml/datamanage-backend-test.yml里的索引名配置,并重启相关服务。
五、验证数据完整性
恢复完成后,务必做一轮校验。
1. 对比索引列表
bash
# 源集群
curl -u elastic:'<你的密码>' -k "https://源IP:9200/_cat/indices?v&s=index"
# 目标集群
curl -u elastic:'<你的密码>' -k "https://目标IP:9200/_cat/indices?v&s=index"
索引数量和名称应一致(或按预期重命名)。
2. 对比文档数
bash
curl -u elastic:'<你的密码>' -k \
"https://localhost:9200/_cat/indices?v&h=index,docs.count,store.size&s=index"
逐个索引对比 docs.count,必须完全一致。
3. 抽样查询比对
挑几个核心索引,用相同的查询条件在两边各查一次,比对返回结果:
bash
curl -u elastic:'<你的密码>' -k -X GET \
"https://localhost:9200/atlas_test2025_new_vertex_index/_search" \
-H 'Content-Type: application/json' -d '{
"query": { "match_all": {} },
"size": 5,
"sort": [{ "_id": "asc" }]
}'
按 _id 排序后抽样比对,命中率最高。
4. 检查 mapping 和 settings
bash
curl -u elastic:'<你的密码>' -k \
"https://localhost:9200/atlas_test2025_new_vertex_index/_mapping"
curl -u elastic:'<你的密码>' -k \
"https://localhost:9200/atlas_test2025_new_vertex_index/_settings"
确认字段类型、分词器、分片数等与源一致。
5. 别名验证
如果原索引有别名,确认别名是否一并恢复:
bash
curl -u elastic:'<你的密码>' -k "https://localhost:9200/_aliases"
六、回滚方案
如果恢复后发现数据有问题,或者恢复过程中出错,按以下情况处理。
情况一:恢复完成后发现数据不对
直接删除已恢复的索引,重新恢复:
bash
# 删除已恢复的索引
curl -u elastic:'<你的密码>' -k -X DELETE \
"https://localhost:9200/atlas_test2025_new_vertex_index,test2025_sample_data,..."
# 重新恢复
curl -u elastic:'<你的密码>' -k -X POST \
"https://localhost:9200/_snapshot/es_repo/snap1/_restore?wait_for_completion=true" \
-H 'Content-Type: application/json' -d '{
"include_global_state": false
}'
情况二:恢复过程中断或失败
先查看快照恢复状态:
bash
curl -u elastic:'<你的密码>' -k \
"https://localhost:9200/_snapshot/es_repo/snap1/_status"
如果状态为 FAILED 或 PARTIAL,先清理残留索引,再重新执行恢复命令。快照本身不会被破坏,可以反复恢复。
情况三:目标集群原有数据需要保留
如果目标集群原本就有同名索引,恢复会失败。此时有两种选择:
- 先备份目标集群当前数据(同样用 snapshot),再删除同名索引后恢复。
- 使用
rename_pattern/rename_replacement将恢复的索引改名,避免冲突。
七、常见问题
AccessDeniedException:备份目录属主不是 ES 进程用户,chown修正即可。repository_missing_exception:path.repo未配置或未重启 ES,检查elasticsearch.yml。snapshot_in_progress:同一仓库不能同时创建两个快照,等前一个完成或取消。- ES 8.x 默认开启 TLS :curl 必须加
-k或导入证书;如果测试环境关闭了 TLS,改用http。 - 单节点 vs 多节点 :多节点集群时
path.repo必须是所有节点可见的共享存储(如 NFS);单节点无此限制。
八、总结
快照迁移的核心就三步:配 repo → 建快照 → 恢复,但细节决定成败:
path.repo必须写进配置文件并重启。include_global_state: false一定要加。- 恢复后做文档数、抽样、mapping 三重校验。
- 保留快照文件,随时可以回滚重做。
用快照做迁移,比手工重建索引安全得多,也适合做定期备份。生产环境建议配合 cron 定时快照,保留最近 N 份,既防迁移失误,也防数据丢失。