通过快照备份与恢复命令,您可以实现手动备份阿里云Elasticsearch商业版实例或自建Elasticsearch数据至OSS仓库,并将数据恢复到阿里云Elasticsearch日志增强版实例的OpenStore冷热分离存储中。本文介绍如何手动将Elasticsearch数据迁移通过OSS快照迁移至阿里云Elasticsearch日志增强版实例的OpenStore冷热分离存储中。
背景信息
Elasticsearch数据备份与恢复依赖于elasticsearch-repository-oss插件,阿里云Elasticsearch实例默认已安装该插件且不可卸载。关于该插件的详细信息,请参见elasticsearch-repository-oss。
前提条件
注意事项
快照仅保存索引数据,不保存Elasticsearch实例自身的监控数据(例如以
.monitoring
和.security_audit
为前缀的索引)、元数据、Translog、实例配置数据、Elasticsearch软件包、自带和自定义的插件、Elasticsearch日志等。本文中的代码均可以在阿里云Elasticsearch实例的Kibana控制台上执行。详细信息,请参见登录Kibana控制台。
备份快照数据
创建仓库
在非日志增强版的Elasticsearch实例中创建一个名称为my_backup的仓库。
PUT _snapshot/my_backup
{
"type": "oss",
"settings": {
"endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
"access_key_id": "[your_access_key_id]",
"secret_access_key": "[your_secret_access_key]",
"bucket": "[your_bucket_name]",
"compress": true,
"chunk_size": "500mb",
"base_path": "snapshot/"
}
}
参数 | 说明 |
endpoint | OSS Bucket的内网访问域名。获取方式,请参见访问域名和数据中心。 |
access_key_id | 用于标识用户。获取方式,请参见获取AccessKey。 |
secret_access_key | 用于验证用户的密钥。获取方式,请参见获取AccessKey。 |
bucket | OSS Bucket的名称,需要一个已经存在的Bucket。获取方式,请参见控制台创建存储空间。 |
compress | 打开快照文件的压缩功能:
|
chunk_size | 当您上传的数据非常大时,配置此参数可以限制快照过程中分块的大小。超过这个大小,数据将会被分块上传到OSS中。 |
base_path | 仓库的起始位置,默认为根目录。可以指定具体快照的存放目录,例如snapshot/myindex/。 |
修改索引segment数
OpenStore场景中要求索引segment数必须为1,否则会降低存储在OpenStore中的索引的查询效率,因此将第三方Elasticsearch数据恢复到OpenStore前,需要先手动将segment设置为1。
查看索引的segment数
GET _cat/segments/test_index?v
修改索引的segment数
POST test_index/_forcemerge?max_num_segments=1
创建快照
在原Elasticsearch集群中为索引创建快照mig,如下示例:
PUT _snapshot/my_backup/mig
{
"indices": "test_index"
}
查看快照信息
查看mig的快照信息:
GET _snapshot/my_backup/mig
预期结果如下:
{
"snapshots" : [
{
"snapshot" : "mig",
"uuid" : "OJktul9VSteF5XsyAV****",
"version_id" : 7100099,
"version" : "7.10.0",
"indices" : [
"test_index"
],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2022-11-18T03:54:55.618Z",
"start_time_in_millis" : 1668743695618,
"end_time" : "2022-11-18T03:54:56.418Z",
"end_time_in_millis" : 1668743696418,
"duration_in_millis" : 800,
"failures" : [ ],
"shards" : {
"total" : 1,
"failed" : 0,
"successful" : 1
}
}
]
}
如果您需要查看更详细的快照信息,可以通过_status接口查询。
GET _snapshot/my_backup/mig/_status
配置索引生命周期恢复数据到OpenStore
在日志增强版实例中创建仓库
创建一个名称为my_restore的仓库。
PUT _snapshot/my_restore
{
"type": "oss",
"settings": {
"endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
"access_key_id": "[your_access_key_id]",
"secret_access_key": "[your_secret_access_key]",
"bucket": "[your_bucket_name]",
"compress": true,
"chunk_size": "500mb",
"base_path": "snapshot/"
}
}
从快照恢复
如果集群中存在与待恢复索引同名的索引,需要提前删除或者关闭该同名索引后再恢复,否则恢复失败。
如果需要跨地域恢复集群快照,需要先将原地域OSS中的快照数据迁移到目标地域的OSS中,再恢复到目标地域的Elasticsearch集群中。OSS间迁移的具体操作,请参见阿里云OSS之间迁移教程。
POST _snapshot/my_restore/mig/_restore
{
"indices": "test_index",
"ignore_index_settings": [
"index.apack.cube.following_index"
]
}
查看快照恢复信息
您可以通过_recovery API来监控快照恢复的状态、进度等信息。
GET test_index/_recovery
预期结果如下:
{
"test_index" : {
"shards" : [
{
"id" : 0,
"type" : "SNAPSHOT",
"stage" : "DONE",
"primary" : true,
"start_time_in_millis" : 1671518459171,
"stop_time_in_millis" : 1671518460293,
"total_time_in_millis" : 1122,
"source" : {
"repository" : "my_restore",
"snapshot" : "mig",
"version" : "7.10.0",
"index" : "test_index",
"restoreUUID" : "r8uTcVsDRkiL4823eB****"
},
"target" : {
"id" : "zENpIY56SUSRSpfhDNiuGw",
"host" : "172.31.**.**",
"transport_address" : "172.31.**.**:9300",
"ip" : "172.31.**.**",
"name" : "es-cn-*****"
},
"index" : {
"size" : {
"total_in_bytes" : 2980666,
"reused_in_bytes" : 0,
"recovered_in_bytes" : 2980666,
"percent" : "100.0%"
},
"files" : {
"total" : 47,
"reused" : 0,
"recovered" : 47,
"percent" : "100.0%"
},
"total_time_in_millis" : 1092,
"source_throttle_time_in_millis" : 0,
"target_throttle_time_in_millis" : 0
},
"translog" : {
"recovered" : 0,
"total" : 0,
"percent" : "100.0%",
"total_on_start" : 0,
"total_time_in_millis" : 18
},
"verify_index" : {
"check_index_time_in_millis" : 0,
"total_time_in_millis" : 0
}
}
]
}
}
部分参数说明如下。
参数 | 说明 |
type | 恢复的类型。SNAPSHOT表示这个分片是在从一个快照恢复。 |
source | 待恢复的快照和仓库。 |
percent | 恢复的进度。94.5%表示对应分片已经恢复了94.5%的数据。 |
查看恢复索引数据
查看恢复索引的数据,确认数据一致。
GET test_index/_search
{
"query": {
"match": {
"_id": "1000"
}
}
}
配置索引的生命周期
配置索引的生命周期,并配置别名。
PUT test_index/_settings
{
"index.lifecycle.name" : "openstore_default_ilm_policy"
}
openstore_default_ilm_policy配置如下。
{
"openstore_default_ilm_policy" : {
"version" : 2,
"modified_date" : "2022-12-15T08:26:08.384Z",
"policy" : {
"phases" : {
"hot" : {
"min_age" : "0s",
"actions" : { }
},
"cold" : {
"min_age" : "1h",
"actions" : {
"openstore" : {
"openstore_repository" : "aliyun_auto_snapshot",
"force_merge_index" : true,
"user_id" : "199******",
"region_id" : "cn-hangzhou",
"instance_id" : "es-cn-*****",
"force_merge_segment_number" : 1
},
"set_priority" : {
"priority" : 50
}
}
}
}
}
}
}
等待生命周期生效后,查看数据是否写入到OpenStore中。
常见问题
Q:搜索存储在OpenStore的索引数据,为什么耗时很长?
A:阿里云Elasticsearch日志增强版在数据写入过程中会自动将索引segment merge为1,调高搜索效率。如果是第三方数据直接存储进OpenStore,在数据存储进OpenStore前,需要业务侧手工将索引segment forcemerge为1,否则查询耗时会增加。