Elasticsearch快照迁移是一种非常可靠、高效的数据迁移方案,特别适合大数据量、跨版本迁移或作为数据备份的场景。它通过将数据备份到共享仓库,再从中恢复的方式来完成迁移。
为了帮助您清晰地了解并执行整个流程,我为您梳理了以下详细的步骤和说明。
🔍 快照迁移流程概览
阶段 | 关键步骤 | 执行集群 | 核心目标 |
---|---|---|---|
1. 准备阶段 | 配置共享存储/仓库 | 源集群 & 目标集群 | 建立一个双方都能访问的存储位置,用于存放快照。 |
2. 备份阶段 | 创建快照 | 源集群 | 将源索引的数据状态保存到共享仓库中。 |
3. 恢复阶段 | 从快照恢复 | 目标集群 | 从共享仓库中的快照,将数据还原到目标集群。 |
4. 验证阶段 | 检查数据完整性 | 目标集群 | 验证索引是否成功恢复,数据是否一致。 |
🛠️ 详细操作步骤
阶段一:准备共享仓库
这是最关键的一步。您需要一个源集群和目标集群所有节点都能访问的共享存储。
1. 选择并设置共享存储
假设我们使用NFS,并将其挂载到了所有节点的 /mnt/es_snapshots
目录下。
2. 在源集群注册快照仓库
-
修改配置 :在源集群每个节点 的
elasticsearch.yml
文件中添加仓库路径,然后重启集群。yamlpath.repo: ["/mnt/es_snapshots"]
-
注册仓库 :通过API告诉ES这个仓库的位置。
bash# 在源集群执行 curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo" { "type": "fs", "settings": { "location": "/mnt/es_snapshots", "compress": true } }
my_migration_repo
:是您为仓库取的名字。type: "fs"
:表示使用共享文件系统。
阶段二:在源集群创建快照
现在,您可以将数据备份到刚创建的仓库中。
bash
# 在源集群执行
curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo/my_snapshot_20240527?wait_for_completion=true
{
"indices": "index1,index2", # 指定要备份的索引,用逗号分隔。不指定则备份所有。
"ignore_unavailable": true, # 如果某个索引不存在,忽略它
"include_global_state": false # 不建议迁移集群全局状态,以免冲突
}
my_snapshot_20240527
:是快照的名称,建议包含日期。wait_for_completion=true
:参数会让请求一直等待,直到快照完成。对于大数据量,可以设为false
让它在后台运行,然后通过GET /_snapshot/my_migration_repo/my_snapshot_20240527
来查询状态。
阶段三:在目标集群恢复快照
1. 同样配置目标集群
我们需要源集群创建快照文件复制到目标集群的path.repo
目录中,当执行_restore
的时候会从对应的仓库下获取对应名称的快照,这个名称源集群创建的时候是什么就是什么。
-
在目标集群每个节点 的
elasticsearch.yml
中配置相同的path.repo
,并重启集群。yamlpath.repo: ["/mnt/es_snapshots"]
-
在目标集群上注册同一个仓库 (使用相同的名称和配置)。
bash# 在目标集群执行 curl -X PUT "http://<您的ES地址>:9200/_snapshot/my_migration_repo" { "type": "fs", "settings": { "location": "/mnt/es_snapshots", "compress": true } }
2. 执行恢复操作
bash
# 在目标集群执行
curl POST "http://<您的ES地址>:9200/_snapshot/my_migration_repo/my_snapshot_20240527/_restore?wait_for_completion=true"
{
"indices": "index1,index2", # 指定要恢复的索引
"ignore_unavailable": true,
"include_global_state": false,
"rename_pattern": "(.+)", # 可选:使用正则表达式重命名索引
"rename_replacement": "restored_$1" # 例如,给所有恢复的索引加上前缀
}
阶段四:验证恢复状态
恢复完成后,进行数据验证。
bash
# 1. 检查索引是否存在
curl GET "http://<您的ES地址>:9200/_cat/indices/index1,index2?v
# 2. 对比文档数量
GET _cat/count/index1
GET _cat/count/index2
# 3. 检查恢复状态(如果恢复过程较长)
curl GET "http://<您的ES地址>:9200/_recovery?pretty
⚠️ 重要注意事项
- 版本兼容性 :目标集群的Elasticsearch主版本号必须大于或等于源集群的版本。例如,可以从 7.x 恢复到 8.x,但不能从 8.x 恢复到 7.x。
- 停止写入 :为了确保数据一致性,建议在创建快照前,停止对源索引的写操作,或将索引设置为只读模式。
- 存储空间:确保共享存储(如NFS)有足够的空间存放快照。
- 权限问题 :确保ES进程有权限在共享目录(如
/mnt/es_snapshots
)中读写。
💎 总结
快照迁移方案的优势在于其稳定性和对大数据量的友好性。虽然初次设置共享存储可能需要一些步骤,但一旦配置完成,它就是最可靠的迁移方式之一,尤其适合作为生产环境的迁移方案。
⚠️ 常见问题
- 确认快照仓库 :
curl -XGET 'http://<您的ES地址>:9200/_snapshot/my_migration_repo'
,请确保my_migration_repo
是您之前创建并用于存储快照的仓库名称。 - 查看仓库中的所有快照 :
curl -XGET 'http://<您的ES地址>:9200/_snapshot/my_migration_repo/_all?pretty'
,可以查看快照的名称以及仓库的名称。 - 创建的分片处于 UNASSIGNED 状态 ,意味着分片无法分配到任何节点。这是常见的集群问题。 我们查看分片的情况:
curl -XGET 'http://<您的ES地址>:9200/_cat/indices?v
,发现目标索引的health是red状态。curl -XGET 'http://<您的ES地址>:9200/_cat/allocation?v
,发现节点处于UNASSIGNED状态,没有分配,然后查看分配情况。 - 启动发现缺少了插件 :
curl -X POST "localhost:9200/_cluster/reroute?pretty"
,提示缺少analyzer [ik_max_word_]has not been configured in mappings.
- 安装analyzer ik插件 :
https://release.infinilabs.com/analysis-ik/stable/
下载与es版本对应的插件,上传到es目录的plugins
下,创建一个plugins/ik
目录,使用unzip解压即可,然后验证:./bin/elasticsearch-plugin list
,可以看到新装的插件。
常见指令
- 手动管理 Elasticsearch 分片分配的利器:curl -X POST "localhost:9200/_cluster/reroute?pretty"
- ES查看索引状态:
curl -XGET 'http://<您的ES地址>:9200/_cat/indices?v'
- ES创建索引:
curl -X PUT "localhost:9200/my_index"
ik 分词设置
- 索引分词设置 :
curl -XGET 'http://<您的ES地址>:9200/my_index/_setting'
- 查看字段的分词映射 :
curl -XGET 'http://<您的ES地址>:9200/my_index/_mapping'