本文介绍基于reindex将阿里云Elasticsearch 5.x实例中的多type数据,迁移到高版本Elasticsearch 6.x实例的单type索引中。

注意事项

自2020年10月起,由于网络架构的调整,导致部分跨集群通过reindex方式迁移数据的场景受到了限制。在不同的使用场景下需要注意以下功能限制以及解决方案。详情请参见下表:
使用场景 网络状态(2020年10月之前属于老网络架构,2020年10月及之后属于新网络架构) 是否支持reindex功能 解决方案
通过reindex方式迁移阿里云Elasticsearch集群间的数据 两个Elasticsearch集群均创建于老网络架构下 请参见通过reindex迁移数据
两个Elasticsearch集群均创建于新网络架构下
两个Elasticsearch集群分别创建于老网络架构下和新网络架构下
将ECS上自建的Elasticsearch集群中的数据迁移至阿里云Elasticsearch集群中 阿里云Elasticsearch集群创建于老网络架构下 请参见通过reindex将自建Elasticsearch数据迁移至阿里云
阿里云Elasticsearch集群创建于新网络架构下 借助PrivateLink对ECS上自建的Elasticsearch集群所处的网络与阿里云服务账号的网络进行打通,再使用终端节点域名进行reindex。详情请参见通过实例私网打通将自建Elasticsearch数据迁移至阿里云
说明 PrivateLink仅支持部分地域私网连接,详情请参见支持私网连接的地域和可用区。如果您的集群可用区不满足此条件,暂不支持reindex功能。
说明
  • 新网络架构下(即阿里云Elasticsearch部署在阿里云服务VPC下),不支持阿里云Elasticsearch访问其他网络环境下的资源;老网络架构下(即阿里云Elasticsearch部署在用户VPC下)不受影响。
  • 阿里云Elasticsearch在华北3(张家口)、海外地域的网络架构调整时间在2020年10月之前,如果需要使用跨集群操作,请提交工单联系技术支持人员校验网络架构是否可以使用。
  • 其他区域,暂以2020年10月为临界点评估集群所处的网络架构,即2020年10月以前创建的实例所处环境为老网络架构,2020年10月之后创建为新网络架构。
  • 为保证数据迁移前后一致,建议业务上游停止自建Elasticsearch集群数据写入更新操作,读操作才可以正常进行。迁移完毕后,直接切换到阿里云Elasticsearch集群进行读写操作。如果不停止写操作,建议通过脚本设置循环任务减少停写服务时间,具体请参见迁移数据中的“数据量大、无删除操作、有更新时间”。
  • 当使用域名访问自建Elasticsearch或阿里云Elasticsearch集群时,不允许通过http://host:port/path这种带path的形式访问。

操作流程

  1. 准备工作
    准备阿里云Elasticsearch和Logstash实例,确保两者在同一专有网络下。
    • 阿里云Elasticsearch实例:存储索引数据。
    • 阿里云Logstash实例:通过管道配置功能,迁移处理后的数据。
  2. 步骤一:转换索引类型
    通过reindex,将阿里云Elasticsearch 5.x实例中的多type索引转换为单type索引。您可以通过以下两种方式来实现:
    • 合并type方式:将Elasticsearch 5.x实例中的单索引多type数据,通过reindex script方式合并成一个单索引单type数据。
    • 拆分type方式:将Elasticsearch 5.x实例中的单索引多type数据,按照不同的type,通过reindex拆分成多个单索引单type数据的方式。
  3. 步骤二:通过Logstash迁移数据
    使用阿里云Logstash,将处理后的索引数据迁移至高版本Elasticsearch 6.x实例中。
  4. 步骤三:查看数据迁移结果
    在Kibana中查看迁移成功的索引。

准备工作

  1. 准备低版本(5.5.3)和高版本(6.7.0)的阿里云Elasticsearch实例,并准备待迁移的多type数据。
    创建实例的具体操作,请参见创建阿里云Elasticsearch实例
  2. 创建阿里云Logstash实例,要求与阿里云Elasticsearch实例处于同一专有网络下。
    具体操作,请参见步骤一:创建阿里云Logstash实例

步骤一:转换索引类型

以下步骤介绍通过合并type方式,将单索引多type数据合并成一个单索引单type数据。

  1. 开启Elasticsearch实例的自动创建索引功能。
    1. 登录阿里云Elasticsearch控制台
    2. 在左侧导航栏,单击Elasticsearch实例
    3. 在顶部菜单栏处,选择资源组和地域。
    4. 实例列表中,单击低版本的实例ID。
    5. 在左侧导航栏,单击ES集群配置
    6. 单击YML文件配置右侧的修改配置
    7. YML文件配置页面,设置自动创建索引允许自动创建索引允许自动创建索引
      警告 修改自动创建索引方式会触发实例重启,请确认后再操作。
    8. 勾选该操作会重启实例,请确认后操作,单击确定
  2. 登录低版本Elasticsearch实例的Kibana控制台。
    具体操作,请参见登录Kibana控制台
  3. 在左侧导航栏,单击Dev Tools(开发工具)。
  4. Console中,执行以下命令,将单索引多type数据合并成单索引单type数据。
    POST _reindex
    {
      "source": {
        "index": "twitter"
      },
      "dest": {
        "index": "new1"
      },
      "script": {
        "inline": """
        ctx._id = ctx._type + "-" + ctx._id;
        ctx._source.type = ctx._type;
        ctx._type = "doc";
        """,
        "lang": "painless"
      }
    }

    以上示例通过自定义type的方式,指定ctx._source.typenew1索引中添加type字段,将其设置为原始_type的值。并且new1索引的_id_type-_id组成,防止存在不同类型的文档具有相同的ID而发生冲突的情况。

  5. 执行GET new1/_mapping命令,查看合并后的Mapping结构。
  6. 执行以下命令,查看合并后的索引数据。
    GET new1/_search
    {
       "query":{
         "match_all":{
          }
      }
    }

以下步骤介绍通过拆分type方式,将单索引多type数据,按照不同的type,通过reindex拆分成多个单索引单type数据。

  1. Console中,执行以下命令,将单索引多type拆分单索引单type。
    POST _reindex
    {
      "source": {
        "index": "twitter",
        "type": "tweet",
        "size": 10000
      },
      "dest": {
        "index": "twitter_tweet"
      }
    }
    POST _reindex
    {
      "source": {
        "index": "twitter",
        "type": "user",
        "size": 10000
      },
      "dest": {
        "index": "twitter_user"
      }
    }

    以上示例将twitter索引按照不同type,分别拆分成twitter_tweettwitter_user索引。

  2. 执行以下命令,查看拆分后的索引数据。
    GET twitter_tweet/_search
    {
       "query":{
         "match_all":{
    
          }
      }
    }
    GET twitter_user/_search
    {
       "query":{
         "match_all":{
    
          }
      }
    }

步骤二:通过Logstash迁移数据

  1. 登录阿里云Elasticsearch控制台
  2. 在顶部菜单栏处,选择地域。
  3. 在左侧导航栏,单击管道管理
  4. 管道管理页面,使用配置文件管理方式配置管道。
    管道配置的具体操作,请参见通过配置文件管理管道,Config配置示例如下。
    input {
        elasticsearch {
        hosts => ["http://es-cn-0pp1f1y5g000h****.elasticsearch.aliyuncs.com:9200"]
        user => "elastic"
        index => "*"
        password => "your_password"
        docinfo => true
      }
    }
    filter {
    }
    output {
      elasticsearch {
        hosts => ["http://es-cn-mp91cbxsm000c****.elasticsearch.aliyuncs.com:9200"]
        user => "elastic"
        password => "your_password"
        index => "test"
      }
    }
  5. 保存并部署管道配置,开始迁移数据。
    具体操作,请参见通过配置文件管理管道

步骤三:查看数据迁移结果

  1. 登录高版本Elasticsearch实例的Kibana控制台。
    具体操作,请参见登录Kibana控制台
  2. 在左侧导航栏,单击Dev Tools
  3. Console中,执行以下命令,查看迁移成功的索引。
    GET _cat/indices?v