0.简介
项目中需要进行Elasticsearch(以下简称ES)新旧集群切换,涉及到集群数据迁移。本篇笔记录了利用Elasticsearch snapshot特性进行数据迁移的关键步骤。
1.迁移前检查
在开始进行迁移前,做以下两点检查。
1)检查是否开启path.repo选项
使用ES snapshot特性的前提是开启了path.repo选项,如图1。该选项指定了snapshot存储的位置。
本次数据迁移使用的是fs类型的snapshot,ES还提供许多其他类型的快照方式,具体内容可参考官方文档。Snapshot and restore | Elasticsearch Guide [8.12] | Elastic
图1
2)检查索引
在迁移前先检查集群中存在哪些索引和它们的分配情况,方便迁移完成后进行对比。检查数据是否迁移成功。如图2。
curl -v -XGET 'http://localhost:9200/_cat/indices' -u elasitc
图2
2.创建snapshot仓库
利用ES的snapshot API,在旧集群中创建一个快照仓库。其中,location选项必须是path.repo选项指定的目录。图3是创建快照仓库成功的截图。
type选项指定了快照仓库的类型,本例中使用的是fs类型,即文件类型。
curl -v -XPUT 'http://localhost:9200/_snapshot/test-repo' -H "Content-Type: application/json" -d '
{
"type": "fs",
"settings": {
"location": "/home/dsp/help/snapshot"
}
}' -u elastic
图 3
除此之外,还可以使用以下命令查询仓库的状态。
curl -X GET "http://localhost:9200/_snapshot/my_repository/my_snapshot?pretty" -u elastic
3.创建索引快照
创建好快照仓库后,创建索引的快照,为了方便演示,在这里指我们只为图2中sharedb_*索引创建快照,如图4。
curl -v -XPUT 'http://localhost:9300/_snapshot/test-repo/index-snapshot-2024-02-09?wait_for_completion=true' -H "Content-Type: application/json" -d '
{
"indices": "sharedb_cert_info_time_test"
}' -u elastic | python -m json.tool
图4
这时候我们进入/home/dsp/help/snapshot中可以看到相关的备份数据。如图5。
图5
可以通过以下命令获取索引快照的信息
curl -X GET "http://localhost:9200/_snapshot/my_repository/my_snapshot?pretty" -u elastic
图6
4. 迁移数据
迁移数据这一步非常简单,有两种方式。
第一种方式是,启动一个新的ES集群,将path.repo路径配置为现在的路径;第二种方式是对旧集群指定的快照仓库的目录复制,再随意移动到某个地方。本例中使用第二种方式。
图 7
5.配置并启动新节点并从快照中恢复数据
现在,启动一个新的集群,并且 将path.repo选项配置正确。、
在本例中,我们将新的ES节点监听在9400和9401端口。
图8
从下图中可以看到现在运行了两个ES实例。一个监听在9300端口,一个监听在9400端口。监听在9300端口的是旧实例,监听在9400端口的是新实例。
图9
现在我们使用restore API在9400端口的ES实例上对索引进行恢复。恢复之前我们先看看该实例目前的快照仓库信息。
curl -v -XGET 'http://localost:9400/_snapshot" -u elastic
可以看到,目前新实例上还不存在快照仓库。所以这里需要注意,我们要先创建一个与旧实例上创建的仓库同名的快照仓库。
图10
curl -v -XPUT 'http://localhost:9400/_snapshot/test-repo' -H "Content-Type: application/json" -d '
{
"type": "fs",
"settings": {
"location": "/home/dsp/help/snapshot-new"
}
}' -u elastic
图11
图xx创建了新的快照仓库。其中的location选项是我们刚才复制的地址。再次查看仓库信息。可以提看到新的仓库已经存在。
图12
此时,新实例上我们虽然还没有做任何事情,但我们可以直接查看刚才备份的快照索引的信息。
图13
但如果这个时候查询分片信息的话,我们是看不到该索引的。
图14
现在,我们执行restore操作,从快照仓库中恢复sharedb_cert_info_time_test索引
curl -XPUT "http://localhost:9400/_snapshot/test-repo/index-snapshot-2024-02-09"/_restore
图15
图16
到这里,我们的索引就在新的实例上恢复了。注意到这个索引的状态是UNASSIGNED。导致UNASSINGNED在本例中与snapshot关系不大,是为某个插件的原因,因此这不是本篇笔记的关注点 ,暂时不做解释。
8.停止旧集群
最后,我们停止旧的实例,即完成了迁移。
10.小结
ES迁移数据的方法有很多,这里只做了快照方法迁移。还可以使用elasticsearch-dump工具对索引进行迁移。当然,还有一个更加简单的方式——直接迁移ES data目录即可。赶快去试试吧。
不过需要各位注意的是,ES进行数据迁移时,需要注意版本问题,无论是小版本(例如7.17.x->7.17.x),还是大版本(7.xx.xx -> 8.xx.xx)都有可能出现问题。ES官方网站上可以查询到版本之前的兼容信息。