在亚马逊中创建索引快照OpenSearch服务 - 亚马逊OpenSearch服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊中创建索引快照OpenSearch服务

亚马逊的快照OpenSearch服务是集群索引和状态的备份。状态包含集群设置、节点信息、索引设置和分片分配。

OpenSearch服务快照有以下几种形式:

  • 自动快照仅用于集群恢复。在发生红色群集状态或数据丢失时,您可以使用它们还原域。有关更多信息,请参阅恢复快照。OpenSearch服务将自动快照存储在预先配置的 Amazon S3 存储桶中,无需额外付费。

  • 手动快照用于集群恢复或者将数据从一个集群移动到另一个集群。必须启动手动快照。这些快照将存储在您自己的 Amazon S3 存储桶中,收取标准 S3 费用。如果您有自管的快照OpenSearch集群,您可以使用该快照迁移到OpenSearch服务域。有关更多信息,请参见迁移到亚马逊OpenSearch服务

全部OpenSearch服务域会自动拍摄快照,但频率在以下方面有所不同:

  • 适用于正在运行的域名OpenSearch或者是 Elasticsearch 5.3 及更OpenSearch该服务每小时拍摄一次自动快照,最多可保留 336 个快照 14 天。由于其增量性质,每小时快照的破坏性较小。如果出现域问题,它们还提供更新的恢复点。

  • 对于运行 Elasticsearch 5.1 及更早版本的域OpenSearch服务会在您指定的时间内每天自动拍摄快照,最多保留 14 张快照,并且保留任何快照数据的时间不超过 30 天。

如果您的集群进入红色状态,则所有自动快照都会失败,而集群状态仍然存在。如果您在两周内未解决问题,则可能会永久丢失集群内的数据。有关问题排查步骤,请参阅红色集群状态

先决条件

要手动创建快照,您必须使用 IAM 和 Amazon S3。确保您已满足以下先决条件,然后再尝试创建快照。

先决条件 描述
S3 存储桶

创建 S3 存储桶来存储您的手动快照OpenSearch服务域。有关说明,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶

记住要在以下位置使用它的存储桶名称:

  • 附加到 IAM 角色的 IAM policy 的 Resource 语句

  • 用于注册快照存储库的 Python 客户端(如果使用此方法)

重要

请勿对此存储桶应用 S3 Glacier 生命周期规则。手动快照不支持 S3 Glacier 存储类。

IAM 角色

创建向其委派权限的 IAM 角色OpenSearch服务。有关说明,请参阅 IAM 用户指南中的创建 IAM 角色(控制台)。本章剩余部分将此角色称为 TheSnapshotRole

附加 IAM policy

将下面的策略附加到 TheSnapshotRole 以允许访问 S3 存储桶:

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

有关附加托管策略的说明,请参阅 IAM 用户指南中的添加 IAM 身份权限

编辑信任关系

编辑的信任关系TheSnapshotRole具体说明OpenSearch中的服务Principal语句如以下示例所示:

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

建议您使用 aws:SourceAccountaws:SourceArn 条件键来防止出现混淆代理人问题。源帐户是域的所有者,并且源 ARN 是域的 ARN。您的域必须在服务软件 R20211203 或更高版本上才能添加这些条件键。

例如,您可以将以下条件块添加到信任策略:

"Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name" } }

有关编辑信任关系的说明,请参阅 IAM 用户指南中的修改角色信任策略

权限

要注册快照存储库,你需要能够通过TheSnapshotRole到OpenSearch服务。还需要对 es:ESHttpPut 操作的访问权限。要授予这两个权限,请将以下策略附加到 IAM 角色,该角色的凭据用于签署请求:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/TheSnapshotRole" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

如果你的用户或角色没有iam:PassRole通行权限TheSnapshotRole,当你在下一步尝试注册存储库时,可能会遇到以下常见错误:

$ python register-repo.py {"Message":"User: arn:aws:iam::123456789012:user/MyUserAccount is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789012:role/TheSnapshotRole"}

注册手动快照存储库

您需要向注册快照存储库OpenSearch在手动拍摄索引快照之前进行维修。此一次性操作需要使用允许访问 TheSnapshotRole 的凭证签发 Amazon 请求,如 先决条件 中所述。

步骤 1:在中映射快照角色OpenSearch仪表板(如果使用细粒度访问控制)

注册存储库时,精细访问控制会引入额外的步骤。即使将 HTTP 基本身份验证用于所有其他目的,也需要将 manage_snapshots 角色映射到具有传递 TheSnapshotRoleiam:PassRole 权限的 IAM 角色。

  1. 导航到OpenSearch适用于您的仪表板插件OpenSearch服务域。您可以在域控制面板上找到仪表板终端节点OpenSearch服务控制台。

  2. 从主菜单中选择安全角色,然后选择 manage_snapshots 角色。

  3. 选择映射的用户管理映射

  4. 添加具有传递 TheSnapshotRole 权限的角色的 ARN。将角色 ARN 置于 Backend roles(后端角色)下。

    arn:aws:iam::123456789123:role/role-name
  5. 选择映射并确认在映射的用户下显示的用户或角色。

第 2 步:注册存储库

以下快照选项卡演示了如何注册快照目录。有关在迁移到新域后加密手动快照和注册快照的特定选项,请参阅相关选项卡。

Snapshots

要注册快照存储库,请向 PUT 发送请求OpenSearch服务域终端节点。你可以使用卷曲,那个Python 客户端邮差,或其他发送已签名请求以注册快照存储库的方法。请注意,您不能在 Kibana 控制台中使用 PUT 请求来注册存储库。

此请求采用以下形式:

PUT domain-endpoint/_snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "s3-bucket-name", "region": "region", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } }
注意

存储库名称不能以“cs-”开头。此外,您不应该从多个域写入同一个存储库。应该只有一个域具有对存储库的写入权限。

如果域位于某个 Virtual Private Cloud(VPC)中,则必须将您的电脑连接到该 VPC,请求才能成功注册快照存储库。访问 VPC 因网络配置而异,但很可能包括连接到 VPN 或企业网络。要检查您是否可以到达OpenSearch服务域,导航到https://your-vpc-domain.region.es.amazonaws.com在 Web 浏览器中验证您是否收到默认 JSON 响应。

当您的 Amazon S3 存储桶位于另一个存储桶时Amazon Web Services 区域比你的OpenSearch域,替换"region"参数为"endpoint": "s3.amazonaws.com"

Encrypted snapshots

您目前无法使用 Amazon Key Management Service (KMS) 密钥对手动快照进行加密,但您可以使用服务器端加密 (SSE) 对它们进行保护。

要为您用作快照存储库的存储桶启用带有 S3 托管密钥的 SSE,请添加"server_side_encryption": true"settings"PUT 请求的阻止。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南中的使用采用 Amazon S3 托管加密密钥的服务器端加密保护数据。

您也可以使用 Amazon KMS 密钥对您用作快照存储库的 S3 存储桶进行服务器端加密。如果您使用此方法,请务必为用于加密 S3 存储桶的 Amazon KMS 密钥提供 TheSnapshotRole 权限。有关更多信息,请参阅Amazon KMS 中的密钥策略

Domain migration

注册快照存储库是一次性操作。但要从一个域迁移到另一个域,您必须在旧域和新域中注册相同的快照存储库。存储库名称是任意的。

迁移到新域或使用多个域注册同一存储库时,请考虑以下准则:

  • 在新域中注册存储库时,将 "readonly": true 添加到"settings" PUT 请求数据库。此设置可防止您意外覆盖旧域中的数据。应该只有一个域具有对存储库的写入权限。

  • 如果您要将数据迁移到其他域中Amazon Web Services 区域,(例如,从 us-east-2 中的旧域和存储桶到 us-west-2 中的新域),替换"region": "region""endpoint": "s3.amazonaws.com"在 PUT 语句中重试请求。

使用示例 Python 客户端

Python 客户端比简单的 HTTP 请求更容易自动化,并且具有更好的可重用性。如果您选择使用此方法注册快照存储库,请将下面的示例 Python 代码保存为 Python 文件,如 register-repo.py。客户端需要 Amazon SDK for Python (Boto3)requestsrequests-aws4auth 程序包。客户端包含其他快照操作的带注释示例。

更新示例代码中的以下变量:hostregionpathpayload

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # domain endpoint with trailing / region = '' # 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/my-snapshot-repo-name' # the OpenSearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "s3-bucket-name", "region": "us-west-1", "role_arn": "arn:aws:iam::123456789012:role/snapshot-role" } } headers = {"Content-Type": "application/json"} r = requests.put(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text) # # Take snapshot # # path = '_snapshot/my-snapshot-repo-name/my-snapshot' # url = host + path # # r = requests.put(url, auth=awsauth) # # print(r.text) # # # Delete index # # path = 'my-index' # url = host + path # # r = requests.delete(url, auth=awsauth) # # print(r.text) # # # Restore snapshot (all indexes except Dashboards and fine-grained access control) # # path = '_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security,-.opendistro-*", # "include_global_state": False # } # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text) # # # Restore snapshot (one index) # # path = '_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = {"indices": "my-index"} # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text)

手动创建快照

快照不是即时发生的。它们需要时间才能完成,并不代表完美point-in-time集群的视图。当快照正在进行时,您仍可以对文档编制索引并对集群发出其他请求,但新文档(和对现有文档的更新)通常不包含在快照中。快照包含 OpenSearch 启动快照时存在的主分片。根据快照线程池的大小,快照中可能包含时间略有不同的不同分片。

快照存储和性能

OpenSearch快照是增量的,这意味着它们仅存储自上次成功快照以来发生变化的数据。此增量性质意味着频繁快照与不频繁快照之间的磁盘使用率差异通常极其小。换句话说,一周内每小时快照(总共 168 个快照)占用的磁盘空间比一周结束时的一个快照所占用的磁盘空间并不高多少。此外,拍摄快照的频率越高,完成快照所需的时间就更少。例如,每日快照可能需要 20-30 分钟才能完成,而每小时快照可能在几分钟内即可完成。一些 OpenSearch 用户每半小时拍摄一次快照。

拍摄快照

创建参数时,您需要指定以下信息:

  • 快照存储库的名称

  • 快照名称

为了方便和简洁起见,本章中的示例使用 curl,这是一种常见的 HTTP 客户端。要向 curl 请求传递用户名和密码,请参见入门教程

如果您的访问策略指定了用户或角色,则必须签署快照请求。对于 curl,你可以使用--aws-sigv4选项使用版本 7.75.0 或更高版本。你也可以使用中注释过的示例Python 客户端向 curl 命令使用的相同端点发出签名的 HTTP 请求。

要制作手动快照,请执行以下步骤:

  1. 如果当前正在制作快照,则您无法制作快照。要进行检查,请运行以下命令:

    curl -XGET 'domain-endpoint/_snapshot/_status'
  2. 运行以下命令来手动创建快照:

    curl -XPUT 'domain-endpoint/_snapshot/repository-name/snapshot-name'

    要包括或排除某些索引并指定其他设置,请添加请求正文。有关请求结构,请参见拍快照在OpenSearch文档。

注意

拍摄快照所需的时间会随着快照的大小而增加OpenSearch服务域。长时间运行的快照操作有时会遇到以下错误:504 GATEWAY_TIMEOUT。通常情况下,您可以忽略这些错误并等待操作成功完成。运行以下命令验证您的域中所有快照的状态:

curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'

还原快照

警告

如果您使用索引别名,则应停止对别名的写入请求,或者在删除别名的索引之前将别名切换到另一个索引。停止写入请求有助于避免以下情景:

  1. 您删除某个索引,同时会删除它的别名。

  2. 对于现已删除的别名的错误写入请求会创建一个与别名同名的新索引。

  3. 由于与新索引的命名冲突,您无法再使用别名。如果将别名切换到其他索引,请在从快照中还原时指定 "include_aliases": false

要还原快照,请执行以下步骤:

  1. 确定要还原的快照。确保此索引的所有设置,例如自定义分析器包或分配要求设置,都与域兼容。要查看所有快照存储库,请运行以下命令:

    curl -XGET 'domain-endpoint/_snapshot?pretty'

    在确定存储库后,您可以运行以下命令查看所有快照:

    curl -XGET 'domain-endpoint/_snapshot/repository-name/_all?pretty'
    注意

    大多数自动快照存储在 cs-automated 存储库中。如果您的域对静态数据进行加密,这些快照将存储在 cs-automated-enc 存储库中。如果您没有看到要查找的手动快照存储库,请确保您已向域注册该存储库。

  2. (可选)删除或重命名中的一个或多个索引OpenSearch如果群集上的索引与快照中的索引之间存在命名冲突,则为服务域。您无法将索引的快照还原到OpenSearch已经包含同名索引的集群。

    如果索引命名冲突,您可以使用以下选项:

    • 删除现有索引OpenSearch服务域,然后还原快照。

    • 从快照还原索引时为其重命名,之后为它们重新编制索引。

    • 将快照还原到不同的快照OpenSearch服务域(只能使用手动快照)。

    以下命令将删除域中的所有现有索引:

    curl -XDELETE 'domain-endpoint/_all'

    但是,如果您不打算还原所有索引,则可以仅删除一个索引:

    curl -XDELETE 'domain-endpoint/index-name'
  3. 要还原快照,请运行以下命令:

    curl -XPOST 'domain-endpoint/_snapshot/repository-name/snapshot-name/_restore'

    由于有特殊权限OpenSearch仪表板和精细访问控制索引,尝试恢复所有索引可能会失败,尤其是当您尝试从自动快照中恢复时。以下示例通过 my-index 快照存储库中的 2020-snapshot 来只还原一个索引 cs-automated

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' \ -d '{"indices": "my-index"}' \ -H 'Content-Type: application/json'

    您还可能需要还原控制面板和精细访问控制索引以外的所有索引:

    curl -XPOST 'domain-endpoint/_snapshot/cs-automated/2020-snapshot/_restore' \ -d '{"indices": "-.kibana*,-.opendistro*"}' \ -H 'Content-Type: application/json'

    您可以使用在不删除快照数据的情况下恢复快照rename_patternrename_replacement参数。有关这些参数的更多信息,请参阅还原快照 API请求字段示例请求在OpenSearch文档。

注意

如果并非所有主分片都适用于涉及的索引,则快照的 state 可能为 PARTIAL。此值表示未成功存储至少一个分片中的数据。您仍可以从部分快照进行还原,但可能需要使用较旧的快照来还原任何缺失的索引。

删除手动快照

要删除手动快照,运行下列命令:

DELETE _snapshot/repository-name/snapshot-name

使用快照管理自动生成快照

您可以在中设置快照管理 (SM) 策略OpenSearch用于自动定期创建和删除快照的仪表板。SM 可以快照一组索引,而索引状态管理每个索引只能拍摄一个快照。要在 SM 中使用 SMOpenSearch服务,您需要注册自己的 Amazon S3 存储库。有关注册存储库的说明,请参阅注册手动快照存储库

在 SM 之前,OpenSearch该服务提供了免费的自动快照功能,该功能在默认情况下仍处于启用状态。此功能将快照发送到服务维护的服务器cs-*存储库。要停用该功能,请联系Amazon Web Services Support。

有关 SM 功能的更多信息,请参见快照管理在OpenSearch文档。

SM 目前不支持在多种索引类型上创建快照。例如,如果您尝试使用以下方法在多个索引上创建快照*还有一些指数在温暖等级,快照创建将失败。如果您需要快照包含多种索引类型,请使用ISM 快照操作直到 SM 支持此选项。

配置权限

如果你要从以前的版本升级到 2.5OpenSearch服务域版本,可能未在域上定义快照管理安全权限。必须将非管理员用户映射到此角色,才能使用细粒度访问控制在域上使用快照管理。要手动创建快照管理角色,请执行以下步骤:

  1. 在OpenSearch仪表板,转至安全然后选择权限

  2. 选择创建操作组并配置以下组:

    Group name 权限
    snapshot_management_full_access
    • cluster:admin/opensearch/snapshot_management/*

    • cluster:admin/opensearch/notifications/feature/publish

    • cluster:admin/repository/*

    • cluster:admin/snapshot/*

    snapshot_management_read_access
    • cluster:admin/opensearch/snapshot_management/policy/get

    • cluster:admin/opensearch/snapshot_management/policy/search

    • cluster:admin/opensearch/snapshot_management/policy/explain

    • cluster:admin/repository/get

    • cluster:admin/snapshot/get

  3. 选择角色创建角色

  4. 为角色命名快照管理角色

  5. 对于集群权限,选择snapshot_management_full_access要么snapshot_management_read_access

  6. 选择创建

  7. 创建角色后,绘制地图分配给任何将管理快照的用户或后端角色。

注意事项

配置快照管理时请考虑以下几点:

  • 每个存储库允许一个策略。

  • 一个策略最多允许 400 个快照。

  • 如果您的域名状态为红色、JVM 压力过高(85% 或以上)或快照功能停滞,则此功能将无法运行。当集群的整体索引和搜索性能受到影响时,SM 也可能受到影响。

  • 快照操作仅在上一个操作完成后才开始,因此一个策略不会激活任何并发快照操作。

  • 具有相同时间表的多个策略可能会导致资源峰值。如果策略的快照索引重叠,则分片级别的快照操作只能按顺序运行,这可能会导致级联性能问题。如果策略共享一个存储库,则对该存储库的写入操作将达到峰值。

  • 我们建议您将快照操作自动化设置为每小时不超过一次,除非您有特殊用例。

使用索引状态管理自动执行快照

您可以使用索引状态管理(ISM)snapshot 操作,以根据索引的年龄、大小或文档数量的变化自动触发索引快照。当您需要每个索引一个快照时,ISM 是最佳选择。如果您需要对一组索引进行快照,请参见使用快照管理自动生成快照

要在 SM 中使用 SMOpenSearch服务,您需要注册自己的 Amazon S3 存储库。有关使用snapshot操作的 ISM 示例,请参阅示例策略

将 Curator 用于快照

如果 ISM 不适用于索引和快照管理,则可以改用 Curator。它提供了高级筛选功能,可帮助简化复杂集群上的任务。使用 pip 安装 Curator:

pip install elasticsearch-curator

您可以使用 Curator 作为命令行界面 (CLI) 或 Python API。如果您使用 Python API,则必须使用旧式 elasticsearch-py 客户端的版本 7.13.4 或更早版本。它不支持 opensearch-py 客户端。

如果您使用 CLI,请在命令行处导出您的凭证并配置 curator.yml,如下所示:

client: hosts: search-my-domain.us-west-1.es.amazonaws.com port: 443 use_ssl: True aws_region: us-west-1 aws_sign_request: True ssl_no_validate: False timeout: 60 logging: loglevel: INFO