Elasticsearch跨集群数据迁移

举报
超级马里奥 发表于 2020/09/03 15:25:03 2020/09/03
【摘要】 Elasticsearch跨集群数据迁移用户在上华为云的时候经常需要将ES数据搬迁到云上的CSS服务,搬迁的源可以是自建的ES集群或者是其他云厂商的ES集群。目前的迁移方式一般是离线迁移,需要业务短暂停服。迁移方法迁移方法一般有以下几种Logstashsnapshot/restorereindex其他工具如elasticsearch-dump, esm等下面介绍Logstash和snapsh...

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

迁移方法

迁移方法一般有以下几种

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

Logstash

适合数据量不大 的场景。

使用指导

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

  1. 下载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都是兼容的,尽量选择可兼容的高版本。

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

  3. 配置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]}"
       }
    }


  4. 在迁移的时候可以同时使用多台机器多个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的集群中,其他类推。

  1. 在源端集群中创建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文件系统中

  2. 在源端集群中创建备份

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

    PUT _snapshot/my_backup/snapshot_1
    {
     "indices": "data-*",
     "ignore_unavailable": true,
     "include_global_state": false
    }

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

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

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

  4. 在目标端集群中创建repository

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

  5. 从备份中恢复索引

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

    POST /_snapshot/my_backup/snapshot_1/_restore
    {
     "indices": "data-*",
     "ignore_unavailable": true,
     "include_global_state": false,
     "rename_pattern": "(.+)",
     "rename_replacement": "$1"
    }
  6. 查看备份恢复状态

    GET _snapshot/my_backup/snapshot_1/_status

优缺点

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

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

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

Summary

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

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



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。