建立Amazon ES索引快照 - Amazon Elasticsearch Service

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

建立Amazon ES索引快照

快照是 Amazon Elasticsearch Service (Amazon ES) 叢集的索引和狀態的備份。狀態包含叢集設定、節點資訊、索引設定和碎片分配。

Amazon ES 快照有兩種形式:自動和手動。

  • 自動快照僅適用叢集復原。當叢集狀態為紅色或資料遺失時,您可以使用它們來還原您的網域。如需詳細資訊,請查看以下 Restoring Snapshots (還原快照)。 會將自動快照Amazon ES儲存在預先設定的 Amazon S3 儲存貯體中,無需額外付費。

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

所有 Amazon ES 網域都會建立自動快照,但頻率會以下列方式不同:

  • 對於執行 5.3 Elasticsearch 版和更新版本的網域, Amazon ES 會每隔 1 小時自動拍攝快照,且最多可保留其中 336 個快照 (連續保留 14 天)。

  • 對於執行 5.1 版和更早Elasticsearch版本的網域, 會每隔一小時Amazon ES自動拍攝您指定時的快照,並保留最多 14 個快照 (最多 30 天)。

如果您的叢集進入紅色狀態,Amazon ES 會停止取得自動快照。如果您在兩星期後仍未修正問題,您可能會永久遺失 叢集中的資料。如需故障診斷步驟,請參閱紅色叢集狀態

手動快照先決條件

若要手動建立快照,您需要使用 IAM 和 Amazon S3。在您嘗試拍攝快照之前,請確定您符合以下事前準備:

必要條件 描述
S3 儲存貯體

建立 S3 儲存貯體來為您的Amazon ES網域存放手動快照。如需詳細資訊,請參閱 http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html 中的 Amazon Simple Storage Service 入門指南建立儲存貯體

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

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

  • 用來登記快照儲存庫的 Python 使用者端 (如果您使用此方法)

重要

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

IAM 角色

建立 IAM 角色以將許可委派給 Amazon Elasticsearch Service。如需指示,請前往 中的建立 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/*" ] } ] }

如需將政策連接至角色的指示,請前往 中的 Adding IAM Identity Permissions (新增 IAM 身分許可IAM 使用者指南)。

編輯信任關係

編輯 的信任關係TheSnapshotRole,以在 Amazon ES 陳述式Principal中指定 ,如以下範例所示:

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

如需編輯信任關係的指示,請前往 中的修改角色信任政策IAM 使用者指南

許可

若要登記快照儲存庫,您需要將 傳遞給 TheSnapshotRole Amazon ES。您也需要存取 es:ESHttpPut 動作。若要同時授予這些許可,請將下列政策新增至您使用 簽署請求的角色:

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

註冊手動快照儲存庫

您需要向 登記快照儲存庫Amazon ES,才能建立手動索引快照。這個一次性操作需要您使用可用於存取 TheSnapshotRole 的登入資料簽署 AWS 請求,如手動快照先決條件所述。

步驟 1:映射 manage_snapshots 角色 (如果使用精細存取控制)

精細存取控制在登記儲存庫時引入了額外的步驟。即使您將 HTTP 基本身份驗證用於其他所有用途,您必須將manage_snapshots角色映射到具有傳遞 iam:PassRole 之許可的 IAM 角色TheSnapshotRole

  1. 導覽至網域的 Kibana Amazon ES plugin。您可以在 Amazon ES 主控台的網域儀表板上尋找 Kibana 端點。

  2. 打開主選單,然後選擇 Security (安全性),然後選擇 Roles (角色)。

  3. 搜尋並選取manage_snapshots角色。

  4. 前往 Mapped users (映射的使用者) 標籤,然後選擇 Manage mapping (管理映射)。

  5. Backend roles (後端角色) 下,新增具有傳遞 許可之角色的網域 TheSnapshotRoleARN。ARN 的格式如下:

    arn:aws:iam::123456789123:role/role-name
  6. 選取 Map (對應) 並確認在 Mapped users (對應使用者) 下顯示該角色。

步驟 2:登記儲存庫

若要登記快照儲存庫,請將 PUT 請求傳送至Amazon ES網域端點。您無法使用 curl 執行此項操作,因為它不支援 AWS 請求簽署。反而,您應使用範例 Python 用戶端Postman 或其他方式傳送已簽署的請求,以註冊快照儲存庫。

請求的格式如下:

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

如果您的網域位於 VPC 中,您的電腦必須連接到 VPC,請求才能成功登記快照儲存庫。存取 VPC 因網路組態而異,但可能牽涉到連線 VPN 或公司網路。若要確認您可以連上 Amazon ES 網域,請在 Web 瀏覽器中導覽至 https://your-vpc-domain.region.es.amazonaws.com,並確認您接收預設的 JSON 回應。

加密快照儲存庫

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

若要讓做為快照儲存庫儲存貯體的 SSE 搭配 S3 受管金鑰"server_side_encryption": true,請將 新增至 PUT 請求的 "settings" 區塊。如需詳細資訊,請查看《Amazon Simple Storage Service 使用者指南》中的使用伺服器端加密搭配 Amazon S3 受管加密金鑰保護資料。

或者,您可以在用作快照儲存庫的 S3 儲存貯體上使用伺服器端加密 customer master keys (CMKs) 進行伺服器端加密。

將資料遷移到不同的網域

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

遷移到新網域,或基於另一個原因使用多個網域登記相同的儲存庫時,請考慮下列準則:

  • 在新網域上登記儲存庫時,請將 "readonly": true 新增到 PUT 請求的 "settings" 區塊。此設定可防止您意外覆寫舊網域中的資料。

  • 如果您要將資料遷移到不同區域中的網域 (例如,從舊網域和位於 us-east-2 的儲存貯體到 us-west-2 中的新網域),傳送 PUT 請求時可能會看到此 500 錯誤:

    The bucket is in this region: us-east-2. Please use this region to retry the request.

    如果發生此問題,請嘗試在 PUT 陳述式"region": "us-east-2""endpoint": "s3.amazonaws.com"將 取代為 ,然後重試請求。

使用範例 Python client

相較於簡單的 HTTP 請求,Python Client 自動化較為容易,而且可重複使用性也更佳。如果您選擇使用此方法來登記快照儲存庫,請將以下範例 Python 程式碼儲存為 Python 檔案,例如 register-repo.py。使用者需要 適用於 Python 的 AWS 開發套件 (Boto3)請求requests-aws4auth 套件。用戶端包含其他快照操作的註解範例。

提示

以 Java 為基礎的程式碼範例,請參閱簽署 HTTP 請求

更新範本程式碼中的下列變數host:、、 regionpath payload

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # include https:// and 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 Elasticsearch API endpoint url = host + path payload = { "type": "s3", "settings": { "bucket": "s3-bucket-name", "region": "us-west-1", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } } 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/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 indices except Kibana and fine-grained access control) # # path = '_snapshot/my-snapshot-repo/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security", # "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/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)

手動拍攝快照

快照不是即時的。需要一些時間才能完成,並且它們不代表叢集的最佳時間點檢視。當快照正在進行時,您仍然可以對文件編製索引並對叢集發出其他請求,但新文件和現有文件更新通常不包含在快照中。快照包含了 Elasticsearch 起始快照時既已存在的主要碎片。視快照執行緒集區的大小而定,快照中可能附有相距些許時間差的不同碎片。

快照儲存和效能

Elasticsearch 快照是增量式的,這表示它們只會存放自從上次成功快照之後變更的資料。此增量性質表示經常使用和不常使用快照間的磁碟使用差距通常很小。換言之,每小時拍攝快照長達一週 (總共 168 個快照),可能不會比在週末拍攝單一快照使用更多的磁碟空間。此外,您拍攝快照的頻率越高,完成快照所需的時間越少。有些 Elasticsearch 使用者建立快照的頻率高達半小時一次。

建立快照

當您建立快照時,可以指定下列資訊:

  • 快照儲存庫的名稱

  • 快照的名稱

為了方便和簡潔,本章中的範例使用 Curl 這個常見的 HTTP 用戶端。不過,如果您的存取政策指定 IAM 使用者或角色,則您必須簽署快照請求。您可以使用範例 Python 用戶端中的註解範例,對於 Curl 命令使用的相同端點提出已簽署 HTTP 請求。

若要建立手動快照,請執行以下步驟:

  1. 如果快照正在進行中,您就無法取得快照。若要檢查,請執行下列命令:

    curl -XGET 'elasticsearch-domain-endpoint/_snapshot/_status'
  2. 執行下列命令以手動拍攝:

    curl -XPUT 'elasticsearch-domain-endpoint/_snapshot/repository-name/snapshot-name'
注意

拍攝快照所需的時間隨著 Amazon ES 網域的大小而增加。長時間執行的快照操作有時會發生以下錯誤:504 GATEWAY_TIMEOUT。您通常可以忽略這些錯誤,並等待操作成功完成。執行以下命令來驗證您網域的所有快照狀態:

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

還原快照

警告

如果您使用索引演算法、停止向演算法發出寫入請求,或在將替身切換為另一個索引,則 會先停用其索引。停止寫入請求有助於避免以下情況:

  1. 刪除索引也會刪除它的別名。

  2. 錯誤的寫入請求至現已刪除的別名,會使用和別名相同的名稱建立新索引。

  3. 因與新索引有命名衝突之故,您不可再使用別名。

當您從快照還原,如果您交換別名到另一個索引,此時請指定"include_aliases": false

若要還原快照,請執行以下步驟:

  1. 找出您要還原的快照。若要查看所有快照儲存庫,請執行下列命令:

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

    在識別儲存庫後,請執行下列命令以查看所有快照:

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

    大多數自動快照存放在 cs-automated 儲存庫中。如果您的網域加密靜態資料,就會將資料存放在 cs-automated-enc 儲存庫中。如果您看不到您尋找的手動快照儲存庫,請確定您已在網域中登記它。

  2. (選用) 如果您命名叢集上的索引和快照中的索引之間的衝突,請移除或重新命名Amazon ES網域中的一或多個索引。您無法將索引的快照還原到已經包含具相同名稱之索引的 Elasticsearch 叢集。

    如果您有索引命名衝突,您有下列選項:

    • 删除現有Amazon ES網域上的索引,然後還原快照。

    • 在您從快照還原索引時將其重新命名,並在稍後重新編製索引。

    • 將快照還原到不同 Amazon ES 網域 (只能還原手動快照)。

    以下命令會删除網域中的所有現有索引:

    curl -XDELETE 'elasticsearch-domain-endpoint/_all'

    不過,如果您不打算還原所有索引,您可以直接移除其中一個:

    curl -XDELETE 'elasticsearch-domain-endpoint/index-name'
  3. 若要還原快照,請執行以下命令:

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

    由於 Kibana 的特殊權限和細微的存取控制索引,嘗試還原所有索引可能會失敗,尤其是當您嘗試從自動快照還原時。以下範例只從 my-index 快照儲存庫中的 2020-snapshot 還原一個索引 cs-automated

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

    或者,您可能想要還原 Kibana 和精細存取控制索引以外的所有索引:

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

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

刪除手動快照

若要删除手動快照,請執行下列命令:

DELETE _snapshot/repository-name/snapshot-name

使用 Curator 進行快照

有些使用者尋找像 Curator 這類工具,方便進行索引建立和快照管理。使用 pip 安裝 Curator。

pip install elasticsearch-curator

Curator 提供進階的篩選功能,可協助簡化複雜叢集上的管理任務。Amazon ES 在執行 Elasticsearch​ 5.1 版或以上的網域中支援 Curator。您可以使用 Curator 做為命令列界面 (CLI) 或 Python API。如果您使用 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

如需使用 Python API 的範例 Lambda 函數,請參閱 在 Amazon Elasticsearch Service 中使用 Curator 輪換資料