全部產品
Search
文件中心

Elasticsearch:手動備份與恢複

更新時間:Sep 12, 2026

通過 Elasticsearch 快照功能,將叢集中的索引資料備份到阿里雲Object Storage Service,並在需要時從備份中恢複資料。手動快照適用於資料移轉、特定時間點恢複、開發測試環境搭建以及高危操作前的安全備份。與自動快照相比,手動快照在快照範圍和時間上更靈活,但需要自行管理快照的生命週期。

資料備份與恢複依賴 elasticsearch-repository-oss 外掛程式,阿里雲 Elasticsearch 執行個體預設已安裝且不可卸載。詳情請參見 elasticsearch-repository-oss。

快照僅儲存索引資料,不儲存監控資料(.monitoring、.security_audit 首碼索引)、中繼資料、Translog、執行個體配置、軟體包、外掛程式和日誌。本文中的命令均可在 Kibana 控制台的 Dev Tools 中執行,詳情請參見通過Kibana串連叢集。

建立快照倉庫

快照倉庫是存放快照的邏輯容器。建立倉庫前,需準備一個與 Elasticsearch 執行個體同地區的 OSS Bucket(建議使用標準儲存類型)。具體操作請參見建立儲存空間。RAM 使用者需具備 AliyunOSSFullAccess 權限原則,具體操作請參見管理RAM使用者的許可權。

以下樣本建立名為 my_backup 的倉庫。

雲上叢集

PUT _snapshot/my_backup/
{
    "type": "oss",
    "settings": {
        "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
        "access_key_id": "xxxx",
        "secret_access_key": "xxxxxx",
        "bucket": "xxxxxx",
        "compress": true,
        "chunk_size": "500mb",
        "base_path": "snapshot/"
    }
}

8.x 版本自建叢集

自建叢集需先安裝 elasticsearch-repository-oss 外掛程式,具體操作請參見elasticsearch-repository-oss外掛程式。自建叢集使用不同版本的外掛程式,參數名需添加 oss.client. 首碼。

PUT /_snapshot/my_backup
{
    "type": "oss",
    "settings": {
        "oss.client.endpoint": "oss-cn-shanghai.aliyuncs.com",
        "oss.client.access_key_id": "xxx",
        "oss.client.secret_access_key": "xxx",
        "oss.client.bucket": "xxxxxx",
        "oss.client.base_path":"snapshot/",
        "oss.client.compress": true
    }
}

參數說明

參數

說明

endpoint

OSS Bucket 的內網訪問網域名稱。擷取方式請參見地區和Endpoint。

access_key_id

RAM 使用者的 AccessKey ID。擷取方式請參見建立AccessKey。

secret_access_key

RAM 使用者的 AccessKey Secret。擷取方式請參見建立AccessKey。

bucket

OSS Bucket 名稱,需使用已存在的 Bucket。

compress

是否壓縮快照的中繼資料檔案(索引映射和設定)。資料檔案不受此參數影響。預設值:false。

chunk_size

快照過程中分塊上傳的大小限制。超過此大小的資料會被分塊上傳到 OSS。

base_path

倉庫的起始路徑,預設為根目錄。可指定子目錄隔離不同叢集或環境的快照,例如 snapshot/prod/ 或 snapshot/dev/。

驗證倉庫連通性

POST _snapshot/my_backup/_verify

配置正確時返回所有串連成功的節點列表。如果返回錯誤,檢查 Endpoint、Bucket 名稱及 RAM 許可權配置。

擷取倉庫資訊

# 擷取所有倉庫的資訊
GET _snapshot
# 擷取指定倉庫的資訊
GET _snapshot/my_backup

建立快照

為全部索引建立快照

PUT _snapshot/my_backup/snapshot_1

此命令為所有 open 狀態的索引建立名為 snapshot_1 的快照,命令立即返回並在後台執行。添加 wait_for_completion=true 參數可阻塞直到備份完成:

PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true

若未使用 wait_for_completion=true 參數,可執行以下命令查看快照狀態:

GET _snapshot/my_backup/snapshot_1/_status

當返回結果中的 state 欄位為 SUCCESS 時,表示快照已建立完成。

重要

釋放 ES 執行個體前,須確認快照已完成,否則可能導致資料丟失。

一個倉庫可包含多個快照。首次建立快照時備份全量資料,後續快照僅備份增量資料,因此速度更快。

為指定索引建立快照

PUT _snapshot/my_backup/snapshot_2
{
  "indices": "index_1,index_2",
  "ignore_unavailable": true,
  "include_global_state": false
}

參數

說明

indices

指定要備份的索引,多個索引用逗號分隔,支援萬用字元(如 logs-*)。

ignore_unavailable

設為 true 時,指定索引不存在則忽略而非失敗。

include_global_state

設為 false 時不備份組群全域狀態,僅備份資料時建議設為 false。

查看快照資訊

# 查看所有快照
GET _snapshot/my_backup/_all

# 查看指定快照
GET _snapshot/my_backup/snapshot_1

# 查看快照詳細狀態(含每個索引和分區的統計值)
GET _snapshot/my_backup/snapshot_1/_status

刪除快照

DELETE _snapshot/my_backup/snapshot_1

如果快照進行中中,此命令會中斷快照進程並刪除已建立的部分資料。

通過 Kibana Dev Tools 或 API 執行 DELETE _snapshot 命令刪除快照後,OSS Bucket 中該快照對應的檔案會由外掛程式自動清理,您無需再前往 OSS 控制台手動刪除。

重要

刪除快照請始終使用 DELETE _snapshot 命令。嚴禁直接在 OSS 控制台或通過其他工具刪除快照檔案,此操作會破壞增量備份鏈,可能導致後續所有快照損壞且無法恢複。

從快照恢複資料

恢複前注意:

  • 不建議恢複 . 開頭的系統索引,否則可能導致 Kibana 訪問失敗。

  • 如果叢集中已存在同名索引,需先關閉或刪除該索引,否則恢複失敗。

  • 跨地區恢複時,需先將 OSS 中的快照資料移轉到目標地區,再恢複到目的地組群。在控制台建立手動快照時,如果執行個體下拉式清單為空白,通常是因為帳號下未開啟備份服務或存在配置問題。對於跨地區遷移,建議使用“手動備份 + OSS 跨地區複製”方案:

    1. 在源地區(例如杭州)建立 OSS Bucket,並配置 Elasticsearch 手動快照備份到該 Bucket。

    2. 配置 OSS 跨地區複製規則,將快照資料同步到目標地區(例如上海)的 OSS Bucket。OSS 間遷移請參見遷移實施。

    3. 在目標地區建立新的 Elasticsearch 執行個體。

    4. 在目標 Elasticsearch 執行個體中註冊指向目標地區 OSS Bucket 的快照倉庫,然後執行恢複操作。

在目的地組群中建立 OSS 倉庫

恢複前需在目的地組群中建立倉庫,映射到與備份相同的 OSS 地址,參數配置請參見建立快照倉庫。

PUT _snapshot/my_backup_restore/
{
    "type": "oss",
    "settings": {
        "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
        "access_key_id": "xxxx",
        "secret_access_key": "xxxxxx",
        "bucket": "xxxxxx",
        "compress": true,
        "chunk_size": "500mb",
        "base_path": "snapshot/"
    }
}

恢複指定索引

恢複指定索引並重新命名,避免與現有索引衝突:

POST /_snapshot/my_backup_restore/snapshot_1/_restore
{
 "indices": "index_1",
 "rename_pattern": "index_(.+)",
 "rename_replacement": "restored_index_$1"
}

參數

說明

indices

指定要恢複的索引,忽略快照中的其他索引。

rename_pattern

Regex模板,匹配待恢複索引的名稱。

rename_replacement

重新命名後的索引名稱,支援正則擷取的群組引用。

恢複所有索引(除系統索引)

POST _snapshot/my_backup_restore/snapshot_1/_restore
{"indices": "*,-.monitoring*,-.security*,-.kibana*,-.internal.alerts*,-.alerts*","ignore_unavailable": true}
以上排除模式為常見系統索引樣本。不同版本的叢集可能包含其他系統索引(如 .ds-ilm-history-*、.slo-* 等),需根據實際叢集中的系統索引調整排除清單。8.x 版本叢集通常還需額外排除 -.ds* 等 data stream backing index。

恢複所有索引(包含系統索引)

POST _snapshot/my_backup_restore/snapshot_1/_restore

_restore API 立即返回,恢複在後台進行。添加 wait_for_completion=true 可阻塞直到恢複完成:

POST _snapshot/my_backup_restore/snapshot_1/_restore?wait_for_completion=true

恢複到 Indexing Service 執行個體

恢複快照到 Indexing Service 執行個體時,需通過 ignore_index_settings 參數忽略不相容的索引設定:

POST /_snapshot/my_backup_restore/snapshot_1/_restore
{
  "indices": "index_1",
  "ignore_index_settings": [
    "index.apack.cube.following_index"
  ]
}

查看快照恢複資訊

通過 _recovery API 監控恢複的狀態和進度。

# 查看指定索引的恢複狀態
GET restored_index_1/_recovery

# 查看叢集中所有索引的恢複資訊(可能包含與當前恢複無關的分區資訊)
GET /_recovery/

輸出結果中的關鍵字段:

欄位

說明

type

恢複類型。snapshot 表示從快照恢複。

source

待恢複的快照和倉庫。

percent

恢複進度百分比。

取消恢複

刪除正在恢複的索引即可取消恢複操作:

DELETE /restored_index_3
重要

此命令會停止恢複進程,同時刪除所有已恢複到叢集中的資料。

FAQ

備份大量資料到 OSS 需要多久?會產生多少費用?

  • 耗時估算:可按每 80 GB 資料約需 30 分鐘進行預估;實際耗時受資料量與執行個體頻寬影響。如需加快備份速度,可在建立快照倉庫時調大 chunk_size 參數,或提升執行個體頻寬。

  • 費用估算:備份資料存放在 OSS 中會產生 OSS 儲存費用與流量費用,具體金額可使用阿里雲價格計算機,按實際資料量與儲存類型測算。

快照失敗或索引無法刪除怎麼辦?

  • 快照失敗排查:如果快照報錯 QpsLimitExceeded,表示觸發 OSS QPS 限流。重啟節點無法解決此問題,請將備份時間調整到業務低峰期,例如淩晨 3:00~4:00,或者聯絡 OSS 提升限額。如果快照因節點記憶體緊張或 GC 導致失敗,可嘗試重啟節點以釋放緩衝。

  • 索引因快照無法刪除:正在建立快照的索引不能直接刪除。刪除索引前,先執行以下命令查看快照狀態:

    GET _snapshot/_status

    檢查返回結果中 state 為 STARTED 的快照及其 indices 列表。indices 列表中的索引正在備份,必須等待快照完成或取消快照後才能刪除;未出現在任何 state 為 STARTED 的快照的 indices 列表中的索引可以安全刪除。

相關文檔