说明
AWS Elasticsearch每天会自动为一个域中的主要索引分片创建快照,并将这些快照存储在预配置的AWS S3存储空间中。这些快照会保留14天,无需额外付费。此外,还可以使用这些快照来恢复域,但是这些自动快照不能被迁移到新域。如果要迁移,必须使用存储在自己的存储库(S3存储空间)中的手动快照。手动快照将收取标准S3费用。
所以,我们很有必要建立手动快照,来帮助我们完成定时数据备份,数据恢复或ES迁移等活动。本文主要讲解手动快照的建立流程和方案~
方案架构
构建 snapshot 流程
官方文档,写的不太好~
在AWS中创建手动快照的前提条件
创建AWS S3存储空间
这里创建的名字是ai-voice-test-snapshot
,该值后面在策略和脚本中会用到。
创建IAM角色
这里角色名字是ai-voice-test-es-snapshot
,该值后面在策略和脚本中会用到。
在IAM控制台创建AWS服务角色时,Select role type下拉列表中不包含AWS Elasticsearch。 但是,可以先选择Amazon EC2,按照提示完成角色创建,然后在角色信任关系中将ec2.amazonaws.com修改为es.amazonaws.com,如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
创建IAM策略
这里创建两个策略,内容如下~
- 指定存储AWS Elasticsearch域的S3存储空间:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ai-voice-test-snapshot"
]
},
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ai-voice-test-snapshot/*"
]
}
]
}
- 指定角色对es:ESHttpPut 操作的访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:Pa***ole",
# 角色 ARN
"Resource": "arn:aws:iam::123456789123:role/ai-voice-test-es-snapshot"
},
{
"Effect": "Allow",
"Action": "es:ESHttpPut",
# ES 域 ARN
"Resource": "arn:aws:es:ap-southeast-1:123456789123:domain/aivoice-test"
}
]
}
建立 snapshot repository 及生成 snapshot
先了解下基本概念,ES 的 snapshot 架构有两层,第一层是 repository,第二层才是 snapshot 名称,所以 URI 会长成这样:
# /_snapshot/repository/snapshot-name
_snapshot/es-snapshot-repo/es-snapshot-20210319
AWS Elasticsearch Service 的手动快照系统会把资料存到你指定的 S3 bucket 之中,一个 repository 名称对应一个 bucket 來源,你可以设定好几个 repository 对应到同一个 bucket 来源,你就会看到这些相同来源的 repository 里面的 snapshot 都是同样的那几个,这样讲可能比较好理解,但实际操作上没有太大意义。
注册 snapshot repository
安装必要的包:
pip install boto3
pip install requests_aws4auth
代码目前放在ai jumper
服务器的/root/admin-workspace/es-snapshot
路径下,内容如下:
# cat register-repo.py
import boto3
import requests
from requests_aws4auth import AWS4Auth
host = 'https://vpc-aivoice-test-thisisjustatest.ap-southeast-1.es.amazonaws.com/' # include https:// and trailing /
region = 'ap-southeast-1' # e.g. us-west-1
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/es-snapshot-repo' # the Elasticsearch API endpoint
url = host + path
payload = {
"type": "s3",
"settings": {
"bucket": "ai-voice-test-snapshot",
"region": "ap-southeast-1",
"role_arn": "arn:aws:iam::123456789123:role/ai-voice-test-es-snapshot"
}
}
headers = {"Content-Type": "application/json"}
r = requests.put(url, auth=awsauth, json=payload, headers=headers)
print(r.status_code)
print(r.text)
说明:
上面代码中的access_key, secret_key
信息是从/root/.aws
目录下两个文件获取的,是一个必须有es操作权限的IAM账号。如下:
# cat ./config
[default]
region = ap-southeast-1
# cat ./credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxx
执行上面的脚本,只是注册了snapshot repository 而已,还沒有真的建立 snapshot。这个注册的repository可以通过kibana DEV查看到~
# 注册 snapshot repository
python register-repo.py
建立 snapshot
以下是建立 snapshot 的 request,若在 Kibana DevTools 就不用加 domain name:
# 格式:PUT /_snapshot/my-snapshot-repo/snapshot-name
PUT /_snapshot/es-snapshot-repo/es-snapshot-20210319
若顺利的话,S3 那边就会慢慢跑出 snapshot 的相关文件了,但跑完会需要一定时间。经测试,150G的数据量需要一个小时左右才能跑完。
确认 snapshot
查看快照构建状态信息:
GET /_snapshot/es-snapshot-repo/es-snapshot-20210319
打印信息如下:
其他命令
# 获取所有repositories:
GET /_snapshot/_all?pretty
# 获取某个仓库下的快照信息
GET /_snapshot/es-snapshot-repo/_all?pretty