0%

数据迁移

Elasticsearch 数据迁移:基于快照(Snapshot)的完整方案

当 Elasticsearch 服务器更换位置或集群升级时,数据迁移是核心任务。快照(Snapshot)是官方推荐的迁移方式,通过将索引数据备份到共享存储,再在目标集群恢复,实现安全高效的数据迁移。本文详细讲解基于快照的迁移流程,包括源集群备份、目标集群恢复及关键注意事项。

迁移原理与优势

快照迁移的核心原理

  • 快照(Snapshot):将 Elasticsearch 索引的元数据、分片数据备份到指定存储(如本地文件系统、S3、HDFS 等)。
  • 恢复(Restore):在目标集群中读取快照文件,重建索引结构和数据。

优势

  • 完整性:完整备份索引的所有数据(包括映射、设置、分片),无数据丢失风险。
  • 灵活性:支持选择性备份 / 恢复指定索引,适合大规模集群。
  • 低影响:备份过程为增量式(仅备份变更数据),对源集群性能影响小。

源服务器(旧集群)操作

准备备份目录

创建用于存储快照的本地目录,并授权 Elasticsearch 进程访问:

1
2
3
4
5
# 创建目录
mkdir -p /data/elasticsearch/backups
# 授权(假设 Elasticsearch 运行用户为 elasticsearch)
chown -R elasticsearch:elasticsearch /data/elasticsearch/backups
chmod 755 /data/elasticsearch/backups

配置快照仓库路径

修改 elasticsearch.yml,添加快照仓库的根目录配置:

1
path.repo: ["/data/elasticsearch/backups"]  # 支持多个路径,用逗号分隔

注意:需重启 Elasticsearch 使配置生效。

创建快照仓库(Repository)

通过 API 注册快照仓库(指定存储类型和路径):

1
2
3
4
5
6
7
8
curl -X PUT "http://192.168.1.115:9200/_snapshot/my_repository" \
-H "Content-Type: application/json" \
-d '{
"type": "fs", # 本地文件系统类型
"settings": {
"location": "/data/elasticsearch/backups" # 对应步骤1创建的目录
}
}'
  • 响应 {"acknowledged": true} 表示仓库创建成功。

创建快照(备份数据)

备份指定索引(如 indexName1indexName2)到仓库:

1
2
3
4
5
6
7
curl -X PUT "http://192.168.1.115:9200/_snapshot/my_repository/snapshot_20230726?wait_for_completion=true" \
-H "Content-Type: application/json" \
-d '{
"indices": "indexName1,indexName2", # 需备份的索引,逗号分隔
"ignore_unavailable": false, # 索引不存在时是否忽略(false=报错)
"include_global_state": false # 是否备份集群全局状态(如模板,建议false)
}'
  • wait_for_completion=true:等待快照完成后返回结果(适合小型索引;大型索引建议省略,后台运行)。
  • 快照文件会生成在 /data/elasticsearch/backups 目录下。

目标服务器(新集群)操作

准备恢复环境

在目标服务器执行与源服务器相同的目录准备和配置步骤:

1
2
3
4
5
6
7
# 创建相同目录
mkdir -p /data/elasticsearch/backups
chown -R elasticsearch:elasticsearch /data/elasticsearch/backups

# 修改 elasticsearch.yml 并重启
echo 'path.repo: ["/data/elasticsearch/backups"]' >> /etc/elasticsearch/elasticsearch.yml
systemctl restart elasticsearch

复制快照文件

将源服务器的快照文件复制到目标服务器的备份目录:

1
2
3
4
5
# 从源服务器下载快照(示例使用 scp)
scp -r root@192.168.1.115:/data/elasticsearch/backups/* /data/elasticsearch/backups/

# 确保权限正确
chown -R elasticsearch:elasticsearch /data/elasticsearch/backups

注册快照仓库(目标集群)

在目标集群中注册与源集群同名的仓库(路径需一致):

1
2
3
4
5
6
7
8
curl -X PUT "http://192.168.1.116:9200/_snapshot/my_repository" \
-H "Content-Type: application/json" \
-d '{
"type": "fs",
"settings": {
"location": "/data/elasticsearch/backups"
}
}'

验证快照可用性

查询仓库中的快照,确认源服务器的快照已被识别:

1
curl "http://192.168.1.116:9200/_snapshot/my_repository/_all?pretty"
  • 响应中应包含 snapshot_20230726 及相关索引信息。

恢复快照(迁移数据)

将快照中的索引恢复到目标集群:

1
2
3
4
5
6
7
8
9
curl -X POST "http://192.168.1.116:9200/_snapshot/my_repository/snapshot_20230726/_restore" \
-H "Content-Type: application/json" \
-d '{
"indices": "indexName1,indexName2", # 需恢复的索引(可与备份时不同)
"rename_pattern": "index_(.+)", # 可选:重命名索引(如 index_1 → new_index_1)
"rename_replacement": "new_index_$1",
"ignore_unavailable": true,
"include_global_state": false
}'
  • 重命名索引:若目标集群已存在同名索引,需通过 rename_patternrename_replacement 重命名,避免冲突。
  • 恢复进度可通过 GET _recovery 查看。

验证迁移结果

  1. 检查索引是否存在
1
curl "http://192.168.1.116:9200/_cat/indices?v"

确认 indexName1indexName2 已存在且状态为 greenyellow

  1. 验证文档数量
1
2
3
4
5
# 源集群查询
curl "http://192.168.1.115:9200/indexName1/_count"

# 目标集群查询
curl "http://192.168.1.116:9200/indexName1/_count"

确保两边文档数一致。

  1. 抽样检查数据
1
curl "http://192.168.1.116:9200/indexName1/_search?size=10&pretty"

验证文档内容与源集群一致。

关键注意事项

  1. 版本兼容性

    • 快照只能恢复到与源集群版本相同或更高的集群(如 7.14 快照可恢复到 7.14 或 8.x,不可恢复到 6.x)。
    • 跨大版本迁移(如 6.x → 8.x)需先升级到中间版本(如 7.x),再备份恢复。
  2. 存储权限

    • 源和目标集群的 path.repo 目录权限必须正确(Elasticsearch 用户可读写),否则快照 / 恢复会失败。
  3. 大型索引处理

    • 大型索引(TB 级)建议分多次快照,或在低峰期执行,避免影响业务。

    • 恢复时可通过indices.recovery.max_bytes_per_sec调整速度(默认 40MB/s):

      1
      2
      curl -X PUT "http://192.168.1.116:9200/_cluster/settings" \
      -d '{"transient": {"indices.recovery.max_bytes_per_sec": "100mb"}}'
  4. 索引别名与模板

    • 快照不包含索引别名和模板,需手动在目标集群重建(可通过 _template_aliases API 导出导入)。
  5. 清理快照

    • 迁移完成后,可删除源和目标集群的快照文件释放空间:

      1
      curl -X DELETE "http://192.168.1.115:9200/_snapshot/my_repository/snapshot_20230726"

欢迎关注我的其它发布渠道