当您需要将旧版本Elasticsearch集群中的数据迁移到当前版本中,或者在本地集群中将数据从旧的index复制到新的index时,可通过reindex API重建索引来实现。本文介绍具体的实现方法。

前提条件

  • 准备两个阿里云Elasticsearch集群,一个作为本地集群,一个作为远程集群。

    具体操作步骤请参见创建阿里云Elasticsearch实例。本地集群和远程集群需要在同一专有网络和虚拟交换机下。本文使用6.7.0版本的实例作为本地集群,6.3.2版本的实例作为远程集群。

  • 准备测试数据。
    • 本地集群
      在本地集群中准备待迁移的数据。本文使用快速入门章节中的数据进行测试,详情请参见创建索引创建文档并插入数据本地集群测试数据
      注意 如果您使用的是7.0及以上版本的集群,需要将索引类型修改为_doc
    • 远程集群
      在远程集群中创建目标索引。
      PUT dest
      {
        "settings": {
          "number_of_shards": 5,
          "number_of_replicas": 1
        }
      }

背景信息

reindex的应用场景如下:
  • Elasticsearch集群间迁移数据。
  • 索引分片分配不合理,例如数据量太大分片数太少,导致数据导入慢,此时可通过reindex重建索引。
  • 索引中存在大量数据的情况下,需要修改索引mapping,重新导入数据到新的索引会比较耗时。此时可通过reindex复制索引数据。
    说明 在Elasticsearch中,定义了索引mapping且导入数据后,将不能再修改索引mapping。

操作步骤

  1. 登录阿里云Elasticsearch控制台
  2. 在顶部菜单栏处,选择资源组和地域。
  3. 在左侧导航栏,单击Elasticsearch实例,再在实例列表中单击目标实例ID。
  4. 在本地集群中,配置reindex白名单。
    1. 在左侧导航栏,单击ES集群配置
    2. YML文件配置右侧,单击修改配置
    3. YML文件配置页面的其他Configure配置中,配置reindex白名单。
      reindex白名单的配置说明请参见配置reindex白名单
      • 对于单可用区实例,白名单的格式为<阿里云Elasticsearch实例的域名>:9200单可用区配置示例
        reindex.remote.whitelist: ["es-cn-09k1rgid9000g****.elasticsearch.aliyuncs.com:9200"]
      • 对于多可用区实例,白名单需要配置为实例中所有数据节点的IP地址与端口的组合。多可用区远程白名单配置
        reindex.remote.whitelist: ["10.0.xx.xx:9200","10.0.xx.xx:9200","10.0.xx.xx:9200","10.15.xx.xx:9200","10.15.xx.xx:9200","10.15.xx.xx:9200"]
        说明 您可以在实例基本信息页面的节点可视化页签中,获取实例中所有数据节点的IP地址,详情请参见查看节点信息
    4. 勾选该操作会重启实例,请确认后操作,单击确定
  5. 实例重启完成后,配置本地和远程实例网络互通。
    在本地集群中,添加需要进行网络互通的远程集群,具体操作步骤请参见配置实例网络互通配置实例网络互通
  6. 在本地集群中,调用reindex API重建索引。
    参见登录Kibana控制台,执行如下命令,重建索引。
    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://es-cn-09k1rgid9000g****.elasticsearch.aliyuncs.com:9200",
          "username": "elastic",
          "password": "your_password"
        },
        "index": "product_info",
        "query": {
          "match": {
            "productName": "理财"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }
    类别 参数 说明
    source host 远程集群的访问地址,必须包含支持协议、域名和端口信息,例如https://otherhost:9200
    • 对于单可用区实例,host格式为http://<实例的域名>:9200
      说明 实例的域名可在基本信息页面获取,详情请参见查看实例的基本信息
    • 对于多可用区实例,host格式为http://<实例中任意数据节点的IP地址>:9200
    username 可选参数,如果您所请求的远程Elasticsearch服务需要使用Basic Authentication,请在请求中一并提供此参数信息。阿里云Elasticsearch实例的默认用户名为elastic。
    注意
    • 为确保安全性,通过Basic Authentication鉴权时建议使用HTTPS协议,否则密码信息将以文本形式进行传输。
    • 对于阿里云Elasticsearch实例,需要开启HTTPS协议后,才可在host中使用HTTPS协议。
    password 用户对应的密码。阿里云Elasticsearch实例的elastic用户的密码在创建实例时设定,如果忘记可进行重置,重置密码的注意事项及操作方法请参见重置实例访问密码
    index 远程集群中的源索引。
    query 通过查询语法,指定待迁移的数据,详情请参见Reindex API
    dest index 本地集群中的目标索引。
    说明 从远程集群重建索引数据,不支持手动切片或自动切片,详情请参见手动切片自动切片
    执行成功后,返回如下结果。
    {
      "took" : 51,
      "timed_out" : false,
      "total" : 2,
      "updated" : 2,
      "created" : 0,
      "deleted" : 0,
      "batches" : 1,
      "version_conflicts" : 0,
      "noops" : 0,
      "retries" : {
        "bulk" : 0,
        "search" : 0
      },
      "throttled_millis" : 0,
      "requests_per_second" : -1.0,
      "throttled_until_millis" : 0,
      "failures" : [ ]
    }
  7. 查看迁移成功的数据。
    GET dest/_search
    返回结果如下:
    • 单可用区实例查看迁移成功的数据
    • 多可用区实例查看迁移成功的数据

总结

通过reindex API迁移数据时,单可用区的阿里云Elasticsearch实例和多可用区实例的配置方法大致相同,不同之处在于以下两点。
可用区类型 reindex白名单配置 host参数配置
单可用区 阿里云Elasticsearch的域名:9200 https://阿里云Elasticsearch实例的域名:9200
多可用区 实例中所有数据节点的IP地址与端口的组合 https://阿里云Elasticsearch实例中任意数据节点的IP地址:9200

更多信息

在调用reindex API重建索引时,您还可以进行批量设置和超时时间设置:
  • 批量设置

    远程Elasticsearch集群使用堆缓存索引数据,默认最大设定值为100MB。如果远程索引中包含大文档,请将批量数值设置为较小值。

    以下示例中,通过size设置批量数值为10
    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://otherhost:9200"
        },
        "index": "source",
        "size": 10,
        "query": {
          "match": {
            "test": "data"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }
  • 超时时间设置

    您可以使用socket_timeout设置socket读取超时时间,默认为30s;使用connect_timeout设置连接超时时间,默认为1s。

    以下示例中,设置socket读取超时时间为1分钟,连接超时时间为10秒。
    POST _reindex
    {
      "source": {
        "remote": {
          "host": "http://otherhost:9200",
          "socket_timeout": "1m",
          "connect_timeout": "10s"
        },
        "index": "source",
        "query": {
          "match": {
            "test": "data"
          }
        }
      },
      "dest": {
        "index": "dest"
      }
    }