Elasticsearch 8.2.3 快照迁移实战:从备份到恢复的完整指南

文章目录

Elasticsearch 8.2.3 快照迁移实战:从备份到恢复的完整指南

迁移 Elasticsearch 数据,最稳妥的方式不是 dump 索引再重建,而是用 ES 自带的 snapshot(快照) 功能------mapping、settings、别名、数据一次打包,恢复时一条命令搞定,结构零丢失。

下面以 ES 8.2.3 单节点环境为例,完整走一遍从源服务器导出到目标服务器恢复的全流程,并附上数据完整性验证和回滚方案。

一、为什么选快照而不是其他方案

常见的 ES 数据迁移方式有几种:

  • reindex 远程重建:需要在目标集群重建 mapping,字段类型一旦对不上就报错,别名、同义词、分析器配置也容易漏。

  • 导出 JSON 再 bulk 导入:只搬数据,结构全丢,恢复成本极高。

  • 直接拷贝 data 目录:ES 官方明确不推荐,跨版本、跨平台极易损坏。

  • snapshot 快照:官方推荐,结构和数据一并保留,支持增量备份,恢复时可选索引、可重命名,是目前最稳的方案。

  • 集群ES快照

    txt 复制代码
    1、使用 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 份,既防迁移失误,也防数据丢失。

相关推荐
roman_日积跬步-终至千里4 小时前
数仓方法论(二):指标设计与规范化——让经营目标成为共同的衡量规则
大数据
Kari114 小时前
Dify多租户架构:从单团队到SaaS化服务
大数据·人工智能·架构
大大大大晴天13 小时前
从 Prompt 到 Tool Calling:AI Agent 如何稳定连接程序世界
大数据·agent
key_3_feng14 小时前
反馈闭环:Agent 自我进化的真正引擎
大数据·agent
EnCi Zheng15 小时前
Agent 如何进行工具调用:从一次 Function Calling 到生产级工具编排的完整链路
大数据·人工智能·agent·ai编程·工具调用
GlobalInfo15 小时前
重磅发布 | 2026年船体清洁机器人行业研究报告:市场规模、发展前景与十五五战略地图
大数据·人工智能·机器人
海宇服务15 小时前
零信任架构实战:基于海宇全能小微企业报告构建自动化园区商户免押租赁资信核验网关
大数据·人工智能·架构·自动化
热文新讯16 小时前
迎进博·话疗愈:2026酒店“疗愈睡眠”闭门研讨会在沪举行
大数据·人工智能·物联网
NailiConveyor19 小时前
柔性物流方案如何适配工厂升级?自动化输送流水线定制要点
大数据·运维·自动化·制造·业界资讯