这里主要介绍的是基于 Linux(CentOS7) 系统,不同服务器集群之前的数据迁移。Elasticsearch 可以通过快照(snapshot)相关的命令对索引进行备份和恢复。(这个备份是增量的,同一个索引在第一次备份的基础上进行第二次备份只会备份新变化的数据)
1、NFS 安装、配置
1.1、安装 NFS
假定旧集群有三个节点,分别对应三台服务器:192.168.1.10
、192.168.1.11
、192.168.1.12
在旧集群中指定192.168.1.10
作为 NFS(Network File System)服务端,其它两台服务器作为 NFS 客户端,分别安装 NFS:
yum install nfs-utils -y # 安装NFS
systemctl start rpcbind # 启动服务
systemctl start nfs # 启动服务,仅在 NFS 服务端执行该命令
1.2、配置 NFS 服务端
以下步骤只需要在 NFS 服务端执行。
创建数据共享目录,目录结构可以根据自己的实际情况修改:
mkdir -p /opt/data/es_backup
修改配置文件:
vim /etc/exports
# 添加如下配置
/opt/data/es_backup *(rw,sync,no_root_squash,no_subtree_check)
相关参数的含义如下:
-
*
允许所有的网段访问共享目录 -
rw
读写权限 -
sync
文件同时写入硬盘和内存 -
no_root_squash
root用户具有根目录的完全管理访问权限 -
no_subtree_check
不检查父目录权限
重启 NFS 服务端:
systemctl restart nfs
最后确保 NFS 保客户端能够访问 NFS 服务端的数据共享目录。
1.3、配置 NFS 客户端
以下步骤需要在每台 NFS 客户端服务器执行。
在 NFS 客户端服务器创建数据挂载目录,这里方便起见,目录结构和 NFS 服务端共享目录一致:
mkdir -p /opt/data/es_backup
将 NFS 服务端共享目录挂载到各个 NFS 客户端:
mount -t nfs 192.168.1.10:/opt/data/es_backup /opt/data/es_backup
这样所有的 ES 节点就可以使用同一个数据共享目录。
2、数据备份
2.1、设置 ES 快照仓库目录
在旧集群每个 ES 节点的elasticsearch.yml
中,设置 ES 快照仓库目录为前边 NFS 配置的数据共享目录,也就是 ES 数据要备份到的目录:
repo.path: /opt/data/es_backup
修改完成后重启 ES 服务。
2.2、创建快照仓库
连接旧集群中某一个节点发送PUT
请求来创建快照仓库,例如使用192.168.1.10
节点,可以使用 Postman、Kibana 发送请求:
http://192.168.1.10:9200/_snapshot/es_repo
{
"type": "fs",
"settings": {
"location": "/opt/data/es_backup",
"compress": true
}
}
或者直接在对应节点的服务器上执行如下命令:
curl -H "Content-Type: application/json" -XPUT 'http://192.168.1.10:9200/_snapshot/es_repo' -d '
{
"type": "fs",
"settings": {
"location": "/opt/data/es_backup",
"compress": true
}
}'
-
es_repo
是快照仓库的名称,可以自定义 -
type
的值指定为fs
-
location
指定仓库的路径 -
compress
表示开启压缩
2.3、创建索引的快照
创建索引的快照就是对索引进行备份,如下发送一个PUT
请求来生成index_1
、index_2
索引的快照:
http://192.168.1.10:9200/_snapshot/es_repo/my_index_snapshot
{
"indices": "index_1,index_2"
}
或者:
curl -H "Content-Type:application/json" -XPUT '192.168.1.10:9200/_snapshot/es_repo/my_index_snapshot' -d '
{
"indices": "index_1,index_2"
}'
-
es_repo
就是之前创建的快照仓库名称 -
my_index_snapshot
是索引对应的快照的名称,根据实际情况自定义即可 -
indices
用来指定要生成快照的索引,如果不添加indices
参数则会给所有索引创建快照,一般我们会根据索引大小来决定每次生成那些索引的快照。
可以在 NFS 的数据共享目录中(/opt/data/es_backup
)得到最终生成的索引快照文件。
2.4、快照相关的其它请求
查看快照仓库的信息:
GET
http://192.168.1.10:9200/_snapshot/es_repo
查看指定快照:
GET
http://192.168.1.10:9200/_snapshot/es_repo/my_index_snapshot
查看仓库中所有的快照信息:
GET
http://192.168.1.10:9200/_snapshot/es_repo/_all
删除指定快照:
DELETE
http://192.168.1.10:9200/_snapshot/es_repo/my_index_snapshot
删除快照仓库:
DELETE
http://192.168.1.10:9200/_snapshot/es_repo
3、恢复数据
3.1、搭建 NFS 环境
参考文章第一部分的内容,在新集群的服务器上搭建 NFS 环境。
3.2、创建快照仓库
给新集群每个 ES 节点配置快照仓库的目录,也就是新集群中的 NFS 数据共享目录:
repo.path: /opt/data/es_backup
连接新集群中某个 ES 节点发送PUT
请求创建快照仓库,和之前的一样:
http://192.168.2.20:9200/_snapshot/es_repo
{
"type": "fs",
"settings": {
"location": "/opt/data/es_backup",
"compress": true
}
}
3.3、从索引快照中恢复数据
先将旧集群中生成的索引快照文件拷贝到新集群的快照仓库目录下。
再连接集群中的某 ES 个节点,发送POST
请求从索引快照中恢复数据:
http://192.168.2.20:9200/_snapshot/es_repo/my_index_snapshot/_restore
{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false
}
或者:
curl -H "Content-Type:application/json" -XPOST '192.168.2.20:9200/_snapshot/es_repo/my_index_snapshot/_restore' -d '
{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false
}'
-
es_repo
是在新集群中创建的快照仓库 -
my_index_snapshot
是在旧集群中备份的索引的快照名称 -
indices
可以指定要恢复快照中的哪些索引
如果不要参数,则是恢复快照中的全部索引:
http://192.168.2.20:9200/_snapshot/es_repo/my_index_snapshot/_restore
一般情况下,我们会结合索引的大小,在旧群集中生成指定索引的快照文件,然后拷贝到新集群的快照仓库来恢复索引数据,恢复完后就可以删除对应的索引快照文件(如果有需要的话也可以备份起来),重复这个步骤直到所有索引数据迁移而完毕。
如果集群中的数据量比较大,比如上百个G,整个迁移过程还是比较耗时的,耐心等待吧。