全部產品
Search
文件中心

Elasticsearch:Searchable Snapshot(可搜尋快照)

更新時間:Apr 09, 2026

通過將歷史資料以快照形式儲存在阿里雲 OSS 中並保留查詢能力,Searchable Snapshot 可在不犧牲資料可用性的前提下有效降低儲存成本,更多資訊請參見ES Searchable snapshots

使用限制

  • 僅新購的訂用帳戶Elasticsearch 8.17.0版執行個體支援可搜尋快照功能。

  • Searchable Snapshot 索引為唯讀,不支援寫入操作。

  • 首次查詢延遲高於熱資料(取決於 OSS 網路延遲),快取命中後效能接近本機資料。

開通歸檔資料節點

使用 Searchable Snapshot 前,需要為 Elasticsearch 執行個體開通歸檔資料節點。歸檔資料節點是 Searchable Snapshot 的計算層,負責維護索引中繼資料、管理本機快取,並按需從 OSS 拉取查詢所需的資料區塊。

  1. 登入檢索分析服務 Elasticsearch 版控制台

  2. 根據執行個體情況選擇對應的操作路徑:

    • 新購 8.17.0 版本執行個體:在建立執行個體頁面選擇 8.17.0 版本,在執行個體規格地區勾選歸檔數據節點並配置節點數量和規格。

  3. 選擇節點規格。

    歸檔資料節點不需要大容量本地磁碟(資料存放區在 OSS 中),建議配置充足的記憶體以提升快取命中率。推薦配置:4 核 16 GB 及以上,磁碟 500 GB 以上(高效雲端硬碟或 ESSD 雲端硬碟)。

  4. 購買並等待執行個體變更完成。歸檔資料節點就緒後,Searchable Snapshot 功能預設開啟,無需額外操作。

配置 OSS Snapshot 倉庫

阿里雲 Elasticsearch 內建 repository-oss 外掛程式,可直接將 OSS 用作 Snapshot 倉庫,無需手動安裝外掛程式。

重要

阿里雲 Elasticsearch 執行個體預設附帶的 aliyun_auto_snapshot 倉庫會定期自動清理歷史快照資料。如果將該倉庫用於 Searchable Snapshot,快照被清理後掛載的索引將永久遺失資料且無法恢複。生產環境必須建立獨立的 OSS Snapshot 倉庫。

在 Kibana Dev Tools 中執行以下命令註冊 OSS Snapshot 倉庫:

PUT _snapshot/my_oss_repo
{
  "type": "oss",
  "settings": {
    "endpoint": "http://oss-cn-hangzhou-internal.aliyuncs.com",
    "access_key_id": "<your_access_key_id>",
    "secret_access_key": "<your_secret_access_key>",
    "bucket": "<your_bucket_name>",
    "base_path": "es_snapshots",
    "compress": true,
    "chunk_size": "500mb"
  }
}

參數

說明

endpoint

OSS 地區 Endpoint。使用 internal 內網地址可提升傳輸速度並避免公網流量費用

access_key_id

阿里雲 AccessKey ID。對應的 RAM 使用者需具備目標 Bucket 的讀寫權限

secret_access_key

阿里雲 AccessKey Secret

bucket

OSS Bucket 名稱,建議與 Elasticsearch 執行個體同地區

base_path

快照在 Bucket 中的儲存路徑首碼

compress

是否壓縮中繼資料檔案,推薦設定為 true

chunk_size

大檔案分塊上傳大小,適用於大索引情境

驗證倉庫連通性:

POST _snapshot/my_oss_repo/_verify

返回成功且列出了叢集中的節點,這說明叢集中的相關節點已經成功串連到了 OSS 儲存,並且擁有讀寫權限。OSS 外掛程式完整參數說明參見 elasticsearch-repository-oss

建立快照並掛載

建立快照

將需要歸檔的索引建立快照。

以下命令含義為:在ES中建立一個名為 snapshot_20260227 的快照,並將該快照儲存到之前驗證過的 my_oss_repo 倉庫中。

PUT _snapshot/my_oss_repo/snapshot_20260227
{
  "indices": "logs-2025-*",
  "ignore_unavailable": true,
  "include_global_state": false
}

參數名

樣本值

含義與作用

倉庫名稱
(Repository)

my_oss_repo

• 快照儲存位置:指之前已驗證通過的阿里雲 OSS 儲存桶對應的倉庫名稱。
• 確保該倉庫狀態為 verified 且叢集有讀寫權限。

快照名稱
(Snapshot)

snapshot_20260227

• 備份檔案標識:在 OSS 上產生的具體備份檔案的唯一名稱。
• 命名建議:通常包含日期(如 20260227)以便識別備份時間點。
• 名稱在同一個倉庫中必須唯一,若已存在則請求會失敗。

indices

"logs-2025-*"

• 指定備份範圍:使用萬用字元 * 匹配所有以 logs-2025- 開頭的索引。
• 作用:僅備份 2025 年的日誌資料,排除其他年份索引或系統索引(如 .kibana)。

ignore_unavailable

true

• 容錯機制:當匹配的索引中有些已關閉、缺失或損壞時,跳過它們繼續備份,而不是讓整個任務失敗。
• 最佳實務:記錄備份建議設為 true,避免因舊索引被滾動刪除導致備份失敗。

include_global_state

false

• 全域狀態控制:設為 false 表示只備份索引資料,不備份組群設定(如模板、使用者權限、倉庫配置等)。
• 最佳實務:記錄備份通常設為 false,防止恢複快照時意外覆蓋當前叢集配置,導致狀態混亂。

查看快照進度:

GET _snapshot/my_oss_repo/snapshot_20260227/_status

返回結果中 state 欄位為 SUCCESS 且 shards_stats.failed 為 0,表示快照命令執行成功。

說明

以下為測試使用的索引資料。

POST logs-2025-01-01/_doc
{ "message": "test log data 01", "level": "info", "timestamp": "2025-01-01T10:00:00" }

POST logs-2025-01-02/_doc
{ "message": "test log data 02", "level": "warn", "timestamp": "2025-01-02T10:00:00" }

POST logs-2025-01-03/_doc
{ "message": "test log data 03", "level": "error", "timestamp": "2025-01-03T10:00:00" }

POST logs-2025-01-04/_doc
{ "message": "test log data 04", "level": "info", "timestamp": "2025-01-04T10:00:00" }

POST logs-2025-01-05/_doc
{ "message": "test log data 05", "level": "debug", "timestamp": "2025-01-05T10:00:00" }

掛載到 Frozen Tier

使用 Mount Snapshot API 將快照索引以 Partially Mounted 模式掛載:

POST _snapshot/my_oss_repo/snapshot_20260227/_mount?storage=shared_cache&wait_for_completion=true
{
  "index": ".ds-logs-2025-01-01-2026.03.03-000001",
  "renamed_index": "frozen-logs-2025-01-01",
  "index_settings": {
    "index.number_of_replicas": 0
  },
  "ignore_index_settings": ["index.refresh_interval"]
}

參數

說明

index

索引名稱,可通過GET _snapshot/my_oss_repo/snapshot_20260227先查詢快照內容,確認準確的索引名稱。

storage=shared_cache

使用部分掛載模式,資料留在 OSS,本地僅緩衝熱點資料。

renamed_index

掛載後的索引名稱,建議添加 frozen- 首碼以便區分。

重要

如果有多個索引,請分多次執行掛載命令,此處需修改為對應的索引名稱。

index.number_of_replicas

設為 0,Searchable Snapshot 不需要副本分區。

wait_for_completion

設為 true等待掛載完成後返回結果。

重要

切勿刪除正在被 Searchable Snapshot 引用的快照,否則對應索引資料將不可用。

查詢掛載後的索引

Searchable Snapshot 索引的查詢方式與普通索引完全一致:

GET frozen-logs-2025-01-01/_search
{
  "query": {
    "match": {
      "message": "error"
    }
  }
}

通過萬用字元可同時查詢線上索引和歸檔索引:

GET logs-2025-*,frozen-logs-2025-*/_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2025-01-01",
        "lt": "2025-02-01"
      }
    }
  }
}

返回_shards.successful 等於索引總數且 hits.total.value 大於 0 即為成功。

卸載 Searchable Snapshot 索引

如需卸載已掛載的 Searchable Snapshot 索引,直接刪除該索引即可。底層快照資料不受影響,後續可重新掛載:

DELETE frozen-logs-2025-01-01

如需將歸檔資料恢複為可寫入的普通索引,可使用標準 Restore API 將備份在 OSS 上的快照資料還原至 Elasticsearch 叢集:

POST _snapshot/my_oss_repo/snapshot_20260227/_restore
{
  "indices": ".ds-logs-2025-01-01-2026.03.03-000001",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

通過 ILM 自動化管理資料生命週期

推薦使用 Index Lifecycle Management(ILM)策略自動將索引遷移到 Frozen Tier。以下策略實現 Hot → Warm → Frozen → Delete 的完整生命週期,索引進入 Frozen 階段時 ILM 自動建立快照到 OSS 並以 Partially Mounted 模式掛載,無需人工幹預:

PUT _ilm/policy/logs_lifecycle_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50gb",
            "max_age": "7d"
          }
        }
      },
      "warm": {
        "min_age": "30d",
        "actions": {
          "shrink": { "number_of_shards": 1 },
          "forcemerge": { "max_num_segments": 1 }
        }
      },
      "frozen": {
        "min_age": "90d",
        "actions": {
          "searchable_snapshot": {
            "snapshot_repository": "my_oss_repo"
          }
        }
      },
      "delete": {
        "min_age": "365d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

生命週期階段總覽:

階段

觸發時間

核心操作

作用與優勢

Hot
(熱)

0ms
(立即)

Rollover
(50GB 或 7 天)

  • 作用:接收新寫入的熱點資料,自動滾動建立新索引。

  • 優勢:避免單索引過大,保持高頻寫入效能。

Warm
(溫)

30d
(30 天后)

Shrink
Forcemerge

  • 作用:將分區收縮為 1 個,段合并為 1 個。

  • 優勢:減少分區開銷,提升查詢效率,最佳化儲存。

Frozen
(冷)

90d
(90 天后)

Searchable Snapshot
(掛載到 OSS)

  • 作用:自動建立可搜尋快照到 OSS,未經處理資料可刪除。

  • 優勢:節省約 70% 儲存成本,資料仍可查詢。

Delete
(刪除)

365d
(1 年後)

Delete
(永久刪除)

  • 作用:永久刪除索引及快照。

  • 優勢:滿足資料保留合規要求,避免儲存無限增長。

工作原理

Searchable Snapshot 採用存算分離架構,由歸檔資料節點(計算層)和阿里雲 OSS(儲存層)協同工作:

  • 阿里雲 OSS 是持久化儲存層,承擔 Snapshot Repository 的角色。所有快照資料全量儲存在 OSS 中,藉助 OSS 自身的多副本冗餘機制保障資料可靠性,無需在 Elasticsearch 層維護副本分區。

  • 歸檔資料節點 是計算層,負責接收查詢請求並協調資料訪問。節點內部包含三個關鍵組件:

    • Metadata(中繼資料):記錄索引結構與分區映射資訊,維護 Searchable Snapshot 索引的邏輯視圖。

    • Shared Cache(共用快取):緩衝近期查詢過的熱點資料區塊,同一節點上所有 Searchable Snapshot 索引的分區共用此緩衝。

    • Query Engine(查詢引擎):接收查詢請求,判斷快取命中情況,未命中時從 OSS 按需拉取資料區塊。

資料流轉路徑分為寫入和查詢兩個方向:

  • 寫入方向:通過手動操作或 ILM 策略,將到期索引建立快照並推送到 OSS。掛載時使用 storage=shared_cache 參數以 Partially Mounted 模式掛載,資料留在 OSS,歸檔資料節點僅載入中繼資料。

  • 查詢方向:歸檔資料節點首先檢查本地共用快取是否命中所需資料區塊。命中時直接返回結果,效能接近本機資料;未命中時從 OSS 按需拉取對應資料區塊,返回查詢結果的同時將資料寫入緩衝供後續複用。

共用快取預設大小為節點總磁碟空間的 90%(或總空間減 100 GB,取較小值),採用 LRU(最近最少使用)策略淘汰冷資料區塊。

Elasticsearch 將資料按訪問頻率劃分為多個層級,Searchable Snapshot 服務於其中成本最低的 Frozen Tier(歸檔資料層):

資料層

儲存介質

特點

Hot Tier(熱資料層)

本地 SSD

承載即時寫入和高頻查詢,保留副本分區保障高可用

Warm Tier(溫資料層)

標準磁碟

資料不再寫入,仍支援中頻查詢

Frozen Tier(歸檔資料層)

OSS Object Storage Service + 本機快取

資料常駐 OSS,歸檔資料節點僅緩衝熱點資料。儲存成本較 Hot Tier 降低明顯。

Searchable Snapshot 通過以下機制實現降本:

  • 消除副本分區:資料可靠性由 OSS 多副本機制保障,無需在 Elasticsearch 層維護副本分區,降低 50% 儲存成本,同時消除跨可用性區域資料同步的流量費用。

  • 存算分離:資料全量儲存在 OSS 中,OSS 單價遠低於雲端硬碟儲存(價差可達 10 倍以上),歸檔資料節點僅儲存中繼資料和熱點緩衝。

  • 極高的資料密度比:歸檔資料節點可實現 1:1500 的記憶體與資料量之比。一個 64 GB 記憶體的節點可管理約 100 TB 歸檔資料,相同資源在 Warm Tier 僅能承載約 10 TB。

適用情境

  • 日誌歸檔:將超過一定時間的日誌從 Hot/Warm 層遷移至 Frozen 層,保持可查詢的同時降低儲存成本。

  • 合規審計:以極低成本長期保留監管要求的業務資料,支援按需檢索。

  • 歷史資料分析:偶爾需要回溯分析的歷史業務資料,無需長期佔用 SSD 儲存資源。

相關文檔