# 通过Reindex API实现Elasticsearch集群间数据迁移
使用Reindex API可以实现Elasticsearch集群间的数据迁移。
#### 应用场景
Elasticsearch作为一款开源搜索引擎，提供了Reindex API以支持集群间的索引数据迁移。CSS服务同样支持利用Reindex API实现Elasticsearch集群间的数据迁移。以下是该方案适用的专业迁移场景概述：
- 集群合并：Reindex API能够将分散在多个Elasticsearch集群中的索引数据合并至单一集群，实现数据的集中管理和分析。
- 服务迁移上云：企业可以将自建的Elasticsearch服务迁移至云平台，以利用云服务的弹性扩展、简化维护和成本效益。
- 变更服务提供商：对于当前使用第三方Elasticsearch服务的企业，若出于成本、性能或其他战略考量，希望更换至华为云等其他服务提供商，Reindex API提供了一种迁移途径。
 
Reindex API支持以下迁移策略：
- 全量迁移：实现跨集群的完整索引数据迁移。在此过程中，必须暂停对源集群的写入操作，以确保源集群与目标集群数据的一致性。
- 增量迁移：当集群索引包含时间字段时，Reindex API支持基于时间戳的增量数据迁移。在业务切换阶段，全量迁移完成后，需暂停源集群的写入操作，并利用Reindex API基于最近更新时间快速同步增量数据，随后将业务全面切换至目标集群。
- 索引重构：当需要调整索引结构，如Mapping、分词器或分片设置时，Reindex API可用于在迁移过程中重新配置索引结构。
 
#### 方案架构
图1迁移流程   
![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000002070438714.png "点击放大")
通过Reindex API实现Elasticsearch集群间数据迁移的迁移流程如[图1]所示。
1. 在目标集群配置Reindex白名单，连接源集群和目标集群。
2. 通过Reindex API，将源集群的索引数据迁移至目标集群。
 
#### 方案优势
- 操作简单：Reindex API作为Elasticsearch的内置功能，提供了一个简单直接的方法来迁移数据，无需复杂的配置或额外的工具。
- 数据处理灵活：在迁移过程中，可以对数据处理，例如调整Mapping、分词、Shard等。
- 性能控制：在迁移过程中，可以通过配置Scroll API的参数来控制迁移速率，优化迁移性能。
 
#### 性能影响
Reindex API的工作原理基于Scroll API，此API能够高效地从源集群查找索引数据，并批量同步至目标集群。这一过程可能会对源集群性能产生影响，具体影响程度取决于目标集群对源集群的读取速度，而读取速度取决于Scroll API的size和slice参数配置。参数配置的详细指导可参考[Reindex API](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docs-reindex.html)文档。
由于Reindex任务在Elasticsearch集群中作为异步任务执行，在低并发情况下对源集群性能的影响是可管理的。然而，对于资源占用较高的集群，建议通过调整Scroll API的size参数来减缓迁移速度，或选择在业务低峰期迁移，以降低对业务的影响。
#### 约束限制
- 全量迁移执行期间及增量同步的切换窗口期，源集群的索引数据不能增删改，否则会导致源集群数据和目标集群数据不一致。
- 源集群和目标集群的版本必须保持一致。
 
#### 前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 集群间需要保证网络连通。
  - 如果源集群和目标集群在同一VPC，则网络已连通。
  
  - 如果源集群和目标集群在不同VPC，则需要先打通VPC网络。具体操作请参见[配置Elasticsearch集群路由](https://support.huaweicloud.com/usermanual-css/css_01_0279.html)。
  
  - 如果是自建Elasticsearch集群迁移至华为云，则可以通过给自建Elasticsearch集群配置公网访问打通网络。
  
  - 如果是第三方Elasticsearch集群迁移至华为云，则需要建立企业内部数据中心到华为云的VPN通道或专线。
   
- 确认集群的索引已开启"_source"。 集群索引的"_source"默认是开启的。执行命令GET {index}/_search，当返回的搜索结果中包含"_source"字段时表示已开启。
  
 
 #### 获取Elasticsearch源集群信息
在迁移集群前，需要先获取必备的源集群信息，用于配置迁移任务。
表1需要获取的Elasticsearch源集群信息 
| 源集群来源               | 要获取的信息                                                                                                                                                                                                                                                                                                                                            | 获取方式                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| 华为云Elasticsearch集群 | - 源集群的访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）  - 索引结构       | - 获取集群名称和访问地址请参见[3]。  - 用户名和密码请联系服务管理员获取。  - 查询索引结构请参见[6]。   |
| 自建Elasticsearch集群 | - 源集群的公网访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）  - 索引结构   | 联系服务管理员获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 第三方Elasticsearch集群 | - 源集群的访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）  - 索引结构         | 联系服务管理员获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
源集群的来源不同，获取信息的方式不同，此处仅介绍如何获取华为云Elasticsearch集群的信息。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
3. 在Elasticsearch集群列表，获取目标集群的名称和访问地址。
   图2获取集群信息   
   ![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000002070431750.png "点击放大") 
4. 单击集群操作列的"Kibana"，登录Kibana。
5. 在左侧导航栏选择"Dev Tools"进入操作页面。
6. 执行如下命令，查询源集群的索引结构。
   ```
   GET {index_name}
   ```
   index_name表示待迁移的索引名称。
   
 
#### 配置Reindex白名单
在Elasticsearch目标集群，配置Reindex白名单。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
3. 在集群列表，单击目标集群名称，进入集群详情页。
4. 选择"集群配置 \> 参数配置 \> Elasticsearch配置"。
5. 单击"编辑"，为"reindex.remote.whitelist"参数配置参数值。参数值填写源集群的访问地址，获取方式请参见[获取Elasticsearch源集群信息]。
6. （可选）如果源Elasticsearch集群是HTTPS访问方式，则还需要添加自定义参数忽略SSL认证。 单击"新增参数"，输入以下参数名称和参数值：
   - 参数名称：reindex.ssl.verification_mode
   
   - 参数值：none
    
7. 配置完成后，单击"保存"，在弹窗中确认参数无误后勾选"参数修改后需要手动重启才能生效"，单击"确定"。 当下方的参数修改配置任务列表显示"作业状态"为"成功"时，表示修改保存成功。
   
8. 在页面右上角单击"重启"，选择所有节点重启集群，使修改的配置生效。
 
#### 通过Reindex API迁移数据
1. 登录目标集群的Kibana进入命令执行页面。
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
   
   3. 在集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
   
   4. 在Kibana左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
      
    
2. 通过PUT {index_name}命令，在目标集群创建和源集群一样的索引结构，以确保数据迁移的一致性。
   index_name表示迁移后的索引名称，源集群的索引结构请参见[获取Elasticsearch源集群信息]获取。
   
3. 执行如下命令，通过Reindex API将源集群的数据迁移到目标集群。
   - **全量迁移** ：源集群的索引数据全量迁移到目标集群。
     ```
     POST _reindex?wait_for_completion=false
     {
       "source": {
          "remote": {
           "host": "http://xx.xx.xx.xx:9200",    //源集群的访问地址，当源集群是HTTPS访问方式，则使用“https://xx.xx.xx.xx:9200”
           "username": "xxx",    //访问源集群的用户名，仅安全集群涉及
           "password": "******"    //访问源集群的用户密码，仅安全集群涉及
         },
         "index": "{index_name}",    //源集群的索引名称
         "size": 3000
       },
       "dest": {
         "index": "{index_name}"    //目标集群的索引名称
       }
     }
     ```
     
   
   - **增量迁移** ：通过时间字段，将源集群的索引数据增量迁移到目标集群。该方案也可以用于进行大数据量索引的分段迁移。
     ```
     POST _reindex?wait_for_completion=false
     {
       "source": {
         "remote": {
           "host": "http://xx.xx.xx.xx:9200",    //源集群的访问地址，当源集群是HTTPS访问方式，则使用“https://xx.xx.xx.xx:9200”
           "username": "xxx",    //访问源集群的用户名，仅安全集群涉及
           "password": "******"    //访问源集群的用户密码，仅安全集群涉及
         },
         "query": {
           "range" : {
             "timestamps" : {    //增量时间字段
               "gte" : "xxx",    //增量迁移的开始时间
               "lte" : "xxx"    //增量迁移的结束时间
             }
           }
         },
         "index": "{index_name}",    //源集群的索引名称
         "size": 3000
       },
       "dest": {
         "index": "{index_name}"    //目标集群的索引名称
       }
     }
     ```
     
   
   - **同集群索引重构：** Reindex API在迁移过程中可以重新配置索引结构，以优化索引性能。
     ```
     POST _reindex?wait_for_completion=false
     {
       "source": {
         "index": "{index_name}",    //源集群的索引名称
         "size": 3000
       },
       "dest": {
         "index": "{index_name}"    //目标集群的索引名称
       }
     }
     ```
     
   
   
   执行Reindex API会返回任务ID。如下所示：
   ```
   {
     "task": "9r-YnZitRFWqmMXByptCCQ:3643"
   }
   ```
   
4. 查看Reindex任务执行进度。
   - 执行如下命令，查看指定Reindex任务的执行进度。
     ```
     GET /_tasks/{task_id}
     ```
     
   
   - 执行如下命令，查看所有正在运行的Reindex任务的执行进度。
     ```
     GET _tasks?detailed=true&actions=*reindex
     ```
     
   
   
   如果需要取消指定的Reindex任务，则执行如下命令。
   ```
   POST /_tasks/{task_id}/_cancel
   ```
   
5. 迁移完成后，分别查询源索引和目标索引的文档数据，对比数据是否Reindex成功。
   ```
   GET /{index_name}/_count
   ```
   
 
#### 常见问题：当索引数据大、数据同步慢时，如何处理？
当索引数据大、数据同步慢时，有如下几种方案可以提高效率。
- Reindex API是使用Scroll方式读取源端数据写入目标端，因此可以通过配置size和slice参数增加迁移并发和速度。具体使用指导请参见[Reindex API](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docs-reindex.html)。
- 当单个索引数据量比较大时，可以在迁移前将目标索引的副本数设置为0，以加快数据同步速度。待数据迁移完成后，再修改为实际值。
  设置副本数的命令参考：
  ```
  PUT {index_name}/_settings   // 目标索引名称
  {
    "number_of_replicas": "0",
    "refresh_interval": "60s"
  }
  ```
  
- 当源端数据量很大时，建议采用快照方式迁移数据。例如[通过备份与恢复实现华为云Elasticsearch集群间数据迁移](https://support.huaweicloud.com/bestpractice-css/css_07_0035.html)、[通过S3插件备份与恢复迁移自建Elasticsearch集群至华为云](https://support.huaweicloud.com/bestpractice-css/css_07_0001.html)和[通过备份与恢复迁移第三方Elasticsearch集群至华为云](https://support.huaweicloud.com/bestpractice-css/css_07_0010.html)。
- 当索引数据存在时间字段时，可以使用跨集群增量迁移方案，分段迁移索引数据。
 
