前言:由于做项目的时候没有进行长期考虑,把es,mysql,api等都部署在同一台服务器上,随着业务的增加,需要将部分服务和存储迁移到其他服务器。es上目前已有100万以上的数据,上网查资料,snapshot适合数据量大的迁移,所以没来得及考虑就果断选择尝试一下。 

一.生成快照

1.修改配置文件 

找到es配置文件elasticsearch.yml ,在配置文件中添加 path.repo注册位置,由于es都是使用的非root用户启动,当前用户需要有权限能读写,所以建议目录设置为用户/home/{user}/backup,比如我自己的es的用户是elk,但由于公司配的服务器磁盘挂在在根目录下,home目录只有2G的内存,所以我自己的配置是将快照配置在根目录下一个文件夹,并设置为elk用户的管理权限,我设置的配置信息如下:

创建过程:

cd /data/                   #进入data目录
mkdir elk                   #创建文件夹
chown -R elk:elk /data/elk  #赋予elk用户和用户组
chmod 777 /data/elk         #赋予该用户可读写执行的权限
path.repo: ["/data/elk/backup"]

配置截图如下:

ES shanpshot迁移 es数据怎么迁移_ES shanpshot迁移

 2.重启Elasticsearch,然后执行http 注册存储库

重启:先使用:ps aux | grep elastic命令找到es的进程号,然后kill -9 进程号杀掉,再启动es

执行http 注册存储库:

curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/_snapshot/backup' -d '{
    "type": "fs",
    "settings": {
        "location": "/data/elk/backup",
        "compress": true
    }
}'

参数说明:backup是共享文件系统仓库,生成的快照将会存储在 /data/elk/backup 这个目录。 

执行截图:

ES shanpshot迁移 es数据怎么迁移_json_02

查看执行结果:?pretty是美化返回结果,使返回结果换行美观,可以清楚的看见json结构。

curl http://localhost:9200/_snapshot?pretty

结果截图:

ES shanpshot迁移 es数据怎么迁移_服务器_03

 以上结果代表注册成功。

3.执行快照请求

curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_snapshot/backup/snapshot_20200319?pretty

snapshot_20200319为快照名称,执行成功如下图:

ES shanpshot迁移 es数据怎么迁移_服务器_04

 查看快照执行结果:

curl -H "Content-Type: application/json" -XGET http://localhost:9200/_snapshot/backup/snapshot_20200319?pretty

运行截图:

ES shanpshot迁移 es数据怎么迁移_服务器_05

等待快照注册成功,等待"state": "SUCCESS"的标识就行快照完全生成成功。如果希望在脚本中一直等待到完成,可通过添加 wait_for_completion=true 标记实现,但如果数据特别多的话等待时间会很长。可写成:

curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_snapshot/backup/snapshot_20200319?wait_for_completion=true

最终成功的截图:

ES shanpshot迁移 es数据怎么迁移_服务器_06

二、快照还原

1.在新的服务器上修改配置文件,快照路径尽量需要和原服务器上的一致,按照上面注册存储库,再执行备份

path.repo: ["/data/elk/backup"]

ES shanpshot迁移 es数据怎么迁移_服务器_07

2.将backup复制到新服务器

scp -r /data/elk/backup/ root@192.168.11.24:/data/elk

3.执行还原:

curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_snapshot/backup/snapshot_20200319/_restore?pretty

4.还原以后可以删除存储库,并将配置path.repo: ["/data/elk/bakcup"]注释掉还原(可选操作)

curl -H "Content-Type: application/json" -XDELETE http://localhost:9200/_snapshot/backup?pretty

删除成功截图:

ES shanpshot迁移 es数据怎么迁移_服务器_08

此时可以注释掉存储库的配置,重启es,当一个库被删除,Elasticsearch仅删除存储库的位置的引用,快照本身并没有被删除。