Elasticsearch跨集群数据迁移

网友投稿 1535 2022-05-29

用户在上华为云的时候经常需要将ES数据搬迁到云上的CSS服务,搬迁的源可以是自建的ES集群或者是其他云厂商的ES集群。目前的迁移方式一般是离线迁移,需要业务短暂停服。

迁移方法

迁移方法一般有以下几种

Logstash

snapshot/restore

reindex

其他工具如elasticsearch-dump, esm等

下面介绍Logstash和snapshot/restore的迁移方式。

Logstash

适合数据量不大 的场景。

使用指导

Logstash是ELK工具栈中的L,Logstash是开源的数据处理管道, 能够从多个来源采集数据,转换数据,然后将数据发送到需要的目的端。在用作ES数据迁移时,源端和目的端都是ES集群,源端使用ES的scroll API分页读取全量数据,目的端使用Bulk API批量写入数据。

下载Logstash

可以从华为云镜像站下载Logstash: https://mirrors.huaweicloud.com/logstash/

与ES版本兼容性可以查看这张表: https://www.elastic.co/cn/support/matrix#matrix_compatibility,如源端和目标端的ES版本都是7.6.2,可以选择使用Logstash  6.8.x-7.9.x都是兼容的,尽量选择可兼容的高版本。

选择一台节点作为迁移节点,用来部署Logstash实例,该节点需要与源端和目标端的ES的网络都是通的,可以采用VPN或者专线连接。将下载的Logstash上传到该节点。

配置Logstash,以下配置为一个示例

input{

elasticsearch{

// 源端es地址

hosts=>  ["http://192.168.1.214:9200", "http://192.168.1.215:9200"]

// 需要迁移的索引列表,以逗号分隔,也可以使用通配符,如 index-*

index=> "index1,index2"

// 以下保持默认即可

Elasticsearch跨集群数据迁移

docinfo=>true

// Logstash version >= 6.7 支持,低于该版本删除该配置

slices => 10

size => 5000

}

}

filter {

mutate {

// 去除无关字段

remove_field => ["@timestamp", "@version"]

}

}

output{

elasticsearch{

// 目的端es地址

hosts => ["http://192.168.1.248:9200", "http://192.168.1.249:9200"]

// 目的端索引名称,以下配置为和源端保持一致

index => "%{[@metadata][_index]}"

// 目的端索引type,以下配置为和源端保持一致

document_type => "%{[@metadata][_type]}"

// 目标端数据的_id,如果不需要保留原_id,可以删除以下这行,删除后性能会更好

document_id => "%{[@metadata][_id]}"

}

}

在迁移的时候可以同时使用多台机器多个Logstash实例同时迁移来提高迁移速度。

优缺点

Logstash使用简单,配置清晰,能够很好的支持ES的数据迁移。

缺点在于在迁移过程中,如果出现异常会从头重新开始,异常可能如网络闪断、ES负载高导致scroll API无响应等。

Logstash迁移只会迁移数据,索引的Mapping需要在迁移前在目的端ES集群提前创建。

如果索引数据中有时间戳字段,并且可以通过时间戳过滤出来入库的新数据,则可以使用Logstash指定query来实现增量迁移。

snapshot/restore

适用于数据量大的场景。

使用指导

snapshot/restore是用来备份和恢复ES数据的,可以通过snapshot/restore来进行跨集群的数据迁移,在源端集群做备份,在目标端集群做恢复。

备份恢复的版本兼容性如下表所示:

如上表能看出,在源端为1.x版本做备份,可以恢复到目标端为2.x的集群中,其他类推。

在源端集群中创建repository

创建备份以前需要先创建repository,repository包含以下几种类型:

以下是在上海3创建obs备份恢复的repository的命令:

PUT _snapshot/my_backup

{

"type" : "obs",

"settings" : {

"bucket" : "es-snapshots",

"base_path" : "es-data/",

"chunk_size" : "2g",

"endpoint" : "obs.cn-east-3.myhuaweicloud.com",

"region" : "cn-east-3",

"compress" : "true",

"access_key": "Acess Key",

"secret_key": "Secret Key",

"max_restore_bytes_per_sec": "100mb",

"max_snapshot_bytes_per_sec": "100mb"

}

}

obs:华为云对象存储,需要安装插件,并且打通源端集群与云上OBS的网络

fs:共享文件系统,将备份文件存放在共享文件系统中,也可以使用云上SFS服务挂载到ES本地盘

s3:AWS S3对象存储

hdfs:HDFS文件系统中

在源端集群中创建备份

在源端集群执行命令开始创建备份:

PUT _snapshot/my_backup/snapshot_1

{

"indices": "data-*",

"ignore_unavailable": true,

"include_global_state": false

}

其中indices为需要备份的索引名,支持通配符。

将源端集群中的备份文件复制到目标集群仓库中

在第二步完成以后,将源端集群执行的备份文件复制到目标集群能访问的仓库中,如果是使用的华为云的obs作为备份仓库,则不需要复制,在云上可以直接访问到。

在目标端集群中创建repository

目标端集群中创建repository和在源端集群中创建仓库一样,如使用华为云obs,则与源端创建命令完全一样。

从备份中恢复索引

从备份文件中恢复索引,可以配置需要恢复哪些索引,已经对索引名字进行重命名。

POST /_snapshot/my_backup/snapshot_1/_restore

{

"indices": "data-*",

"ignore_unavailable": true,

"include_global_state": false,

"rename_pattern": "(.+)",

"rename_replacement": "$1"

}

查看备份恢复状态

GET _snapshot/my_backup/snapshot_1/_status

优缺点

备份恢复的方式比较适合数据量较大的场景,采用直接备份和恢复索引文件的方式。但是这种方式需要在源端安装插件并且重启集群,可能会有一定的业务影响,可以考虑采用滚动的方式重启。

备份恢复在多次执行备份的时候是增量的模式,历史备份中已经存在的文件不会重复备份。

备份恢复是完全离线的方式,新增的数据不建议再采用备份恢复来迁移,新增数据一般不会很大,建议使用Logstash方式。

Summary

使用Logstash做集群迁移时,要求运行Logstash的机器可以同时访问两端的集群,网络不通的情况下无法使用Logstash迁移。而snapshot/restore无此限制。

Logstash将数据逐条读取出来,再逐条写入,所以数据量太大不适合使用。

EI企业智能 云搜索服务 CSS AI平台

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为云高校开发者青年班第七期——DevCloud的托马斯商城部署——知识点总结
下一篇:火热的区块链技术了解一下
相关文章