Elasticsearch跨集群数据迁移
用户在上华为云的时候经常需要将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.cn/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"
// 以下保持默认即可
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来进行跨集群的数据迁移,在源端集群做备份,在目标端集群做恢复。
备份恢复的版本兼容性如下表所示:
源端 | 2.x | 5.x | 6.x | 7.x |
---|---|---|---|---|
1.x → | √ | × | × | × |
2.x → | √ | √ | × | × |
5.x → | × | √ | √ | × |
6.x → | × | × | √ | √ |
7.x → | × | × | × | √ |
如上表能看出,在源端为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将数据逐条读取出来,再逐条写入,所以数据量太大不适合使用。
- 点赞
- 收藏
- 关注作者
评论(0)