# 通过读写分离插件实现华为云Elasticsearch集群间数据迁移
通过CSS服务的读写分离插件可以实现华为云Elasticsearch集群间的数据迁移。
#### 应用场景
华为云Elasticsearch集群（7.6.2和7.10.2版本）默认安装了CSS服务的读写分离插件，通过配置读写分离可以实现Elasticsearch集群间的索引数据的近实时同步。
通过读写分离插件实现华为云Elasticsearch集群间数据迁移仅适用于源集群和目标集群都是CSS服务的集群。常用于以下场景：
- 跨地域或跨账号迁移：将其他Region或账号下的Elasticsearch集群迁移到当前集群中。
- 集群合并：将两个Elasticsearch集群的索引数据合并到一个集群中。
 
#### 方案架构
图1迁移流程   
![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000002011274021.png)
通过CSS服务的读写分离插件迁移华为云Elasticsearch集群（源集群）至华为云Elasticsearch（目标集群）的数据迁移流程如[图1]所示。
1. 通过读写分离插件建立源集群和目标集群的连接。
2. 在目标集群配置索引自动同步，实现源集群的数据自动同步到目标集群。同步周期默认是30秒，支持修改。
3. 查询自动同步状态，确认集群数据是否迁移完成。
更多关于CSS服务的读写分离功能的介绍请参见[配置Elasticsearch集群读写分离](https://support.huaweicloud.com/usermanual-css/css_01_0162.html)。
#### 方案优势
- 数据一致性高：利用读写分离的主从复制机制，确保数据在不同分片之间的同步，提高数据的一致性。
- 迁移速度快：读写分离的自动同步速度依赖带宽，不受源集群和目标集群的影响，同步快。
- 实时性可控：读写分离的默认同步周期为30秒，支持修改，可以控制数据迁移的实时性，减少数据同步过程中的延迟 。
 
#### 性能影响
使用读写分离迁移集群的核心在于通过底层文件复制来实现数据同步，此方法绕开了Elasticsearch的外部读写API，因此对源集群的性能影响被降至最低。
#### 约束限制
- 源集群和目标集群的版本必须保持一致，只支持Elasticsearch 7.6.2或7.10.2版本。
- 使用读写分离插件迁移集群时，仅支持数据迁移，不包含索引策略（如Rollover、快照策略等）。如需在目标集群继续使用Rollover等管理策略，建议在迁移完成后，手动在目标集群中重新配置相关策略。
 
#### 前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态，且都安装了读写分离插件（Elasticsearch 7.6.2和7.10.2版本默认安装了读写分离插件）。
- 集群间需要保证网络连通。 如果源集群和目标集群在不同VPC，则需要先打通VPC网络。具体操作请参见[配置Elasticsearch集群路由](https://support.huaweicloud.com/usermanual-css/css_01_0279.html)。
  
 
#### 操作步骤
1. 获取Elasticsearch集群信息，用于配置迁移任务。 
   表1需要获取的Elasticsearch集群信息 
   | 集群来源                                                                       || 要获取的信息                                                                                                                                                                                                                                        | 获取方式                                                                                                                                                                                                                                              |
   |:---|---|:---|:---|
   | 源集群     | 华为云Elasticsearch集群  | - 源集群的访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）         | - 获取集群的访问地址请参见下面的操作步骤。  - 用户名和密码请联系服务管理员获取。     |
   | 源集群     | 自建Elasticsearch集群  | - 源集群的公网访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）   | 联系服务管理员获取。                                                                                                                                                                                                                                        |
   | 源集群     | 第三方Elasticsearch集群  | - 源集群的访问地址  - 访问源集群的用户名和密码（仅安全集群涉及）         | 联系服务管理员获取。                                                                                                                                                                                                                                          |
   | 目标集群 | 华为云Elasticsearch集群 | - 目标集群的访问地址  - 访问目标集群的用户名和密码（仅安全集群涉及）            | - 获取访问地址请参见下面的操作步骤。  - 用户名和密码请联系服务管理员获取。   |
      
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
   
   3. 在集群列表，选择目标集群，在"内网访问地址"列获取并记录集群的内网地址，一般是"\<host\>:\<port\>"或"\<host\>:\<port\>,\<host\>:\<port\>"样式，例如"10.62.179.32:9200,10.62.179.33:9200"。 当集群中存在Client节点时，仅显示所有Client节点的IP和端口；否则，显示所有数据节点和冷数据节点的IP和端口。
      
   
   
   
   
2. 登录目标Elasticsearch集群的Kibana操作页面。 
   1. 在Elasticsearch集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
   
   2. 在左侧导航栏选择"Dev Tools"进入操作页面。
   
   
   
   
3. 通过读写分离插件，在目标集群建立与源集群的连接。 
   执行如下命令，在目标集群配置源集群的信息。
   ```
   PUT /_cluster/settings
   {
     "persistent" : {
       "cluster" : {
         "remote.rest" : {
           "leader1" : {
             "seeds" : [
               "http://10.0.0.1:9200",
               "http://10.0.0.2:9200",
               "http://10.0.0.3:9200"
             ] ,
               "username": "elastic",
               "password": "*****"
           }
         }
       }
     }
   }
   ```
   表2请求体参数说明 
   | 参数名       | 说明                                            |
   |:---|:---|
   | *leader1* | 配置任务的名称，由用户自定义，在后续读写分离配置时会用到该名称。             |
   | seeds       | 源集群的访问地址。当集群开启HTTPS访问时，URI schema需要对应使用https。 |
   | username | 源集群的用户名，仅源集群是安全集群时才需要配置。                     |
   | password   | 源集群的密码，仅源集群是安全集群时才需要配置。                          |
      
   当返回结果中，"acknowledged"为"true"时，表示配置成功。
   
   
4. 在目标集群配置索引自动同步，实现源集群的数据自动同步到目标集群。 
   执行如下命令，创建匹配模式同步索引，将源集群中匹配的索引同步到目标集群中。
   ```
   PUT auto_sync/pattern/pattern1
   {
    "remote_cluster": "leader1",
    "remote_index_patterns": "log*",
    "local_index_pattern": "{{remote_index}}",
    "apply_exist_index": true
   }
   ```
   表3请求体参数说明 
   | 参数名                   | 说明                                                                      |
   |:---|:---|
   | pattern1                                          | 自定义同步集群配置的pattern名字，用于区分多个不同的匹配模式。                                                                   |
   | remote_cluster         | 配置任务的名称，例如上一步的"leader1"。                                                  |
   | remote_index_patterns | 源集群待同步索引模式，支持通配符"\*"。                                                    |
   | local_index_pattern | 同步到目标集群的索引模式，支持模板替换。例如取值为"{{remote_index}}"时，待同步索引为"log1"，同步过来的索引为"log1"。 |
   | apply_exist_index     | 是否同步源集群上已存在的索引，默认为"true"。                                               |
      
   
   
5. 在目标集群查询集群的自动同步状态，同步周期默认是30秒。 
   执行如下命令，获取匹配索引的同步状态。
   ```
   GET auto_sync/stats
   ```
   当返回结果中，"failed_count"为"0"时，表示同步完成。
   
   
6. 集群同步完成后，检查目标Elasticsearch集群和源集群数据的一致性。 
   例如，分别在源集群和目标集群执行GET _cat/indices命令，对比两者的索引信息是否一致。
   
   
 
