当您需要将远程Elasticsearch集群中的数据迁移到本地Elasticsearch集群中时,可以通过reindex API重建索引来实现。本文介绍具体的实现方法。
背景信息
reindex的应用场景如下:
- Elasticsearch集群间迁移数据。
- 索引分片分配不合理,例如数据量太大分片数太少,可通过reindex重建索引。
- 索引中存在大量数据的情况下,需要修改索引mapping,可通过reindex复制索引数据。
说明 在Elasticsearch中,定义了索引mapping且导入数据后,将不能再修改索引mapping。
前提条件
- 准备两个阿里云Elasticsearch集群,一个为本地集群,一个为远程集群。
具体操作,请参见创建阿里云Elasticsearch实例。本地集群和远程集群需要在同一专有网络和虚拟交换机下。本文使用6.7.0版本的实例作为本地集群,6.3.2版本的实例作为远程集群。
- 准备测试数据。
- 本地集群
在本地集群中创建目标索引。
PUT dest { "settings": { "number_of_shards": 5, "number_of_replicas": 1 } }
- 远程集群
- 本地集群
使用限制
自2020年10月起,由于网络架构的调整,导致部分通过reindex方式跨集群迁移数据的场景受到了限制。您可以参见下表,查看您的业务场景是否支持reindex功能,并参考解决方案进行处理。
使用场景 | 网络状态(2020年10月之前属于旧网络架构,2020年10月及之后属于新网络架构) | 是否支持reindex功能 | 解决方案 |
---|---|---|---|
通过reindex方式迁移阿里云Elasticsearch集群间的数据 | 两个Elasticsearch集群均创建于旧网络架构下。 | 是 | 请参见通过reindex迁移数据。 |
两个Elasticsearch集群均创建于新网络架构下。 | 否 | 不支持reindex方式,建议使用OSS或Logstash方式。具体操作请参见通过OSS将自建Elasticsearch数据迁移至阿里云和通过阿里云Logstash将自建Elasticsearch数据迁移至阿里云。 | |
两个Elasticsearch集群分别创建于旧网络架构下和新网络架构下。 | 否 | ||
将ECS上自建的Elasticsearch集群中的数据迁移至阿里云Elasticsearch集群中 | 阿里云Elasticsearch集群创建于旧网络架构下。 | 是 | 请参见通过reindex将自建Elasticsearch数据迁移至阿里云。 |
阿里云Elasticsearch集群创建于新网络架构下。 | 是 | 借助PrivateLink,打通ECS上自建Elasticsearch集群所处的网络与阿里云服务账号的网络,再使用终端节点域名进行reindex。详情请参见通过实例私网打通将自建Elasticsearch数据迁移至阿里云。
说明 PrivateLink仅支持部分地域私网连接,详情请参见支持私网连接的地域和可用区。如果您的集群可用区不满足此条件,则不支持reindex功能。
|
操作步骤
总结
通过reindex API迁移数据时,单可用区的阿里云Elasticsearch实例和多可用区实例的配置方法大致相同,不同之处在于以下两点。
可用区类型 | reindex白名单配置 | host参数配置 |
---|---|---|
单可用区 | 阿里云Elasticsearch的域名:9200 | https://阿里云Elasticsearch实例的域名:9200 |
多可用区 | 实例中所有数据节点的IP地址与端口的组合 | https://阿里云Elasticsearch实例中任意数据节点的IP地址:9200 |
更多信息
在调用reindex API重建索引时,您还可以进行批量设置和超时时间设置:
- 批量设置
远程Elasticsearch集群使用堆缓存索引数据,默认最大值为100 MB。如果远程索引中包含大文档,请将批量数值设置为较小值。
以下示例中,通过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" } }