通过OSS将自建ES集群迁移至阿里云ES

通过创建OSS快照仓库备份ECS自建Elasticsearch(简称ES)数据,然后将快照恢复到阿里云ES,实现自建ES集群数据迁移到阿里云ES。

使用限制

  • OSS存储空间需同时满足

    • 存储空间为标准存储类型

    • 与阿里云ES集群位于同一地域

  • 集群版本:支持在同一个ES大版本之间将低版本中的数据迁移至高版本(如将8.15.1的数据迁移到8.17.1),不建议跨大版本之间迁移数据(如将7.7.1中的数据迁移到8.17.1)。

    说明

    阿里云ES完全兼容开源ES,但由于开源ES大版本间存在数据类型变更(如5.xstring类型在6.x中被拆分为textkeyword),直接跨大版本迁移会导致字段类型识别错误。

前置准备

  • 创建与自建ES同版本的阿里云ES集群、创建OSS存储空间。

  • RAM用户需要具备AliyunOSSFullAccess权限策略,请参见RAM用户授权完成授权。

背景信息

自建ES待迁移数据以products_info索引为例:

创建索引并插入数据

创建索引:

curl -X PUT "http://localhost:9200/products_info" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "productName": { "type": "text" },
      "annual_rate": { "type": "text" },
      "describe": { "type": "text" }
    }
  }
}'

插入数据:

curl -X POST "http://localhost:9200/products_info/_bulk" -H 'Content-Type: application/json' -d'
{ "index": { "_id": "1" } }
{ "productName": "理财产品A", "annual_rate": "3.2200%", "describe": "180天定期理财,最低20000起投,收益稳定,可以自助选择消息推送" }
{ "index": { "_id": "2" } }
{ "productName": "理财产品B", "annual_rate": "3.1100%", "describe": "90天定投产品,最低10000起投,每天收益到账消息推送" }
{ "index": { "_id": "3" } }
{ "productName": "理财产品C", "annual_rate": "3.3500%", "describe": "270天定投产品,最低40000起投,每天收益立即到账消息推送" }
{ "index": { "_id": "4" } }
{ "productName": "理财产品D", "annual_rate": "3.1200%", "describe": "90天定投产品,最低12000起投,每天收益到账消息推送" }
{ "index": { "_id": "5" } }
{ "productName": "理财产品E", "annual_rate": "3.0100%", "describe": "30天定投产品推荐,最低8000起投,每天收益会消息推送" }
{ "index": { "_id": "6" } }
{ "productName": "理财产品F", "annual_rate": "2.7500%", "describe": "热门短期产品,3天短期,无须任何手续费用,最低500起投,通过短信提示获取收益消息" }
'

执行curl -X GET "http://localhost:9200/products_info/_search?pretty",返回数据如下表示索引数据就绪:

示例数据

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "kRjec5gBZDsv98SA0Bmx",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品A",
          "annual_rate" : "3.2200%",
          "describe" : "180天定期理财,最低20000起投,收益稳定,可以自助选择消息推送"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "khjec5gBZDsv98SA0Bmy",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品B",
          "annual_rate" : "3.1100%",
          "describe" : "90天定投产品,最低10000起投,每天收益到账消息推送"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "kxjec5gBZDsv98SA0Bmy",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品C",
          "annual_rate" : "3.3500%",
          "describe" : "270天定投产品,最低40000起投,每天收益立即到账消息推送"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "lBjec5gBZDsv98SA0Bmy",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品D",
          "annual_rate" : "3.1200%",
          "describe" : "90天定投产品,最低12000起投,每天收益到账消息推送"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "lRjec5gBZDsv98SA0Bmy",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品E",
          "annual_rate" : "3.0100%",
          "describe" : "30天定投产品推荐,最低8000起投,每天收益会消息推送"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "lhjec5gBZDsv98SA0Bmy",
        "_score" : 1.0,
        "_source" : {
          "productName" : "理财产品F",
          "annual_rate" : "2.7500%",
          "describe" : "热门短期产品,3天短期,无须任何手续费用,最低500起投,通过短信提示获取收益消息"
        }
      }
    ]
  }
}

方案概览

image

该方案适用于数据量大( 500GB以上)、迁移效率要求高(首次全量备份后,后续仅同步增量数据,缩短迁移耗时)的场景,适合自建ES迁移上云、跨版本升级、生产环境灾备等场景。

数据迁移

1. 安装elasticsearch-repository-oss插件

  1. 连接自建ES所在的ECS服务器,下载elasticsearch-repository-oss插件,本文使用8.17版本的插件。

    wget https://github.com/aliyun/elasticsearch-repository-oss/releases/download/v8.17.0/elasticsearch-repository-oss-8.17.0.zip

    其他版本的elasticsearch-repository-oss插件,请参见如何获取其他版本的elasticsearch-repository-oss插件?

  2. 将插件安装至ES集群。

    #通过将插件解压到Elasticsearch各节点安装路径的plugins目录下完成安装
    sudo unzip -d /usr/local/elasticsearch-8.17.0/plugins/elasticsearch-repository-oss elasticsearch-repository-oss-8.17.0.zip
  3. 启动自建ES集群节点。

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

2. 自建ES集群创建快照仓库

在自建ES集群所在服务器执行如下命令创建仓库。

说明

此命令适用于ES 8.x版本,其他ES版本如何创建快照仓库请参见创建仓库

curl -X PUT "http://localhost:9200/_snapshot/<yourBackupName>" -H 'Content-Type: application/json' -d'
{
    "type": "oss",
    "settings": {
        "oss.client.endpoint": "oss-cn-shanghai.aliyuncs.com",
        "oss.client.access_key_id": "xxxx",
        "oss.client.secret_access_key": "xxxx",
        "oss.client.bucket": "<yourBucketName>",
        "oss.client.base_path":"snapshot/",
        "oss.client.compress": true
    }
}
'

参数

说明

<yourBackupName>

仓库名称,自定义。

type

仓库类型,需要设置为oss

oss.client.endpoint

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

说明

若自建ESECS实例与OSS存储空间位于同一地域,请通过私网地址访问OSS;若在不同地域,则使用外网地址。

oss.client.access_key_id

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

oss.client.secret_access_key

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

oss.client.bucket

OSS Bucket名称。

oss.client.base_path

快照存储路径。

oss.client.compress

是否压缩:

  • true:启用压缩,可节省存储空间

  • false:不启用压缩

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

3. 为指定索引创建快照

在自建ES中创建snapshot_1快照,备份products_info索引。

curl -X PUT localhost:9200/_snapshot/<yourBackupName>/snapshot_1?pretty -H "Content-Type: application/json" -d'
{
"indices": "products_info"
}'

<yourBackupName>为您在自建ES创建快照仓库中设置的仓库名称。

快照创建成功后,预期返回"accepted" : true

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

4. 在阿里云ES上创建相同仓库

在阿里云ES登录Kibana控制台,在左侧导航栏,单击展开图标图标,选择Management > 开发工具

Shell中执行以下命令,创建与自建ES相同的仓库。

PUT _snapshot/<yourBackupName>/
{
    "type": "oss",
    "settings": {
        "endpoint": "oss-cn-shanghai.aliyuncs.com",
        "access_key_id": "xxxx",
        "secret_access_key": "xxxxxx",
        "bucket": "<yourBucketName>",
        "compress": true,
        "chunk_size": "500mb",
        "base_path": "snapshot/"
    }
}

<yourBackupName><yourBucketName><base_path>需要与在自建ES创建快照仓库中使用的仓库和Bucket保持一致。

5. 在阿里云ES中恢复快照

Kibana控制台执行以下命令,将备份仓库中 snapshot_1 快照恢复到集群,包含所有索引(除监控类和安全审计类索引),且自动跳过不存在的索引。

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

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

索引恢复过程中,可以通过GET products_info/_recovery查看products_info索引的恢复状态,当"stage":为"DONE"时,索引恢复完成。

说明

ES 7.10.x、7.17.x版本中,支持通过将 cluster.restore.ignore_revision.enable设置为true,来允许从修订版本号更高的快照中恢复数据。修订版本号即版本号中的第三位,例如,7.10.1版本,7为主版本号,10为次版本号,1则为修订版本号。

示例:当前运行的ES 7.10.0版本将cluster.restore.ignore_revision.enable设置为true后,可实现从7.10.2版本创建的快照中恢复数据。配置代码如下。

PUT _cluster/settings
{
  "persistent": {
    "cluster.restore.ignore_revision.enable": true
  }
}

6. 结果验证

Kibana控制台上执行以下命令,查看恢复结果。

  • 查看恢复的索引

    GET /_cat/indices?v

    image

  • 查看恢复的索引数据

    GET /products_info/_search

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

    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": {
          "value": 6,
          "relation": "eq"
        },
        "max_score": 1,
        "hits": [
          {
            "_index": "products_info",
            "_id": "1",
            "_score": 1,
            "_source": {
              "productName": "理财产品A",
              "annual_rate": "3.2200%",
              "describe": "180天定期理财,最低20000起投,收益稳定,可以自助选择消息推送"
            }
          },
          {
            "_index": "products_info",
            "_id": "2",
            "_score": 1,
            "_source": {
              "productName": "理财产品B",
              "annual_rate": "3.1100%",
              "describe": "90天定投产品,最低10000起投,每天收益到账消息推送"
            }
          },
          {
            "_index": "products_info",
            "_id": "3",
            "_score": 1,
            "_source": {
              "productName": "理财产品C",
              "annual_rate": "3.3500%",
              "describe": "270天定投产品,最低40000起投,每天收益立即到账消息推送"
            }
          },
          {
            "_index": "products_info",
            "_id": "4",
            "_score": 1,
            "_source": {
              "productName": "理财产品D",
              "annual_rate": "3.1200%",
              "describe": "90天定投产品,最低12000起投,每天收益到账消息推送"
            }
          },
          {
            "_index": "products_info",
            "_id": "5",
            "_score": 1,
            "_source": {
              "productName": "理财产品E",
              "annual_rate": "3.0100%",
              "describe": "30天定投产品推荐,最低8000起投,每天收益会消息推送"
            }
          },
          {
            "_index": "products_info",
            "_id": "6",
            "_score": 1,
            "_source": {
              "productName": "理财产品F",
              "annual_rate": "2.7500%",
              "describe": "热门短期产品,3天短期,无须任何手续费用,最低500起投,通过短信提示获取收益消息"
            }
          }
        ]
      }
    }

常见问题

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

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

  • version=所需插件的版本

  • elasticsearch.version=自建ES的版本

    说明

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

  • java.version=1.8

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

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