在生产、测试研发环境中,难免有这样的需求,让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"
}
]
}
结果示范:
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的快照,下面的内容需要加上,不然恢复不成功!