# 通过S3插件备份与恢复迁移自建Elasticsearch集群至华为云
自建Elasticsearch集群数据迁移到华为云Elasticsearch集群可以使用S3快照备份恢复方式。
#### 应用场景
S3插件（repository-s3）是一个专为Elasticsearch设计的插件，该插件允许用户将Elasticsearch的快照备份存储到与S3 API兼容的存储服务中，例如华为云的对象存储服务(OBS)。S3插件提供了一种高效、灵活且安全的方式来备份Elasticsearch集群的数据。
通过S3插件实现自建Elasticsearch集群和华为云Elasticsearch集群之间的数据迁移，常用于以下场景：
- 服务迁移上云：将自建的Elasticsearch服务迁移到云平台，以利用云服务的可扩展性、维护简便性和成本效益。
- 跨版本迁移：将低版本的自建Elasticsearch集群数据迁移到高版本的华为云Elasticsearch集群中。
- 集群整合：将多个自建Elasticsearch集群迁移到一个华为云Elasticsearch集群中整合为统一的数据平台，以简化管理和提高数据一致性。
- 技术栈统一：当企业已经在华为云上运行其他服务时，为了技术栈的统一和简化管理，可以选择将Elasticsearch集群也迁移至华为云。
 
#### 方案架构
图1迁移流程   
![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000002007170965.png "点击放大")
通过S3插件备份与恢复迁移自建Elasticsearch集群（源集群）至华为云Elasticsearch（目标集群）的迁移流程如[图1]所示。
1. 在自建Elasticsearch集群安装repository-s3插件。
2. 备份自建Elasticsearch数据到华为云对象存储服务OBS上。
3. 从华为OBS恢复数据到CSS服务的Elasticsearch。
 
#### 方案优势
- 跨版本兼容性高：支持在不同版本的Elasticsearch集群之间进行数据迁移，包括从低版本到高版本的升级。
- 高可用性和持久性：S3提供的高持久性和可用性保证了备份数据的安全性，减少了数据丢失的风险。
- 灵活的备份策略：可以根据业务需求，灵活选择全量备份或增量备份，优化存储使用和迁移时间。
 
#### 性能影响
使用备份与恢复迁移集群的核心在于直接复制数据存储层的文件以实现数据备份，该方案避免了对Elasticsearch外部读写接口的依赖，从而显著降低了对源集群性能的影响。对延迟敏感性较低的业务场景，此方法对集群性能的干扰几乎可以忽略。
#### 约束限制
- 目标集群的版本不能低于源集群的版本，版本兼容性分析请参见[Snapshot version compatibility](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/snapshot-restore.html#snapshot-cluster-compatibility)。
- 备份与恢复不支持动态增量数据同步，建议停止数据更新后再备份。
- 自建Elasticsearch集群需要配置公网访问权限才能备份快照到OBS。
 
#### 前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 已备好存储快照数据的OBS桶"backup-obs"，OBS桶必须和CSS服务的Elasticsearch集群位于同一"区域"，且"存储类别"为"标准存储"。
- 已获取账号的AK/SK，获取方式请参见[如何获取访问密钥AK/SK](https://support.huaweicloud.com/iam_faq/iam_01_0618.html)。
 
#### 操作步骤
1. 在自建Elasticsearch集群上安装repository-s3插件。 
   1. 查看自建Elasticsearch集群的版本，确认要安装的repository-s3插件版本。 执行如下命令获取集群信息。
      ```
      curl http://x.x.x.x:9200 # 需输入Elasticsearch集群的IP地址。
      ```
      在返回结果中查看"version.number"，如下所示表示集群版本号是7.10.2。
      ```
      {
        "name" : "es_cluster_migrate-ess-esn-1-1",
        "cluster_name" : "es_cluster_migrate",
        "cluster_uuid" : "1VbP7-39QNOx_R-llXKKtA",
        "version" : {
          "number" : "7.10.2",
          "build_flavor" : "default",
          "build_type" : "tar",
          "build_hash" : "d2ef93d",
          "build_date" : "2021-12-17T21:17:40.758843Z",
          "build_snapshot" : false,
          "lucene_version" : "8.7.0",
          "minimum_wire_compatibility_version" : "6.7.0",
          "minimum_index_compatibility_version" : "6.0.0-beta1"
        },
        "tagline" : "You Know, for Search"
      }
      ```
      
   
   2. 下载对应版本的repository-s3插件安装包。此处以7.10.2为例，基于集群实际版本号修改下载地址中的版本号。 下载地址："https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-s3/repository-s3-7.10.2.zip"
      
   
   3. 登录自建Elasticsearch集群的实例节点上，并cd到plugins目录下。
   
   4. 执行如下命令将repository-s3插件安装包解压到plugins目录下。
      ```
      unzip  repository-s3-7.10.2.zip -d plugins/repository-s3
      ```
      
   
   5. 给repository-s3插件添加华为云的访问密钥AK/SK。
      1. 进入自建集群Elasticsearch的安装路径，执行以下命令创建keystore文件。如果已存在keystore文件且可以正常使用，则跳过该步骤（如果依旧执行了如下命令，则选择"N"，避免原始文件被覆盖）。
         ```
         bin/elasticsearch-keystore create s3.keystore
         ```
         ![](https://support.huaweicloud.com/bestpractice-css/public_sys-resources/caution_3.0-zh-cn.png)
         创建keystore文件必须用普通用户，不能用**root**账号，否则配置不生效。
         
      
      2. 将华为云的访问密钥AK/SK增加到keystore文件中。
         ```
         bin/elasticsearch-keystore add s3.client.default.access_key
         bin/elasticsearch-keystore add s3.client.default.secret_key
         ```
         access_key是获取到的访问密钥ID（AK）；secret_key是获取到的秘密访问密钥（SK）。
         
       
   
   6. AK/SK添加完成后，重启节点使配置生效。
   
   7. 当自建Elasticsearch集群有多个实例节点时，重复执行[1.c]到[1.f]给其他节点安装S3插件和配置AK/SK。
   
   8. 重启完成后，执行如下命令查看S3插件是否安装成功。
      ```
      curl http://x.x.x.x:9200/_cat/plugins # 需输入Elasticsearch集群的IP地址。
      ```
      当正常返回repository-s3插件的版本信息时表示安装成功，如下所示。
      ```
      node-1 repository-s3 7.10.2
      ```
      
   
   
   
   
2. 备份自建Elasticsearch数据到华为云对象存储服务OBS。 
   1. 登录自建Elasticsearch集群的Kibana，选择"Dev Tools"，进入命令行界面。
   
   2. 执行如下命令，创建快照仓库"my_backup"，对接华为云OBS存放快照数据的OBS桶"backup-obs"。
      ```
      PUT /_snapshot/my_backup
      {
        "type": "s3",
        "settings": {
          # OBS桶名称
          "bucket": "backup-obs",
          # OBS的外网访问地址
          "endpoint": "obs.xxx.example.com",
          "base_path": "snapshot",
          "max_snapshot_bytes_per_sec": "1000mb"
        }
      }
      ```
      ![](https://support.huaweicloud.com/bestpractice-css/public_sys-resources/caution_3.0-zh-cn.png)
      当出现如下报错时，表示S3插件与OBS桶存在兼容性问题（OBS桶不支持Path Style请求，详见[华为云禁止使用path请求方式访问OBS桶功能通知](https://www.huaweicloud.com/notice/2022/20231106133534969.html)）。 S3插件从7.4版本才开始支持Virtual Host Style访问方式，7.4之前的版本仅支持Path Style访问方式。 OBS桶不同版本支持的访问格式不同。该报错是由于S3插件版本与OBS桶的兼容性问题导致的，需切换迁移方案。推荐[通过华为云Logstash实现Elasticsearch集群间数据迁移](https://support.huaweicloud.com/bestpractice-css/css_07_0009.html)。
      ```
      {
          "error": {
              "root_cause": [
                  {
                      "type": "repository_verification_exception",
                      "reason": "[my_backup] path [snapshotqa] is not accessible on master node"
                  }
              ],
              "type": "repository_verification_exception",
              "reason": "[my_backup] path [snapshotqa] is not accessible on master node",
              "caused_by": {
                  "type": "i_o_exception",
                  "reason": "Unable to upload object [snapshotqa/tests-bXFMubHkRc6I6Bi0_MLaVw/master.dat] using a single upload",
                  "caused_by": {
                      "type": "amazon_s3_exception",
                      "reason": "amazon_s3_exception: Virtual host domain is required while accessing a specific bucket. (Service: Amazon S3; Status Code: 403; Error Code: VirtualHostDomainRequired; Request ID: 0000019A06082A2898E7F94824E63CD6; S3 Extended Request ID: QBhRggr6ok5ah1Vg9wy6v6bdUIR8Z5T/L1HNX765EufYZh6rY5iKccH47xSTX/Ts)"
                  }
              }
          },
          "status": 500
      }
      ```
      
   
   3. 执行如下命令，当正常返回快照仓库信息时，表示创建成功。
      ```
      GET /_snapshot/my_backup
      ```
      
   
   4. 执行如下命令，创建快照。 排除"."开始的系统索引，为其他索引创建全量快照，其中"wait_for_completion"设置为"true"表示同步执行。
      ```
      PUT  _snapshot/my_backup/snapshot_all?wait_for_completion=true
      {
          "indices": "*,-.*"
      }
      ```
      
   
   5. 快照创建完成可以执行如下命令查看快照信息。
      ```
      # 查看所有存在的快照
      GET _cat/repositories
      # 查看所有的快照信息
      GET _snapshot/my_backup/_all
      # 根据快照名称查看快照信息，其中snapshot_all是快照名称
      GET _snapshot/my_backup/snapshot_all
      # 根据快照名称查看快照状态，其中snapshot_all是快照名称
      GET _snapshot/my_backup/snapshot_all/_status
      ```
      
   
   
   
   
3. 登录CSS Elasticsearch集群的Kibana。 
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
   
   3. 在集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
   
   4. 在Kibana左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
      
   
   
   
   
4. 从OBS恢复数据到CSS Elasticsearch。 
   1. 在Kibana执行如下命令，创建快照仓库"my_backup_all"。
      ```
      PUT _snapshot/my_backup_all/
      {
          "type" : "obs",
          "settings" : {
      # OBS的内网访问域名。
      "endpoint" : "obs.xxx.example.com",
      "region" : "cn-south-1",
      # 访问OBS的用户名和密码。
      "access_key": "xxx",
      "secret_key": "xxx",  
      # OBS的桶名称，和上一步迁移源端的OBS桶名保持一致。
      "bucket" : "backup-obs",   
      "compress" : "false",
      "chunk_size" : "1g",
      "base_path" : "snapshot",
      "max_restore_bytes_per_sec": "1000mb",
      "max_snapshot_bytes_per_sec": "1000mb"    
      }
      }
      ```
      
   
   2. 执行如下命令，恢复快照数据到目标集群。
      - 查看存在的快照，其中my_backup_all是仓库名称。
        ```
        GET _snapshot/my_backup_all/_all
        ```
        
      
      - 基于查看到的快照名称恢复数据到目标elasticsearch集群，其中my_backup_all是快照仓库名称，snapshot_all是快照名称。
        ```
        POST _snapshot/my_backup_all/snapshot_all/_restore?wait_for_completion=true
        ```
        
      
      - 恢复指定索引到目标Elasticsearch集群，其中my_index1和my_index2是需要恢复的索引名称。
        ```
        POST _snapshot/my_backup_all/snapshot_all/_restore?wait_for_completion=true
        {
          "indices": "my_index1,my_index2,-.*",
          "ignore_unavailable": "true"
        }
        ```
        
       
   
   
   
   
5. 数据迁移完毕，检查目标Elasticsearch集群和源Elasticsearch集群数据的一致性。例如，分别在源集群和目标集群执行_cat/indices命令，对比两者的索引信息是否一致。
6. （可选）迁移完成后，如果不再使用OBS中的快照，请及时删除OBS桶，释放资源，节约成本。
 
