在 Amazon OpenSearch 服務中創建索引快照 - Amazon OpenSearch 服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon OpenSearch 服務中創建索引快照

Amazon OpenSearch 服務中的快照是叢集索引和狀態的備份。狀態包含叢集設定、節點資訊、索引設定和碎片分配。

OpenSearch 服務快照有下列形式:

  • 自動快照僅適用叢集復原。如果發生紅色叢集狀態或資料遺失,您可以使用它們來還原您的網域。如需詳細資訊,請參閱下方的還原快照。 OpenSearch 服務可將自動快照存放在預先設定的 Amazon S3 儲存貯體中,無需額外付費。

  • 手動快照適用於叢集復原,或者將資料從一個叢集移至另一個叢集。您必須初始化手動快照。這些快照會存放在您自己的 Simple Storage Service (Amazon S3) 儲存貯體中,而且需支付標準 S3 費用。如果您有來自自我管理 OpenSearch 叢集的快照,則可以使用該快照移轉至 OpenSearch 服務網域。如需詳細資訊,請參閱移轉至 Amazon OpenSearch 服務

所有 OpenSearch 服務網域都會建立自動快照,但頻率在下列方面有所不同:

  • 對於執行中的網域 OpenSearch 或 Elasticsearch 5.3 及更新版本, OpenSearch 服務會每小時擷取每小時自動快照,並保留最多 336 個快照,持續 14 天。由於每小時快照的增量改進性質,所以中斷較少。在發生網域問題時,它們還提供較新的復原點。

  • 對於執行 Elasticsearch 5.1 及更早版本的網域, OpenSearch 服務會在您指定的小時內擷取每日自動快照,最多可保留 14 個快照,而且不會保留任何快照資料超過 30 天。

如果您的叢集進入紅色狀態,所有自動快照都會失敗,而叢集狀態會持續存在。如果您未在兩週內修正該問題,則可能會永久遺失叢集中的資料。如需疑難排解步驟,請參閱紅色叢集狀態

必要條件

若要手動建立快照,您必須使用 IAM 和 Simple Storage Service (Amazon S3)。嘗試拍攝快照之前,請先確認符合以下先決條件:

先決條件 描述
S3 儲存貯體

建立 S3 儲存貯體以存放 OpenSearch 服務網域的手動快照。如需指示說明,請參閱 Amazon Simple Storage Service 使用者指南中的建立儲存貯體

請記住儲存貯體的名稱以在下列位置使用它:

  • 連接至您 IAM 角色的 IAM 政策的 Resource 陳述式

  • 用於註冊快照儲存庫的 Python 用戶端 (如果您使用此方法)

重要

請勿將 S3 Glacier 生命週期規則套用至此儲存貯體。手動快照不支援 S3 Glacier 儲存類別。

IAM 角色

建立 IAM 角色以將許可委派給 OpenSearch 服務。如需說明,請參閱 IAM 使用者指南中的建立 IAM 角色 (主控台)。本章其餘各節稱此角色為 TheSnapshotRole

連接 IAM 政策

將下列政策連接至 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陳述式中指定 OpenSearch Service,如下列範例所示:

{ "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"}

註冊手動快照儲存庫

您必須先向 OpenSearch Service 註冊快照儲存庫,才能建立手動索引快照。這項一次性作業會要 AWS 求您使用允許存取的認證來簽署要求TheSnapshotRole,如中所述必要條件

步驟 1:在 OpenSearch 儀表板中對應快照角色 (如果使用精細的存取控制)

精細存取控制會在註冊儲存庫時進行額外的步驟。即使您將 HTTP 基本身分驗證用於所有其他目的,您也需要將 manage_snapshots 角色映射至擁有 iam:PassRole 許可能夠傳遞 TheSnapshotRole 的 IAM 角色。

  1. 導覽至 OpenSearch 服務網域的 OpenSearch 儀表板外掛程式。您可以在 OpenSearch 服務主控台上的網域儀表板上找到儀表板端點。

  2. 從主選單中選擇 Security (安全性)、Roles (角色),然後選取 manage_snapshots 角色。

  3. 選擇 Mapped users (已映射的使用者)、Manage mapping (管理映射)。

  4. 新增擁有許可傳遞 TheSnapshotRole 之角色的 ARN。將角色 ARN 放在 Backend roles (後端角色) 下。

    arn:aws:iam::123456789123:role/role-name
  5. 選擇 Map (映射),並確認使用者或角色顯示在 Mapped users (已映射的使用者) 中。

步驟 2:註冊儲存庫

下列 [快照] 索引標籤示範如何註冊快照目錄。如需在移轉至新網域後加密手動快照和註冊快照的特定選項,請參閱相關索引標籤。

Snapshots

若要註冊快照存放庫,請將 PUT 要求傳送至 OpenSearch 服務網域端點。您可以使用 curlPython 用戶端範例郵遞員或其他方法來傳送已簽署的要求來註冊快照儲存庫。請注意,您無法在 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 服務域,請https://your-vpc-domain.region.es.amazonaws.com在 Web 瀏覽器中導航到並確認您收到默認的 JSON 響應。

當 Amazon S3 儲存貯體位於 OpenSearch網域以 AWS 區域 外的其他儲存貯體時,請將參數新增"endpoint": "s3.amazonaws.com"至請求。

Encrypted snapshots

您目前無法使用 AWS Key Management Service (KMS) 金鑰加密手動快照,但可以使用伺服器端加密 (SSE) 來保護它們。

若要針對您用作快照儲存庫的儲存貯體開啟 SSE (含 S3 代管金鑰),請新增"server_side_encryption": true至 PUT 要求的"settings"區塊。如需詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南中的使用具有 Simple Storage Service (Amazon S3) 管理的加密金鑰的伺服器端加密保護資料

或者,您可以在用作快照儲存庫的 S3 儲存貯體上使用 AWS KMS 金鑰進行伺服器端加密。如果您使用此方法,請確保提供對用於加密 S3 儲存貯體的 AWS KMS 金鑰的TheSnapshotRole權限。如需詳細資訊,請參閱 AWS KMS中的金鑰政策

Domain migration

註冊快照儲存庫是一次性操作。但要從一個網域遷移到另一個網域,必須在舊網域和新網域上註冊相同的快照儲存庫。儲存庫名稱是任意的。

遷移至新網域或註冊具有多個網域的相同儲存庫時,請考慮下列準則:

  • 在新網域上註冊儲存庫時,請將 "readonly": true 新增至 PUT 請求的 "settings" 區塊。此設定可防止您意外地從舊網域中覆寫資料。只有一個網域應具有儲存庫的寫入存取權。

  • 如果您要將資料遷移到另一個網域 (例如 AWS 區域,從 us-east-2 中的舊網域和值區移轉至 us-west-2 中的新網域),請在 PUT 陳述式"endpoint": "s3.amazonaws.com"中取代"region": "region"為,然後重試要求。

使用 Python 用戶端範例

Python 用戶端比簡單的 HTTP 請求更容易自動化,並且具有更好的可重複使用性。如果您選擇使用此方法來註冊快照儲存庫,請將下列範例 Python 程式碼儲存為 Python 檔案,例如 register-repo.py。用戶端需要 AWS SDK for Python (Boto3)請求requests-aws4auth 套件。用戶端包含其他快照操作的註解範例。

更新範本程式碼中的下列變數:hostregionpath 以及 payload

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 請求,請參閱入門教程

如果您的存取原則指定使用者或角色,則必須簽署快照請求。對於捲曲,您可以使用 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 Service 網域中的一或多個索引。您無法將索引的快照還原到已包含具有相同名稱之索引的 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'

    或者,您可能想要還原所有索引,Dashboards 和精細存取控制索引除外

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

    您可以使用rename_patternrename_replacement參數還原快照,而不刪除其資料。如需這些參數的詳細資訊,請參閱 OpenSearch 文件中的還原快照 API 求欄位和範例要求

注意

如果不是所有涉及的索引都有主要碎片,快照可能一個 statePARTIAL。此值表示至少一個碎片的資料未成功儲存。您仍然可以從部分快照還原,但您可能需要使用舊版的快照來還原任何遺失的索引。

刪除手動快照

若要刪除手動快照,請執行以下命令:

DELETE _snapshot/repository-name/snapshot-name

使用快照管理自動化快照

您可以在 OpenSearch 儀表板中設定快照管理 (SM) 原則,以自動定期建立和刪除快照。SM 可以快照一組索引,而索引狀態管理只能為每個索引拍攝一個快照。若要在 OpenSearch 服務中使用 SM,您需要註冊自己的 Amazon S3 儲存庫。如需註冊儲存庫的指示,請參閱註冊手動快照儲存庫

在 SM 之前, OpenSearch 服務提供了免費的自動快照功能,依預設為開啟狀態。此功能會將快照傳送至服務維護的cs-*儲存庫。要停用該功能,請聯繫到 AWS Support。

如需 SM 功能的詳細資訊,請參閱 OpenSearch 文件中的快照管理

SM 目前不支援在多個索引類型上建立快照集。例如,如果您嘗試在具有多個索引上建立快照,*而某些索引位於暖層,則快照建立將會失敗。如果您需要快照包含多個索引類型,請使用 ISM 快照動作,直到 SM 支援此選項為止。

設定許可

如果您要從先前的 OpenSearch Service 網域版本升級到 2.5,則網域上可能不會定義快照管理安全性權限。非管理員使用者必須對應至此角色,才能使用精細的存取控制在網域上使用快照管理。若要手動建立快照管理角色,請執行下列步驟:

  1. 在 OpenSearch 儀表板中,轉到安全性,然後選擇權限

  2. 選擇 Create action group (建立動作群組) 並設定下列群組:

    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. 選擇 Roles (角色),然後選擇 Create role (建立角色)。

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

  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,則必須使用版本 7.13.4 或更早版本的舊版 elasticsearch-py 用戶端。不支援 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