通过OSS将自建Elasticsearch数据迁移至阿里云

当您需要将自建Elasticsearch数据迁移至阿里云Elasticsearch时,可以使用OSS快照的方式进行迁移。即使用Elasticsearch的snapshot API,创建自建Elasticsearch数据的快照并存储到OSS中,然后从OSS将快照数据恢复到阿里云Elasticsearch中。本文介绍具体的实现方法。

背景信息

通过OSS将自建Elasticsearch数据迁移至阿里云Elasticsearch,适用于自建Elasticsearch数据量比较大的场景,简单流程如下操作流程

操作流程

  1. 步骤一:环境准备

    部署自建Elasticsearch集群、创建OSS Bucket、创建阿里云Elasticsearch集群。

  2. 步骤二:安装elasticsearch-repository-oss插件

    在自建Elasticsearch集群各节点中安装elasticsearch-repository-oss插件,插件安装后才可在自建Elasticsearch中创建OSS仓库。

  3. 步骤三:在自建Elasticsearch集群中创建仓库

    使用snapshot API在自建Elasticsearch集群中创建快照备份仓库。

  4. 步骤四:为指定索引创建快照

    为需要迁移的索引创建快照,并将快照备份到已创建的仓库中。

  5. 步骤五:在阿里云Elasticsearch上创建相同仓库

    在阿里云Elasticsearch的Kibana控制台中,使用snapshot API创建一个与自建Elasticsearch集群相同的快照备份仓库。

  6. 步骤六:在阿里云Elasticsearch上恢复快照

    将仓库中已备份的自建Elasticsearch集群的快照恢复到阿里云Elasticsearch集群中,完成数据迁移。

  7. 步骤七:查看快照恢复结果

    快照恢复后,查看恢复的索引和索引数据。

步骤一:环境准备

  1. 准备自建Elasticsearch集群。

    如果您还没有自建Elasticsearch集群,建议您使用阿里云ECS进行搭建,具体操作步骤请参见安装并运行Elasticsearch

    说明

    建议您使用同VPC下的阿里云ECS搭建自建Elasticsearch集群,通过自建服务器搭建集群可能存在网络不通的问题。

    本文以单节点集群为例进行演示,版本为6.7.0。实际生产中您可以购买多个相同专有网络VPC(Virtual Private Cloud)的ECS实例搭建多节点Elasticsearch集群,购买ECS的具体步骤请参见自定义购买实例

  2. 开通OSS服务,并创建与部署自建Elasticsearch集群的ECS实例相同地域的Bucket。

    具体操作步骤请参见开通OSS服务创建存储空间

    重要

    请创建标准存储类型的OSS Bucket,不支持归档存储类型。

  3. 创建目标阿里云Elasticsearch实例,所选地域与您创建的Bucket相同。

    具体操作步骤请参见创建阿里云Elasticsearch实例

步骤二:安装elasticsearch-repository-oss插件

  1. 连接自建Elasticsearch集群所在的ECS。

    具体操作请参见通过密码或密钥认证登录Linux实例

    说明

    本文档以普通用户权限为例。

  2. 下载elasticsearch-repository-oss插件。

    本文使用6.7.0版本的插件,要求JDK为11.0及以上版本。

    wget https://github.com/aliyun/elasticsearch-repository-oss/releases/download/v6.7.0/elasticsearch-repository-oss-6.7.0.zip
    说明

    如需获取其他版本的elasticsearch-repository-oss插件,可参见常见问题

  3. 将安装包解压到自建Elasticsearch各节点安装路径的plugins目录下。

    sudo unzip -d /usr/local/elasticsearch-6.7.0/plugins/elasticsearch-repository-oss elasticsearch-repository-oss-6.7.0.zip

    您也可以使用命令方式安装插件。

    sudo ./bin/elasticsearch-plugin install file:///usr/local/elasticsearch-repository-oss-6.7.0.zip
  4. 启动自建Elasticsearch集群各节点。

    cd /usr/local/elasticsearch-6.7.0
    ./bin/elasticsearch -d

步骤三:在自建Elasticsearch集群中创建仓库

连接自建Elasticsearch集群所在的ECS,执行如下命令创建仓库。

sudo curl -H "Content-Type: application/json" -XPUT localhost:9200/_snapshot/<yourBackupName> -d' {"type": "oss", "settings": { "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",  "access_key_id": "<yourAccesskeyId>",  "secret_access_key":"<yourAccesskeySecret>", "bucket": "<yourBucketName>", "compress": true }}'

参数

说明

<yourBackupName>

仓库名称,可自定义。

type

仓库类型,需要设置为oss

endpoint

OSS Bucket的访问地址,可参见访问域名和数据中心获取。

说明

如果自建Elasticsearch所在ECS与您的OSS在同一地域,请使用私网地址,否则请使用外网地址。

access_key_id

创建OSS Bucket的账号的AccessKey ID,获取方式请参见如何获取AccessKey

secret_access_key

创建OSS Bucket的账号的AccessKey Secret,获取方式请参见如何获取AccessKey

bucket

您创建的OSS Bucket名称。

compress

是否压缩:

  • true:压缩

  • false:不压缩

创建成功后,预期返回"acknowledge":true

步骤四:为指定索引创建快照

在自建Elasticsearch中创建一个快照,用来备份您需要迁移的索引数据。创建快照时,默认会备份所有打开的索引。如果您不想备份系统索引,例如以.kibana.security.monitoring等开头的索引,可在创建快照时指定需要备份的索引。

重要

建议您不要备份系统索引,因为系统索引会占用较大空间。

curl -H "Content-Type: application/json" -XPUT localhost:9200/_snapshot/<yourBackupName>/snapshot_1?pretty -d'
{
"indices": "index1,index2"
}'

<yourBackupName>为您在步骤三:在自建Elasticsearch集群中创建仓库中创建的仓库名称;index1index2为您需要备份的索引名称。快照创建成功后,预期返回"accepted" : true

快照创建过程中,您可以通过GET /_snapshot/<yourBackupName>/<yourSnapshotName>/_status命令查看指定快照的详细信息。当返回结果中的stateSUCCESS时,表示快照已完成。

步骤五:在阿里云Elasticsearch上创建相同仓库

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 在左侧导航栏,单击Dev Tools
  3. Console中执行以下命令,创建与自建Elasticsearch相同的仓库。

    PUT _snapshot/<yourBackupName>
    {
        "type": "oss",
        "settings": {
            "endpoint": "oss-cn-hangzhou-internal.aliyuncs.com",
            "access_key_id": "<yourAccesskeyId>",
            "secret_access_key": "<yourAccesskeySecret>",
            "bucket": "<yourBucketName>",
            "compress": true
        }
    }

    <yourBackupName><yourBucketName>需要与步骤三:在自建Elasticsearch集群中创建仓库中保持一致。

步骤六:在阿里云Elasticsearch上恢复快照

参见步骤五:在阿里云Elasticsearch上创建相同仓库,在Kibana控制台上执行以下命令,恢复快照中的所有索引(除过.开头的系统索引)。

POST _snapshot/es_backup/snapshot_1/_restore
{"indices":"*,-.monitoring*,-.security_audit*","ignore_unavailable":"true"}

命令执行成功,预期返回"accepted" : true

以上命令会恢复快照中的所有索引,您也可以选择需要恢复的索引。同时如果阿里云Elasticsearch集群中有同名索引,而您想在不替换现有数据的前提下恢复旧数据来验证内容,或者处理其他任务,可在恢复过程中重命名索引。

POST _snapshot/es_backup/snapshot_1/_restore
{
  "indices":"index1",
  "rename_pattern": "index(.+)",
  "rename_replacement": "restored_index_$1"
}
说明

更多快照和恢复命令请参见手动备份与恢复

步骤七:查看快照恢复结果

参见步骤五:在阿里云Elasticsearch上创建相同仓库,在Kibana控制台上执行以下命令,查看恢复结果:

  • 查看恢复的索引

    GET /_cat/indices?v

    查看恢复成功的索引

  • 查看恢复的索引数据

    GET /index1/_search

    执行成功后,预期结果如下。

    {
      "took" : 2,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "index1",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "productName" : "testpro",
              "annual_rate" : "3.22%",
              "describe" : "testpro"
            }
          }
        ]
      }
    }

常见问题

Q:如何获取其他版本的elasticsearch-repository-oss插件?

A:可在Github上下载。如果Github上没有对应版本的插件包,建议您下载对应大版本的相近小版本的插件包,然后修改plugin-descriptor.properties文件中的参数值,重新打包再安装。

  • version=所需插件的版本

  • elasticsearch.version=自建Elasticsearch的版本

    说明

    插件版本与自建Elasticsearch版本要保证一致。

  • java.version=1.8

    说明
    • 不同的Elasticsearch版本依赖的JDK版本不一样,以官方插件要求为准。

    • 由于开源Elasticsearch集群的版本较多,各版本编译存在差异,因此在使用elasticsearch-repository-oss插件时,需要您结合对应Elasticsearch的版本进行编译调试。例如自建Elasticsearch 7.6.2集群,要求JDK版本大于1.8及以上,编译调试后对应的插件为elasticsearch-repository-oss-7.6.2