本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Amazon Elasticsearch Service 索引快照
快照是叢集的索引和狀態的備份。狀態包含叢集設定、節點資訊、索引設定和碎片分配。
在 Amazon Elasticsearch Service 上,快照有兩種形式:自動和手動。
-
自動快照僅適用叢集復原。在發生紅色叢集狀態或其他資料遺失時,您可以使用它們來還原您的網域。Amazon ES 會將自動快照存放在預先設定的 Amazon S3 儲存貯體中,並且不收取其他費用。
-
手動快照適用於叢集復原,或將資料從一個叢集移至另一個叢集。顧名思義,您必須初始化手動快照。這些快照會存放在您自己的 Amazon S3 儲存貯體中,而且需支付標準 S3 費用。如果您擁有自我管理 Elasticsearch 叢集的快照,您甚至可以使用該快照遷移至 Amazon ES 網域。
所有 Amazon ES 網域都會建立自動快照,但頻率不同:
-
網域若執行 5.3 版和更高版本的 Elasticsearch,Amazon ES 會每隔 1 小時自動拍攝快照,且最多可保留其中 336 個快照 (連續保留 14 天)。
-
網域若執行 5.1 版和舊版的 Elasticsearch,Amazon ES 會每隔 1 天自動拍攝快照 (在您指定期間),且最多可保留其中 14 個快照 (連續保留 30 天)。
如果您的叢集進入紅色狀態,Amazon ES 會停止取得自動快照。如果您未在兩週內修正該問題,則可能會永久遺失您的叢集資料。如需故障診斷步驟,請參閱紅色叢集狀態。
手動快照先決條件
若要手動建立快照,您必須使用 IAM 和 Amazon S3。嘗試拍攝快照之前,請先確認您已符合以下先決條件。
必要條件 | 描述 |
---|---|
S3 儲存貯體 |
手動儲存 Amazon ES 網域的快照。請記下儲存貯體的名稱。對您而言它有兩個功用:
如需詳細資訊,請參閱http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html中的「Amazon Simple Storage Service 入門指南建立儲存貯體」。 請勿將 S3 Glacier 生命週期規則套用至此儲存貯體。手動快照不支援 S3 Glacier 儲存類別。 |
IAM 角色 |
委派許可給 Amazon Elasticsearch Service。本章其餘各節稱此角色為 角色的信任關係必須在
此角色必須附加以下政策:
如需詳細資訊,請前往 中的新增 IAM 身分許可。IAM 使用者指南 |
許可 |
您必須能夠擔任
如果您沒有
|
註冊手動快照儲存庫
您必須先將快照儲存庫註冊到 Amazon Elasticsearch Service,才能手動拍攝索引快照。這個一次性操作需要您使用可用於存取 TheSnapshotRole
的登入資料簽署 AWS 請求,如手動快照先決條件所述。
您不可使用 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
" } }
註冊快照目錄是一次性的操作,但要從一個網域遷移到另一個網域,必須在舊網域註冊相同的快照儲存庫和新的網域。儲存庫名稱是任意的。
-
如果您要遷移至新網域 (或因為某些原因將相同的儲存庫登記為多個網域),請在新網域上登記儲存庫時,將
"readonly": true
新增至"settings"
。此設定有助於避免意外覆寫舊網域的資料。 -
若要對快照儲存庫使用 S3 管理的金鑰進行伺服器端加密,請將
"server_side_encryption": true
新增到"settings"
。
如果您的網域存放在 VPC 中,您的電腦必須連接到 VPC,才能讓請求成功註冊快照儲存庫。存取 VPC 因網路組態而異,但可能牽涉到連線 VPN 或公司網路。若要確認您可以連上
Amazon ES 網域,請在 Web 瀏覽器中導覽至 https://
,並確認您接收預設的 JSON 回應。
your-vpc-domain
.region
.es.amazonaws.com
如果您使用精細存取控制,請參閱 手動快照 以了解其他步驟。
範例 Python 用戶端
將下列範例 Python 程式碼儲存為 Python 檔案,例如 register-repo.py
。 使用者需要 適用於 Python 的 AWS 開發套件 (Boto3)
以 Java 為基礎的程式碼範例,請參閱簽署 HTTP 請求。
您必須更新下列變數:host
、region
、path
和 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
手動拍攝快照
-
如果快照正在進行中,您就無法取得快照。若要檢查,請執行下列命令:
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/_status' -
執行以下命令來手動拍攝快照:
curl -XPUT '
elasticsearch-domain-endpoint
/_snapshot/repository
/snapshot-name
'
拍攝快照所需的時間隨著 Amazon ES 網域的大小而增加。長時間執行的快照操作有時會發生下列錯誤:504
GATEWAY_TIMEOUT
– 。 一般而言,您可以忽略這些錯誤,並等待操作成功完成。使用下列命令來驗證您網域的所有快照狀態:
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/repository
/_all?pretty'
還原快照
如果您使用 索引別名,請先停止寫入請求至別名 (或交換別名到另一個索引),然後再刪除它的索引。停止寫入請求有助於避免以下情況:
-
刪除索引也會刪除它的別名。
-
錯誤的寫入請求至現已刪除的別名,會使用和別名相同的名稱建立新索引。
-
因與新索引有命名衝突之故,您不可再使用別名。
當您從快照還原,如果您交換別名到另一個索引,此時請指定"include_aliases": false
。
還原快照
-
識別您要還原的快照。若要查看所有快照儲存庫,請執行下列命令:
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot?pretty'在識別儲存庫後,請執行下列命令以查看所有快照:
curl -XGET '
elasticsearch-domain-endpoint
/_snapshot/repository
/_all?pretty'注意 大多數自動快照存放在
cs-automated
儲存庫中。如果您的網域加密靜態資料,會將該資料存放在cs-automated-enc
儲存庫。如果您沒看所要尋找的手動快照儲存庫,請確定您已註冊網域。 -
(選用) 刪除或重新命名 Amazon ES 網域中的一個或多個索引。如果叢集上的索引與快照中的索引命名未發生衝突,即無須執行此步驟。您無法將索引的快照還原到已經包含具相同名稱之索引的 Elasticsearch 叢集。
-
刪除相同 Amazon ES 網域上的索引,然後還原快照。
-
在您從快照還原索引時將其重新命名,然後為其重新編製索引。
-
將快照還原到不同 Amazon ES 網域 (只能還原手動快照)。
以下範例顯示如何刪除網域所有現有的索引:
curl -XDELETE '
elasticsearch-domain-endpoint
/_all'如果您不打算還原所有的索引,您可能只想要刪除一個索引:
curl -XDELETE '
elasticsearch-domain-endpoint
/index-name
' -
-
若要還原快照,請執行以下命令:
curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/repository
/snapshot
/_restore'由於 Kibana 的特殊權限和細微的存取控制索引,嘗試還原所有索引可能會失敗,尤其是當您嘗試從自動快照還原時。以下範例只從
my-index
快照儲存庫中的2017-snapshot
還原一個索引cs-automated
:curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/cs-automated/2017-snapshot/_restore' -d '{"indices": "my-index"}' -H 'Content-Type: application/json'或者,您可能想要還原除了 Kibana 和精細存取控制索引以外的所有索引:
curl -XPOST '
elasticsearch-domain-endpoint
/_snapshot/cs-automated/2017-snapshot/_restore' -d '{"indices": "-.kibana*,-.opendistro_security"}' -H 'Content-Type: application/json'
如果不是所有涉及的索引都有主要碎片,快照可能具有 state
的 PARTIAL
。 這個值表示至少一個碎片的資料未成功儲存。您仍然可以從部分快照還原,但您可能需要使用舊版的快照來還原任何遺失的索引。
刪除手動快照
若要删除手動快照,請傳送以下請求:
DELETE _snapshot/
repository
/snapshot
使用 Curator 進行快照
有些使用者尋找像 Curator 這類工具,方便進行索引建立和快照管理。使用 pip
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 輪換資料。