目的:ES5.6.14 数据迁移至ES5.6.16
原理:保存在快照(snapshot)中的信息没有绑定任何版本的ES,因此可以通过拍snapshot实现不同版本之间的数据传输
注:通过snapshot最多跨越一个大版本(即4.x==>5.x)
步骤:
- ES5.6.14操作
- 配置文件elasticsearch.yml添加快照的仓库repo路径
path.repo: ……/指定位置
- 关闭ES14自动平衡,据说会浪费大量时间在IO上,官方文档有,全英看的眼花
# 我使用的是ES命令,如果是curl操作,自行转换,不作赘述
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}
- 重启ES14(我就是简单的kill再重启,不知道合适否)
- 启动自平衡
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}
- 根据简书的意见,上述1~4操作需要单个节点一个一个往复单独操作,具体原因我也不懂
- 设置集群快照
# 创建快照仓库client_statistic(仓库名称随便自己喜好)
PUT _snapshot/client_statistic
{
"type": "fs" # 文件系统
, "settings": {
"location": "……" #仓库存放位置,应该与前面所配置的path.repo路径一致
, "compress": true
, "max_snapshot_bytes_per_sec": "50mb"
, "max_restore_bytes_per_sec": "50mb"
}
}
其中或许或出现一些报错,简书有提供一些错误的解决方法
- 在仓库中创建指定索引的快照
# 制作快照
PUT _snapshot/{仓库名称0}/{快照名称}
{
"indices": "{索引index}"
}
由于我的ES14与ES16在同一台机器上,我设置了相同的仓库目录,所以不需要将ES14仓库搬到ES16仓库中(不同机器可以考虑scp传输)
- ES5.6.16操作
- 修改YML文件,同上,增加一项path.repo
- 关闭自动平衡,同上
- 创建数据仓库,同上(仓库同名,这样就能在新的ES上使用拷贝过来的快照仓库)
- 快照恢复
POST _snapshot/{仓库}/{快照}/_restore?wait_for_completion=true
{
"include_global_state": false
, "ignore_unavailable": true
}
参数意义可参照官方文档
理论上我做到这一步后,只要我重启ES,ES5.6.14的数据就算成功迁移到ES5.6.16,但是当我使用
{"query": {"match_all": {}}}
发现还是查不到数据,而且报500错误
参展文章,
运行命令
POST _flush/synced
意思大概就是刷新同步的意思把,才真正查询到数据