# 通过备份与恢复迁移第三方Elasticsearch集群至华为云
通过备份与恢复可以将第三方Elasticsearch集群数据迁移至华为云Elasticsearch集群。
#### 应用场景
通过备份与恢复实现第三方Elasticsearch集群和华为云Elasticsearch集群之间的数据迁移，依赖存储仓库。常用于以下场景：
- 变更服务提供商：如果企业当前使用的是第三方Elasticsearch服务，但出于成本、性能或其他战略考虑，希望更换服务提供商至华为云。
- 集群整合：将分散在不同第三方Elasticsearch集群中的数据统一迁移到华为云Elasticsearch集群进行集中管理，以实现更高效的数据分析和查询。
- 跨版本迁移：将低版本的第三方Elasticsearch集群数据迁移到高版本的华为云Elasticsearch集群中。
- 技术栈统一：当企业已经在华为云上运行其他服务时，为了技术栈的统一和简化管理，可以选择将Elasticsearch集群也迁移至华为云。
 
#### 方案架构
图1迁移流程   
![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000001934020414.png "点击放大")
通过备份与恢复迁移第三方Elasticsearch集群（源集群）至华为云Elasticsearch集群（目标集群）的迁移流程如[图1]所示。
1. 备份第三方Elasticsearch数据到第三方共享存储仓库上。
2. 通过华为云OMS迁移共享存储仓库上的数据到华为云OBS上。
3. 通过华为OBS恢复数据到华为云Elasticsearch。
 
#### 方案优势
- 易于操作和管理：使用Elasticsearch自带的快照和恢复API，操作简单，易于管理和自动化。
- 适用于大规模数据迁移：快照备份适用于数据量大的场景，特别是当数据量达到GB、TB甚至PB级别时。
- 恢复过程可控：在恢复数据时，可以选择恢复特定索引或全部索引，并且可以指定恢复到特定的集群状态。
 
#### 性能影响
使用备份与恢复迁移集群的核心在于直接复制数据存储层的文件以实现数据备份，该方案避免了对Elasticsearch外部读写接口的依赖，从而显著降低了对源集群性能的影响。对延迟敏感性较低的业务场景，此方法对集群性能的干扰几乎可以忽略。
#### 约束限制
- 目标集群的版本不能低于源集群的版本，版本兼容性分析请参见[Snapshot version compatibility](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/snapshot-restore.html#snapshot-cluster-compatibility)。
- 备份与恢复不支持动态增量数据同步，建议停止数据更新后再备份。
- 第三方存储仓库要配置公网访问才能迁移快照数据。
 
#### 前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 已备好存储快照数据的OBS桶"esbak"，OBS桶必须和CSS服务的Elasticsearch集群位于同一"区域"，且"存储类别"为"标准存储"。
 
#### 操作步骤
1. 登录Elasticsearch所在的第三方友商云，创建一个支持s3协议的共享存储仓库。 
   例如，登录阿里云，进入OSS服务创建目录"patent-esbak"。 或者，登录腾讯云，进入COS服务创建目录"patent-esbak"。
   
   
2. 在第三方Elasticsearch集群中创建快照备份仓库，用于存放Elasticsearch快照数据。 
   例如，在Elasticsearch中创建一个备份仓库"my_backup"，关联到存储仓库OSS。
   ```
   PUT _snapshot/my_backup
       {
           # 存储仓库类型。
   "type": "oss",
           "settings": {
   # 步骤1中存储仓库的内网访问域名。
   "endpoint": "http://oss-xxx.example.com", 
   # 存储仓库的用户ID和密码。认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密, 确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量ak和sk。
   "access_key_id": "ak",
   "secret_access_key": "sk",
   # 步骤1创建的存储仓库的bucket名称。
   "bucket": "patent-esbak", 
   # 是否打开快照文件的压缩功能。
   "compress": false,
   # 配置此参数可以限制快照数据的分块大小。当上传的快照数据超过这个数值，数据就会被分块上传到存储仓库中。
   "chunk_size": "1g",
   # 仓库的起始位置，默认是根目录。
   "base_path": "snapshot/"
           }
   }
   ```
   
   
3. 在第三方Elasticsearch集群中创建快照。 
   - 为所有索引创建快照。 例如，创建一个名为"snapshot_1"的快照。
     ```
     PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true
     ```
     
   
   - 为指定索引创建快照。 例如，创建一个名为"snapshot_test"的快照，该快照包含索引"patent_analyse"和"patent"。
     ```
     PUT _snapshot/my_backup/snapshot_test
     {
     "indices": "patent_analyse,patent"
     }
     ```
     
   
   
   
   
4. 在第三方Elasticsearch集群中查看集群的快照创建进度。 
   - 执行如下命令，可以查看所有快照信息。
     ```
     GET _snapshot/my_backup/_all
     ```
     
   
   - 执行如下命令，可以查看指定快照"snapshot_1"的信息。
     ```
     GET _snapshot/my_backup/snapshot_1
     ```
     
   
   
   
   
5. 通过华为云对象存储迁移服务OMS将快照数据从存储仓库迁移到对象存储服务OBS的"esbak"桶中。 
   OMS支持多种云服务商数据迁移到对象存储服务OBS中，具体请参见[各云服务商迁移教程](https://support.huaweicloud.com/bestpractice-oms/oms_05_5300.html)。
   ![](https://support.huaweicloud.com/bestpractice-css/public_sys-resources/note_3.0-zh-cn.png)
   在OMS创建迁移任务时，"元数据迁移方式"一定要选择"保留元数据"，否则数据迁移会有异常。
   
   
6. 登录CSS Elasticsearch集群的Kibana。 
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
   
   3. 在集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
   
   4. 在Kibana左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
      
   
   
   
   
7. 在CSS Elasticsearch集群中创建一个存储仓库关联到OBS，用于恢复第三方Elasticsearch的快照数据。 
   例如，在集群中创建一个"my_backup_all"的存储仓库，关联上一步OBS桶"esbak"。
   ```
   PUT _snapshot/my_backup_all/
   {
       "type" : "obs",
       "settings" : {
   # OBS的内网访问域名。
   "endpoint" : "obs.xxx.example.com",
   "region" : "xxx",
   # 访问OBS的用户名和密码。认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险, 建议在配置文件或者环境变量中密文存放, 使用时解密, 确保安全；本示例以ak和sk保存在环境变量中为例, 运行本示例前请先在本地环境中设置环境变量ak和sk。
   "access_key": "ak",
   "secret_key": "sk",  
   # OBS的桶名称，和上一步迁移目标集群的OBS桶名保持一致。
   "bucket" : "esbak",   
   "compress" : "false",
   "chunk_size" : "1g",
   # 注意“snapshot”后面没有/。
   "base_path" : "snapshot",
   "max_restore_bytes_per_sec": "100mb",
   "max_snapshot_bytes_per_sec": "100mb"    
   }
   }
   ```
   
   
8. 在CSS Elasticsearch集群中通过快照恢复数据。 
   1. 查看所有快照信息。
      ```
      GET _snapshot
      ```
      
   
   2. 通过快照恢复数据。
      - 恢复某一快照中的所有索引。例如恢复名为"snapshot_1"的快照的所有索引数据。
        ```
        POST _snapshot/my_backup_all/snapshot_1/_restore?wait_for_completion=true
        ```
        
      
      - 恢复某一快照中的部分索引。例如名为"snapshot_1"的快照中只恢复非"."开头的索引。
        ```
        POST _snapshot/my_backup/snapshot_1/_restore
        {"indices":"*,-.monitoring*,-.security*,-.kibana*","ignore_unavailable":"true"}
        ```
        
      
      - 恢复某一快照中的指定索引，并重命名。例如在名为"snapshot_1"的快照中，将索引"index_1"恢复为"restored_index_1"，"index_2"恢复为"restored_index_2"。
        ```
        POST /_snapshot/my_backup/snapshot_1/_restore
        {
        # 只恢复索引“index_1”和“index_2”，忽略快照中的其他索引。
        "indices": "index_1,index_2"
        # 查找正在恢复的索引，该索引名称需要与提供的模板匹配。
        "rename_pattern": "index_(.+)",
        # 重命名查找到的索引。
        "rename_replacement": "restored_index_$1"
        }
        ```
        
       
   
   3. 查看快照恢复结果。
      - 查看所有快照的恢复结果。
        ```
        GET /_recovery/
        ```
        
      
      - 查看指定索引的快照恢复结果。
        ```
        GET {index_name}/_recovery
        ```
        
       
   
   
   
   
9. （可选）迁移完成后，如果不再使用OBS中的快照，请及时删除OBS桶，释放资源，节约成本。
 
