通过将历史数据以快照形式存储在阿里云 OSS 中并保留查询能力,Searchable Snapshot 可在不牺牲数据可用性的前提下,将存储成本降低高达 90%。
使用限制
仅新购的包年包月Elasticsearch 8.17.0版实例支持可搜索快照功能。
Searchable Snapshot 索引为只读,不支持写入操作。
首次查询延迟高于热数据(取决于 OSS 网络延迟),缓存命中后性能接近本地数据。
开通归档数据节点
使用 Searchable Snapshot 前,需要为 Elasticsearch 实例开通归档数据节点。归档数据节点是 Searchable Snapshot 的计算层,负责维护索引元数据、管理本地缓存,并按需从 OSS 拉取查询所需的数据块。
根据实例情况选择对应的操作路径:
新购 8.17.0 版本实例:在创建实例页面选择 8.17.0 版本,在实例规格区域勾选归档数据节点并配置节点数量和规格。
选择节点规格。
归档数据节点不需要大容量本地磁盘(数据存储在 OSS 中),建议配置充足的内存以提升缓存命中率。推荐配置:4 核 16 GB 及以上,磁盘 500 GB 以上(高效云盘或 ESSD 云盘)。
确认购买并等待实例变更完成。归档数据节点就绪后,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"
}
}参数 | 说明 |
| OSS 地域 Endpoint。使用 |
| 阿里云 AccessKey ID。对应的 RAM 用户需具备目标 Bucket 的读写权限 |
| 阿里云 AccessKey Secret |
| OSS Bucket 名称,建议与 Elasticsearch 实例同地域 |
| 快照在 Bucket 中的存储路径前缀 |
| 是否压缩元数据文件,推荐设置为 |
| 大文件分块上传大小,适用于大索引场景 |
验证仓库连通性:
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
}参数名 | 示例值 | 含义与作用 |
仓库名称 |
| • 快照存储位置:指之前已验证通过的阿里云 OSS 存储桶对应的仓库名称。 |
快照名称 |
| • 备份文件标识:在 OSS 上生成的具体备份文件的唯一名称。 |
indices |
| • 指定备份范围:使用通配符 |
ignore_unavailable |
| • 容错机制:当匹配的索引中有些已关闭、缺失或损坏时,跳过它们继续备份,而不是让整个任务失败。 |
include_global_state |
| • 全局状态控制:设为 |
查看快照进度:
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"]
}参数 | 说明 |
| 索引名称,可通过 |
| 使用部分挂载模式,数据留在 OSS,本地仅缓存热点数据。 |
| 挂载后的索引名称,建议添加 重要 如果有多个索引,请分多次执行挂载命令,此处需修改为对应的索引名称。 |
| 设为 |
| 设为 |
切勿删除正在被 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 |
| Rollover |
|
Warm |
| Shrink |
|
Frozen |
| Searchable Snapshot |
|
Delete |
| 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 存储资源。