ElasticSearch 的3种数据迁移方案
在实际工作中,我们经常会遇到需要将自建的 Elasticsearch 迁移上云,或者迁移到其他 ES 集群的情况。这时,选择合适的数据迁移方案就显得尤为重要啦。今天就来给大家介绍三种常用的迁移方案,分别是 COS 快照、logstash 和 elasticsearch - dump,小伙伴们可以根据自己的业务需求挑选哦~
如果业务可以停服或者暂停写操作,那这几种方式都可以考虑:
- COS 快照(Cloud Object Storage)
- logstash
- elasticsearch - dump
一、COS 快照数据备份
基于 COS 快照的迁移方式是借助 ES 的 snapshot api 接口来实现的。简单来说,就是先从源 ES 集群创建索引快照,然后在目标 ES 集群中进行恢复。不过,用这种方式迁移时,有个特别需要注意的点就是 ES 的版本问题:目标 ES 集群的主版本号(比如 5.6.4 中的 5 就是主版本号)要大于等于源 ES 集群的主版本号。而且 1.x 版本的集群创建的快照不能在 5.x 版本中恢复哦⚠️。
创建 repository 仓库
创建快照之前,必须先创建 repository 仓库,一个仓库可以包含多份快照文件。repository 主要有以下几种类型:
- fs:共享文件系统,快照文件就存放在文件系统里。
- url:指定文件系统的 URL 路径,支持 http、https、ftp、file、jar 这些协议。
- s3:AWS S3 对象存储,快照存放在 S3 中,需要以插件形式支持,安装插件可以参考相关文档。
- hdfs:快照存放在 hdfs 中,也是以插件形式支持,安装插件可参考对应文档。
- cos:快照存放在腾讯云 COS 对象存储中,同样以插件形式支持,安装插件后要重启集群才能用哦,安装方法可以参考相关文档。
如果是从自建 ES 集群迁移到腾讯云的 ES 集群,直接用 COS 类型仓库就很方便。但得先在自建 ES 集群上安装 cos - repository 插件,之后把自建 ES 集群的数据备份到 COS,再在腾讯云的 ES 集群中恢复就行啦。
要是自建 ES 集群不方便安装 cos - repository 插件,但已经安装了 repository - s3 或者 repository - hdfs 插件,那可以先把数据备份到 S3 或者 HDFS 中,再把备份好的文件上传到腾讯云 COS,最后在腾讯云的集群中恢复。
创建 COS 仓库可以用下面这个命令:
PUT _snapshot/my_cos_backup{"type": "cos","settings": {"app_id": "xxxxxxx","access_key_id": "xxxxxx","access_key_secret": "xxxxxxx","bucket": "xxxxxx","region": "ap-guangzhou","compress": true,"chunk_size": "500mb","base_path": "/"}}
这里面的参数意思分别是:
- app_id:腾讯云账号 APPID。
- access_key_id:腾讯云 API 密钥 SecretId。
- access_key_secret:腾讯云 API 密钥 SecretKey。
- bucket:COS Bucket 名字,是不带 appId 后缀的哦。
- region:COS Bucket 地域,一定要和 ES 集群在同一个地域。
- base_path:备份目录。
在源 ES 集群中创建 snapshot
调用 snapshot api 就能创建快照来备份索引数据,创建的时候可以指定备份部分索引,也可以备份所有索引,具体的参数可以去看官方文档。
备份所有索引:把源 ES 集群中的所有索引备份到 my_cos_backup 仓库下,命名为 snapshot_1,用这个命令:
PUT _snapshot/my_cos_backup/snapshot_1
这个命令会立刻返回,然后在后台异步执行。要是想让命令阻塞执行,加上 wait_for_completion 参数就行:
PUT _snapshot/my_cos_backup/snapshot_1?wait_for_completion=true
命令执行时间和索引大小有关哦。
备份指定索引:创建快照时可以指定要备份的索引,像这样:
PUT _snapshot/my_cos_backup/snapshot_2{"indices": "index_1,index_2"}
这里要注意,indices 的值有多个索引时,要用逗号隔开,而且不能有空格。
查看快照状态
想知道快照有没有备份完成,用下面这个命令,返回结果中 state 字段是 SUCCESS 就说明备份成功啦:
GET _snapshot/my_cos_backup/snapshot_1
在目标 ES 集群中创建 repository
在目标 ES 集群中创建仓库的方法和在源 ES 集群中是一样的哦。
从快照恢复
把快照中备份的所有索引恢复到 ES 集群,用这个命令:
POST _snapshot/my_cos_backup/snapshot_1/_restore
如果 snapshot_1 里有 5 个索引,那这 5 个都会被恢复。还可以用附加选项对索引重命名,比如想恢复单个索引并换个名字:
POST /_snapshot/my_cos_backup/snapshot_1/_restore{"indices": "index_1","rename_pattern": "index_(.+)","rename_replacement": "restored_index_$1"}
这里的 indices 是说只恢复 index_1 索引,rename_pattern 是查找能匹配上的正在恢复的索引,rename_replacement 是把匹配的索引重命名成新的模式。
查看索引恢复状态
可以调用 _recovery API 查看指定索引的恢复进度:
GET index_1/_recovery
也可以用这个 API 查看指定索引的状态,status 是 green 就说明完全恢复啦:
GET _cluster/health/index_1
二、logstash工具
logstash 可以从一个 ES 集群读取数据再写入到另一个 ES 集群,所以也能用来做数据迁移。不过用它迁移前,有几点要注意:
- 要在和腾讯云 ES 集群相同的 VPC 下创建 CVM,部署 logstash,而且这个 CVM 得能访问到源 ES 集群。
- 部署 logstash 的 CVM 配置最好高一点,比如 16 核 CPU、32GB 内存。
- logstash 应该和目标 ES 集群的主版本号相同,比如目标是 6.8.2 版本,logstash 也得用 6.8 版本。
- 要特别注意索引 type 的问题,不同版本的 ES 对索引 type 的约束不一样,跨大版本迁移可能会因为这个导致写入失败,具体可以参考相关插件的说明。
给大家一个常用的 logstash 跨集群数据迁移的配置文件示例:
input {elasticsearch {hosts => "1.1.1.1:9200"index => "*"docinfo => truesize => 5000scroll => "5m"}}output {elasticsearch {hosts => ["http://2.2.2.2:9200"]user => "elastic"password => "your_password"index => "%{[@metadata][_index]}"document_type => "%{[@metadata][_type]}"document_id => "%{[@metadata][_id]}"}}
这个配置文件是把源 ES 集群的所有索引同步到目标集群,也可以设置只同步指定索引,更多功能可以去查阅相关文档。
三、elasticsearch - dump工具
elasticsearch - dump 是一款开源的 ES 数据迁移工具,github 上有它的地址
安装 elasticsearch - dump
它是用 node.js 开发的,可以用 npm 包管理工具直接安装:
npm install elasticdump -g
主要参数说明
- --input:源地址,可以是 ES 集群 URL、文件或 stdin,还能指定索引,格式是 {protocol}://{host}:{port}/{index}
- --input - index:源 ES 集群中的索引
- --output:目标地址,可以是 ES 集群 URL、文件或 stdout,也能指定索引,格式和 input 类似
- --output - index:目标 ES 集群的索引
- --type:迁移类型,默认是 data,只迁移数据,还可以选 settings、analyzer、mapping、alias
如果集群有安全认证,在对应的 http 后面加上 user:password@ 就行,比如:
elasticsearch - dump --input=http://192.168.1.2:9200/my_index --output=http://user:password@192.168.1.2:9200/my_index --type=data
迁移单个索引
下面这个操作是把集群 172.16.0.39 中的 companydatabase 索引迁移到集群 172.16.0.20。首先要迁移索引的 settings,不然直接迁移 mapping 或者 data 会丢失原有配置,当然也可以在目标集群先创建好索引再同步:
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settingselasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mappingelasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data
迁移所有索引
这个操作是把集群 172.16.0.39 中的所有索引迁移到集群 172.16.0.20,但不能迁移索引配置,得单独对每个索引迁移配置,或者在目标集群先创建好索引:
elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200
四、总结
- elasticsearch - dump 和 logstash 做跨集群数据迁移时,要求执行迁移任务的机器能同时访问两个集群,所以更适合源和目标 ES 集群在同一网络的情况。而 snapshot 方式是完全离线的,没有这个限制,适合跨云厂商迁移,比如从阿里云 ES 集群迁移到腾讯云 ES 集群,当然也可以打通网络实现互通,但成本较高。
- elasticsearch - dump 类似 MySQL 的 mysqldump,是逻辑备份,需要一条条导出再导入,适合数据量小的场景;
- snapshot 方式则适合数据量大的场景;