Searchable Snapshot(可搜索快照)

更新时间:
复制为 MD 格式

通过将历史数据以快照形式存储在阿里云 OSS 中并保留查询能力,Searchable Snapshot 可在不牺牲数据可用性的前提下,将存储成本降低高达 90%。

使用限制

  • 仅新购的包年包月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 对象存储 + 本地缓存

数据常驻 OSS,归档数据节点仅缓存热点数据。存储成本较 Hot Tier 降低 90% 以上

Searchable Snapshot 通过以下机制实现降本:

  • 消除副本分片:数据可靠性由 OSS 多副本机制保障,无需在 Elasticsearch 层维护副本分片,降低 50% 存储成本,同时消除跨可用区数据同步的流量费用。

  • 存算分离:数据全量存储在 OSS 中,OSS 单价远低于云盘存储(价差可达 10 倍以上),归档数据节点仅保存元数据和热点缓存。

  • 极高的数据密度比:归档数据节点可实现 1:1500 的内存与数据量之比。一个 64 GB 内存的节点可管理约 100 TB 归档数据,相同资源在 Warm Tier 仅能承载约 10 TB。

适用场景

  • 日志归档:将超过一定时间的日志从 Hot/Warm 层迁移至 Frozen 层,保持可查询的同时降低存储成本。

  • 合规审计:以极低成本长期保留监管要求的业务数据,支持按需检索。

  • 历史数据分析:偶尔需要回溯分析的历史业务数据,无需长期占用 SSD 存储资源。

相关文档