一文教你如何做elasticsearch迁移


在生产、测试研发环境中,难免有这样的需求,让elasticsearch在不同云服务商之间做数据迁移,比如从阿里云到aws、aws到阿里云、阿里云到腾讯云、腾讯云到阿里云、自建es到阿里云、自建到aws等等。

迁移方法: 本文总体说来迁移的方法是离线停机迁移。先做快照,然后根据elasticsearch的快照做恢复。
当然也有更高级的在线reindex迁移,那个不在本文中体现。

在云商上做es迁移,一般思路为首先创建对象存储桶,用来存储快照。然后通过授权创建elasticsearch快照路径,设定存储对象比如OSS、S3等相关存储信息。里面包含了AK、SK等安全信息。再调用Elasticsearch的快照API创建快照,并存在S3或者oss。 有了快照备份当然下一个过程就是恢复。 通过建立空的elasticsearch集群,关联相关OSS存储于快照。然后通过Elastic的快照恢复功能恢复数据。

这就是整个elasticsearch数据迁移与恢复的思路。

如果是自建elasticsearch集群,在创建快照路径的时候,可以设定主机路径。和对象存储路径类似。

下面举例说明从AWS 的elasticsearch迁移到阿里云 elasticsearch集群为例:

aws部分

创建快照存储桶

1.创建IAM角色

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::dev-es-backups"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::dev-es-backup/*"
            ]
        }
    ]
}

授权aws服务拥有安全策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

结果示范: s3-es1 s3-es2

2.创建策略

创建快照路径与桶关联
import boto3
import requests
from requests_aws4auth import AWS4Auth

host = 'https://xxx.cn-northwest-1.es.amazonaws.com.cn/' # 包含https和/结尾
region = 'cn-northwest-1' # es所在es区域
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

# Register repository

path = '_snapshot/my-snapshot-repo-name' # the Elasticsearch API endpoint  api端点
url = host + path

payload = {
  "type": "s3",
  "settings": {
    "bucket": "dev-es-backup",#s3桶名称
    "region": "cn-northwest-1", #aws 区域
    "role_arn": "arn:aws-cn:iam::xxx:role/es-TheSnapshotRole" #用户id
  }
}

headers = {"Content-Type": "application/json"}

r = requests.put(url, auth=awsauth, json=payload, headers=headers)

print(r.status_code)
print(r.text)
#在配置了.aws/config后运行 授权用户为上面第2创建策略关联用户
pyton es.py
创建快照并查看S3桶数据

1.创建快照

#在elasticsearch的kibana上执行
PUT /_snapshot/my-snapshot-repo-name/sk2021bak
#会创建一个叫sk2021bak的快照
#查看快照情况
GET _snapshot/my-snapshot-repo-name/sk2021bak

2.在s3的桶中可以看到备份的快照内容

s3 to OSS

#配置好aws ak和sk 然后通过aws cli进行数据同步到本地

1.使用aws s3 sync s3://xxx ./es-backup 同步s3数据到本地

2.使用ossutils 将本地数据同步到oss

#配置好阿里云的ak和sk ~/.ossutilconfig

./ossutil sync ./dev-esbackup/ oss://es-backup
#将本地文件夹同步到oss

oss与elasticsearch快照关联

#在阿里云的elasticsearch上创建快照服务端点

PUT _snapshot/backup-api
{
"type": "oss",
"settings": {
            "endpoint": "http://oss-cn-xxx-xxx.aliyuncs.com", 
            "access_key_id": "akxxx",
            "secret_access_key": "skxxxx",
            "bucket": "es-backup",  #桶名称
            "compress": true
      }
}
#创建_snapshot/backup-api快照端点,最好和备份一致

查看快照备份信息与恢复

#查看快照情况 在阿里云es
 GET _snapshot/backup-api/_all
#可以看到这个快照服务端点下所有快照备份情况
#恢复快照
POST _snapshot/backup-api/sk2021bak/_restore
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": true,
  "rename_pattern": ".kibana",
  "rename_replacement": "restored_.kibana"
}
#恢复sk2021bak的快照,下面的内容需要加上,不然恢复不成功!

验证数据

参考: https://help.aliyun.com/document_detail/72927.htm?spm=a2c4g.11186623.2.15.6861e55ekk6icg#concept-wjm-dcp-fhb

Devops