通过创建OSS快照仓库备份ECS自建Elasticsearch(简称ES)数据,然后将快照恢复到阿里云ES,实现自建ES集群数据迁移到阿里云ES。
使用限制
OSS存储空间需同时满足:
存储空间为标准存储类型
与阿里云ES集群位于同一地域
集群版本:支持在同一个ES大版本之间将低版本中的数据迁移至高版本(如将8.15.1的数据迁移到8.17.1),不建议跨大版本之间迁移数据(如将7.7.1中的数据迁移到8.17.1)。
说明阿里云ES完全兼容开源ES,但由于开源ES大版本间存在数据类型变更(如5.x的string类型在6.x中被拆分为text和keyword),直接跨大版本迁移会导致字段类型识别错误。
前置准备
背景信息
自建ES待迁移数据以products_info索引为例:
执行curl -X GET "http://localhost:9200/products_info/_search?pretty"
,返回数据如下表示索引数据就绪:
方案概览
该方案适用于数据量大( 500GB以上)、迁移效率要求高(首次全量备份后,后续仅同步增量数据,缩短迁移耗时)的场景,适合自建ES迁移上云、跨版本升级、生产环境灾备等场景。
数据迁移
1. 安装elasticsearch-repository-oss插件
连接自建ES所在的ECS服务器,下载elasticsearch-repository-oss插件,本文使用8.17版本的插件。
wget https://github.com/aliyun/elasticsearch-repository-oss/releases/download/v8.17.0/elasticsearch-repository-oss-8.17.0.zip
其他版本的elasticsearch-repository-oss插件,请参见如何获取其他版本的elasticsearch-repository-oss插件?
将插件安装至ES集群。
#通过将插件解压到Elasticsearch各节点安装路径的plugins目录下完成安装 sudo unzip -d /usr/local/elasticsearch-8.17.0/plugins/elasticsearch-repository-oss elasticsearch-repository-oss-8.17.0.zip
启动自建ES集群节点。
cd /usr/local/elasticsearch-8.17.0 ./bin/elasticsearch -d
2. 自建ES集群创建快照仓库
在自建ES集群所在服务器执行如下命令创建仓库。
此命令适用于ES 8.x版本,其他ES版本如何创建快照仓库请参见创建仓库。
curl -X PUT "http://localhost:9200/_snapshot/<yourBackupName>" -H 'Content-Type: application/json' -d'
{
"type": "oss",
"settings": {
"oss.client.endpoint": "oss-cn-shanghai.aliyuncs.com",
"oss.client.access_key_id": "xxxx",
"oss.client.secret_access_key": "xxxx",
"oss.client.bucket": "<yourBucketName>",
"oss.client.base_path":"snapshot/",
"oss.client.compress": true
}
}
'
参数 | 说明 |
<yourBackupName> | 仓库名称,自定义。 |
type | 仓库类型,需要设置为oss。 |
oss.client.endpoint | OSS Bucket的访问地址,可参见OSS地域和访问域名获取。 说明 若自建ES的ECS实例与OSS存储空间位于同一地域,请通过私网地址访问OSS;若在不同地域,则使用外网地址。 |
oss.client.access_key_id | 创建OSS Bucket的账号的AccessKey ID,获取方式请参见如何获取AccessKey。 |
oss.client.secret_access_key | 创建OSS Bucket的账号的AccessKey Secret,获取方式请参见如何获取AccessKey。 |
oss.client.bucket | OSS Bucket名称。 |
oss.client.base_path | 快照存储路径。 |
oss.client.compress | 是否压缩:
|
创建成功后,预期返回"acknowledge":true
。
3. 为指定索引创建快照
在自建ES中创建snapshot_1快照,备份products_info索引。
curl -X PUT localhost:9200/_snapshot/<yourBackupName>/snapshot_1?pretty -H "Content-Type: application/json" -d'
{
"indices": "products_info"
}'
<yourBackupName>为您在自建ES创建快照仓库中设置的仓库名称。
快照创建成功后,预期返回"accepted" : true
。
快照创建过程中,您可以通过curl -X GET localhost:9200/_snapshot/<yourBackupName>/snapshot_1/_status
命令查看指定快照的详细信息。当返回结果中的state
为SUCCESS
时,表示已创建完成。
4. 在阿里云ES上创建相同仓库
在阿里云ES中登录Kibana控制台,在左侧导航栏,单击图标,选择 。
在Shell中执行以下命令,创建与自建ES相同的仓库。
PUT _snapshot/<yourBackupName>/
{
"type": "oss",
"settings": {
"endpoint": "oss-cn-shanghai.aliyuncs.com",
"access_key_id": "xxxx",
"secret_access_key": "xxxxxx",
"bucket": "<yourBucketName>",
"compress": true,
"chunk_size": "500mb",
"base_path": "snapshot/"
}
}
<yourBackupName>、<yourBucketName>与<base_path>需要与在自建ES创建快照仓库中使用的仓库和Bucket保持一致。
5. 在阿里云ES中恢复快照
在Kibana控制台执行以下命令,将备份仓库中 snapshot_1
快照恢复到集群,包含所有索引(除监控类和安全审计类索引),且自动跳过不存在的索引。
POST _snapshot/<yourBackupName>/snapshot_1/_restore
{"indices":"*,-.monitoring*,-.security_audit*","ignore_unavailable":"true"}
命令执行成功,预期返回"accepted" : true
。
索引恢复过程中,可以通过GET products_info/_recovery查看products_info索引的恢复状态,当"stage":为"DONE"时,索引恢复完成。
在ES 7.10.x、7.17.x版本中,支持通过将 cluster.restore.ignore_revision.enable
设置为true,来允许从修订版本号更高的快照中恢复数据。修订版本号即版本号中的第三位,例如,7.10.1版本,7为主版本号,10为次版本号,1则为修订版本号。
示例:当前运行的ES 7.10.0版本将cluster.restore.ignore_revision.enable
设置为true后,可实现从7.10.2版本创建的快照中恢复数据。配置代码如下。
PUT _cluster/settings
{
"persistent": {
"cluster.restore.ignore_revision.enable": true
}
}
6. 结果验证
在Kibana控制台上执行以下命令,查看恢复结果。
查看恢复的索引
GET /_cat/indices?v
查看恢复的索引数据
GET /products_info/_search
执行成功后,预期结果如下:
{ "took": 3, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 6, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "products_info", "_id": "1", "_score": 1, "_source": { "productName": "理财产品A", "annual_rate": "3.2200%", "describe": "180天定期理财,最低20000起投,收益稳定,可以自助选择消息推送" } }, { "_index": "products_info", "_id": "2", "_score": 1, "_source": { "productName": "理财产品B", "annual_rate": "3.1100%", "describe": "90天定投产品,最低10000起投,每天收益到账消息推送" } }, { "_index": "products_info", "_id": "3", "_score": 1, "_source": { "productName": "理财产品C", "annual_rate": "3.3500%", "describe": "270天定投产品,最低40000起投,每天收益立即到账消息推送" } }, { "_index": "products_info", "_id": "4", "_score": 1, "_source": { "productName": "理财产品D", "annual_rate": "3.1200%", "describe": "90天定投产品,最低12000起投,每天收益到账消息推送" } }, { "_index": "products_info", "_id": "5", "_score": 1, "_source": { "productName": "理财产品E", "annual_rate": "3.0100%", "describe": "30天定投产品推荐,最低8000起投,每天收益会消息推送" } }, { "_index": "products_info", "_id": "6", "_score": 1, "_source": { "productName": "理财产品F", "annual_rate": "2.7500%", "describe": "热门短期产品,3天短期,无须任何手续费用,最低500起投,通过短信提示获取收益消息" } } ] } }
常见问题
如何获取其他版本的elasticsearch-repository-oss插件?
可在Github上下载。如果Github上没有对应版本的插件包,建议您下载对应大版本的相近小版本的插件包,然后修改plugin-descriptor.properties文件中的参数值,重新打包再安装。
version=所需插件的版本
elasticsearch.version=自建ES的版本
说明插件版本与自建ES版本要保证一致。
java.version=1.8
说明由于开源ES集群的版本较多,各版本编译存在差异,因此在使用elasticsearch-repository-oss插件时,需要您结合对应Elasticsearch的版本进行编译调试。例如自建Elasticsearch 7.6.2集群,要求JDK版本大于1.8及以上,编译调试后对应的插件为elasticsearch-repository-oss-7.6.2。