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

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

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

Amazon S OpenSearch ervice 中的快照是集群索引和状态的备份。状态包含集群设置、节点信息、索引设置和分片分配。

OpenSearch 服务快照有以下形式:

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

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

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

  • 对于运行 OpenSearch 或 Elasticsearch 5.3 及更高版本的域名,S OpenSearch ervice 会按小时自动拍摄快照,并将其中最多 336 张快照保留 14 天。由于其增量性质,每小时快照的破坏性较小。如果出现域问题,它们还提供更新的恢复点。

  • 对于运行 Elasticsearch 5.1 及更早版本的域名,S OpenSearch ervice 会在您指定的时间内每天自动拍摄快照,最多保留 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以在Principal语句中指定 S OpenSearch ervice,如以下示例所示:

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

有关编辑信任关系的说明,请参阅 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"}

注册手动快照存储库

您需要先向 S OpenSearch ervice 注册快照存储库,然后才能手动拍摄索引快照。此一次性操作要求您使用允许访问的凭据签署 Amazon 请求TheSnapshotRole,如中所述先决条件

步骤 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

要注册快照存储库,请向 OpenSearch 服务域端点发送 PUT 请求。您可以使用 curl示例 Python 客户端Postman 或某种其他方式发送已签名请求以注册快照存储库。请注意,您不能在控制 OpenSearch 面板控制台中使用 PUT 请求来注册存储库。

此请求采用以下形式:

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

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

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

当您的 Amazon S3 存储桶位于 Amazon Web Services 区域 其他 OpenSearch域中时,请将参数"endpoint": "s3.amazonaws.com"添加到请求中。

Encrypted snapshots

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

要为您用作快照存储库的存储桶启用使用 S3 托管密钥的 SSE,请将 "server_side_encryption": true 添加到 PUT 请求 "settings" 数据块。有关更多信息,请参阅 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" 替换为 PUT 语句中的 "endpoint": "s3.amazonaws.com",然后重试请求。

使用示例 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 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", "base_path": "my/snapshot/directory", "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,您可以在 7.75.0 或更高版本中使用 --aws-sigv4 选项。您也可以使用示例 Python 客户端中的带注释示例将签名 HTTP 请求置于 curl 命令使用的同一端点。

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

  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 参数,即可在不删除快照数据的情况下恢复快照。有关这些参数的更多信息,请参阅 OpenSearch 文档中的恢复快照 API 请求字段和示例请求

注意

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

删除手动快照

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

DELETE _snapshot/repository-name/snapshot-name

使用快照管理自动处理快照

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

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

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

SM 目前不支持基于多种索引类型创建快照。例如,如果尝试基于多个包含 * 的索引创建快照且部分索引位于暖层,则快照创建将失败。如果需要快照包含多种索引类型,请使用 ISM 快照操作,直到 SM 支持此选项。

配置 权限

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

  1. 在 “ OpenSearch 控制面板” 中,转至 “安全”,然后选择 “权限”。

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

    组名 权限
    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. 将角色命名为 snapshot_management_role

  5. 对于集群权限,选择 snapshot_management_full_accesssnapshot_management_read_access

  6. 选择 创建

  7. 创建角色之后,将其映射到将管理快照的任何用户或后端角色。

注意事项

配置快照管理时,请考虑以下事项:

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

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

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

  • 只有完成上一个快照操作后才能开始下一个快照操作,因此无法通过一项策略激活并发快照操作。

  • 如果多个策略采用相同的计划,可能会导致资源激增。如果策略的快照索引重叠,则只能按顺序运行分片级别快照操作,因而可能引发级联性能问题。如果多个策略共享一个存储库,则该存储库的写入操作将激增。

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

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

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

要在 OpenSearch 服务中使用 SM,您需要注册自己的 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