方案:采用 Snapshot 

1.1、适合场景

1) 迁移速度快,适用数据量大的场景;

2) 需占用源集群磁盘空间,或者借助于对象存储,实现友商ES到腾讯云ES,或自建ES到腾讯云ES的数据迁移。

1.2、快照注意事项

  • 1)快照是从正在运行的Elasticsearch集群中获取的备份。
  • 2)您可以创建单个索引或整个群集的快照,支持本地文件存储,以及远程第三方存储库存储(包括:S3,HDFS,Azure,Google Cloud Storage等)。
  • 3)快照是​​增量​​​ 创建的。这意味着,当创建索引快照时,Elasticsearch避免复制任何已存储在存储库中的数据作为同一索引的早期快照的一部分。因此,可以​​非常频繁​​地为集群创建快照。
  • 4)如果您的集群启用了Elasticsearch安全功能,则在备份数据时,必须授权快照API调用。
  • 5)在升级之前备份数据时,请记住,如果快照中包含与升级版本不兼容的版本中创建的索引,则可能导致升级后将无法还原快照。
  • 6)兼容列表如下:在1.x中创建的索引快照可以恢复到2.x。在2.x中创建的索引快照可以恢复到5.x。 在5.x中创建的索引快照可以恢复到6.x。在6.x中创建的索引快照可以恢复到7.x。反例:无法将在1.x中创建的索引快照还原到5.x或6.x,无法将在2.x中创建的索引快照还原到6.x或7.x,以及无法将在5.X创建的索引快照还原到7.x。
  • 7)要保证还原的集群有足够的存储容量。

1.3、腾讯云ES备份到COS使用方式

snapshot api 是 Elasticsearch用于对数据进行备份和恢复的一组 api 接口,可以通过 snapshot api 进行跨集群的数据迁移,原理就是从源 ES 集群创建数据快照,然后在目标 ES 集群中进行恢复。Snapshot备份方式不需要在目标ES集群提前创建索引mapping和setting等信息。

1.4、具体步骤

1) 源 ES 集群中创建 repository

创建快照前必须先创建 repository 仓库,一个 repository 仓库可以包含多份快照文件,repository 主要有以下几种类型:

Ø fs:共享文件系统,将快照文件存放于文件系统中。

Ø url:指定文件系统的 URL 路径,支持协议:http、https、ftp、file、jar。

s3:AWS S3 对象存储,快照存放于 S3 中,以插件形式支持,安装插件 repository-s3(​​https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-s3.html​​)。

hdfs:快照存放于 hdfs 中,以插件形式支持,安装插件 repository-hdfs(​​https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-hdfs.html​​)。

cos:快照存放于腾讯云 COS 对象存储中,以插件形式支持,安装插件 elasticsearch-repository-cos(​​https://github.com/tencentyun/elasticsearch-repository-cos​​)。

从自建 ES 集群迁移至腾讯云 ES 集群,可直接使用 fs 类型仓库,但需要在 ES 配置文件 elasticsearch.yml 中设置仓库路径。


path.repo: ["/usr/local/services/test"]


然后调用 snapshot api 创建 repository,具体如下:


curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup -H 'Content-Type: application/json' -d '
{
"type": "fs",
"settings": {
"location": "/usr/local/services/test"
"compress": true
}
}'


从其它云厂商的 ES 集群迁移至腾讯云 ES 集群,或腾讯云内部的 ES 集群迁移,可使用对应云厂商提供的仓库类型,例如 AWS 的 S3、阿里云的 OSS 和腾讯云的 COS 等。


curl -XPUT http://172.16.0.39:9200/_snapshot/my_s3_repository
{
"type": "s3",
"settings": {
"bucket": "my_bucket_name",
"region": "us-west"
}
}


2) 源 ES 集群中创建 snapshot

调用 snapshot api 在创建好的仓库中创建快照。创建快照可以指定索引,也可以指定快照中包含的内容,具体的 api 接口参数可以查阅官方文档:​​https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-snapshots.html​

Ø 备份所有索引

将 ES 集群内所有索引备份到my_backup仓库下,并命名为snapshot_1,这个命令会立刻返回,并在后台异步执行直到结束。如果希望创建快照命令阻塞执行,可以添加wait_for_completion参数。命令执行的时间与索引大小相关。


curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true


Ø 备份指定索引

可以在创建快照的时候指定要备份的索引。参数 indices 的值为多个索引的时候,需要用,隔开且不能有空格。

注意:在实际生产环境中,建议手动指定索引进行备份,因为源ES集群可能存在默认同名的索引,在执行索引恢复的时候会报错。


curl -XPUT http://172.16.0.39:9200/_snapshot/my_cos_backup/snapshot_2
{
"indices": "index_1,index_2"
}


3) 目标 ES 集群中创建 repository

目标 ES 集群中创建仓库和在源 ES 集群中创建仓库类似,用户可在腾讯云上创建 COS 对象 bucket,把仓库建在 COS 的某个 bucket 下。

4) 移动源 ES 集群 snapshot 至目标 ES 集群的仓库

把源 ES 集群创建好的 snapshot 上传至目标 ES 集群创建好的仓库中。

5) 从快照恢复


curl -XPUT http://172.16.0.20:9200/_snapshot/my_backup/snapshot_1/_restore


执行快照恢复命令会把把这个快照里的备份的所有索引都恢复到ES集群中。如果 snapshot_1 包括五个索引,这五个都会被恢复到我们集群里。

可以用附加的选项用来重命名索引。这个选项允许您通过模式匹配索引名称,然后通过恢复进程提供一个新名称。如果您想在不替换现有数据的前提下,恢复老数据来验证内容,或者做其他处理,这个选项很有用。让我们从快照里恢复单个索引并提供一个替换的名称:


curl -XPOST http://172.16.0.20:9200/_snapshot/my_cos_backup/snapshot_1/_restore
{
"indices": "index_1",
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_1"
}


Ø 只恢复 index_1 索引,忽略快照中存在的其余索引;

Ø 查找所提供的模式能匹配上的正在恢复的索引;

Ø 然后把它们重命名成替代的模式。

6) 查看快照恢复状态

通过执行_recovery命令,可以查看快照恢复的状态,监控快照恢复的进度。

这个 API 可以为您在恢复的指定索引单独调用:


curl -XGET http://172.16.0.20:9200/index_1/_recovery


这个命令会返回指定索引各分片的恢复状况:


{
"sonested": {
"shards": [
{
"id": 1,
"type": "SNAPSHOT",
"stage": "INDEX",
"primary": true,
"start_time_in_millis": 1525766148333,
"total_time_in_millis": 8718,
"source": {
"repository": "my_backup2",
"snapshot": "snapshot",
"version": "5.6.4",
"index": "sonested"
},
"target": {
"id": "TlzmxJHwSqyv4rhyQfRkow",
"host": "10.0.0.6",
"transport_address": "10.0.0.6:9300",
"ip": "10.0.0.6",
"name": "node-1"
},
"index": {
"size": {
"total_in_bytes": 1374967573,
"reused_in_bytes": 0,
"recovered_in_bytes": 160467084,
"percent": "11.7%"
},
"files": {
"total": 132,
"reused": 0,
"recovered": 20,
"percent": "15.2%"
},
"total_time_in_millis": 8716,
"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": 0
},
"verify_index": {
"check_index_time_in_millis": 0,
"total_time_in_millis": 0
}
},
{
"id": 0,
"type": "SNAPSHOT",
"stage": "INDEX",
"primary": true,
"start_time_in_millis": 1525766148296,
"total_time_in_millis": 8748,
"source": {
"repository": "my_backup2",
"snapshot": "snapshot",
"version": "5.6.4",
"index": "sonested"
},
"target": {
"id": "rOupcFi7Rn-kc2PzEoRMMQ",
"host": "10.0.0.15",
"transport_address": "10.0.0.15:9300",
"ip": "10.0.0.15",
"name": "node-3"
},
"index": {
"size": {
"total_in_bytes": 1362775831,
"reused_in_bytes": 0,
"recovered_in_bytes": 155162131,
"percent": "11.4%"
},
"files": {
"total": 125,
"reused": 0,
"recovered": 27,
"percent": "21.6%"
},
"total_time_in_millis": 8736,
"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": 0
},
"verify_index": {
"check_index_time_in_millis": 0,
"total_time_in_millis": 0
}
}
]
}
}


Ø type 字段告诉您这个分片是在从一个快照恢复;

Ø source 描述了作为恢复来源的特定快照和仓库;

Ø percent 字段显示恢复的状态。

输出会列出所有目前正在经历恢复的索引,然后列出这些索引里的所有分片。每个分片里会有启动/停止时间、持续时间、恢复百分比、传输字节数等统计值。

7) 取消快照恢复

如果要停止对索引restored_index_3的快照恢复,可以执行以下命令(这个删除命令会停止恢复,同时删除所有已经恢复到集群里的数据):


DELETE /restored_index_3