AWS Elasticsearch Service 建立snapshot

说明

AWS Elasticsearch每天会自动为一个域中的主要索引分片创建快照,并将这些快照存储在预配置的AWS S3存储空间中。这些快照会保留14天,无需额外付费。此外,还可以使用这些快照来恢复域,但是这些自动快照不能被迁移到新域。如果要迁移,必须使用存储在自己的存储库(S3存储空间)中的手动快照。手动快照将收取标准S3费用。
所以,我们很有必要建立手动快照,来帮助我们完成定时数据备份,数据恢复或ES迁移等活动。本文主要讲解手动快照的建立流程和方案~

方案架构

AWS Elasticsearch Service 建立snapshot

构建 snapshot 流程

官方文档,写的不太好~

在AWS中创建手动快照的前提条件

创建AWS S3存储空间

这里创建的名字是ai-voice-test-snapshot,该值后面在策略和脚本中会用到。

AWS Elasticsearch Service 建立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

打印信息如下:

AWS Elasticsearch Service 建立snapshot

其他命令

# 获取所有repositories:
GET /_snapshot/_all?pretty
# 获取某个仓库下的快照信息
GET /_snapshot/es-snapshot-repo/_all?pretty

参考文档

上一篇:nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题


下一篇:「SequoiaDB巨杉数据库」SQL语法-监控视图之$SNAPSHOT_CATA