在数据爆炸式增长的时代,企业普遍面临两个看似矛盾却又必须同时解决的难题:既要控制存储成本,又要保证数据可检索性。传统的数据管理方式往往采用"冷热分层"的简单策略——将不常访问的数据迁移到廉价存储介质上,但这种做法存在明显的局限性:
我们团队在金融行业日志分析场景中,就遇到了这样的典型困境:每天新增约20TB的日志数据,按照合规要求需要保存3年,总数据量预估将超过20PB。采用传统ES热节点存储方案,仅硬件成本就令人望而却步;而如果简单归档到对象存储,又无法满足突发审计时的高效查询需求。
经过多轮技术验证,我们最终确定了TongSearch ILM(Index Lifecycle Management)与可搜索快照(Searchable Snapshots)的组合方案。这套架构的核心价值在于:
智能分层(ILM):基于用户自定义策略(如时间、索引大小、文档数量等)自动执行数据流转
可搜索快照:通过创新的元数据索引+部分数据缓存机制,使得存储在廉价对象存储(如S3)中的数据无需完整恢复即可查询
我们的生产环境部署方案如下:
code复制[写入节点] --> [热层(SSD, 3节点)]
--> [温层(HDD, 5节点)]
--> [冷层(HDD+对象存储, 自动扩展)]
--> [冻结层(纯对象存储, S3)]
每个层级都配置了精细化的ILM策略。以日志索引为例:
json复制PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50gb",
"max_age": "3d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "3d",
"actions": {
"forcemerge": {
"max_num_segments": 1
},
"shrink": {
"number_of_shards": 1
},
"allocate": {
"number_of_replicas": 1
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"allocate": {
"require": {
"data": "cold"
}
}
}
},
"delete": {
"min_age": "365d",
"actions": {
"delete": {}
}
}
}
}
}
挂载冻结层索引时,有几个关键参数需要特别注意:
bash复制POST /_snapshot/logs_backup/snapshot_20230701/_mount?wait_for_completion=true
{
"index": "logs-2023.07.01",
"renamed_index": "restored-logs-2023.07.01",
"index_settings": {
"index.store.snapshot.cache.prewarm.enabled": false,
"index.search.slowlog.threshold.query.warn": "10s",
"index.number_of_replicas": 0
},
"ignored_index_settings": ["index.number_of_replicas"]
}
重要提示:对于历史数据查询场景,建议关闭prewarm(预热)功能以避免突发IO压力。实测显示,在百万级文档查询中,开启prewarm会使查询延迟增加300%,而命中率提升不足5%。
| 存储类型 | 月成本(USD) | 查询延迟 | 数据恢复时间 |
|---|---|---|---|
| 全SSD热存储 | 25,000 | <100ms | 即时 |
| HDD温存储 | 8,000 | 200-500ms | 即时 |
| 传统归档存储 | 1,200 | 不可查询 | 2-48小时 |
| 可搜索快照 | 1,500 | 1-5秒 | 按需加载 |
在我们的生产环境中,实施该方案6个月后的关键指标:
现象:查询3个月前的日志时频繁出现504超时
排查步骤:
_searchable_snapshots/stats接口的shared_cache指标bash复制GET /_searchable_snapshots/stats
解决方案:
json复制PUT _cluster/settings
{
"persistent": {
"searchable_snapshots.max_concurrent_searches": 5
}
}
根本原因:大量历史查询穿透到热层节点处理
优化方案:
json复制GET logs-*/_search?preference=_only_local
json复制PUT logs-2023*/_mapping
{
"properties": {
"debug_message": {
"type": "text",
"doc_values": false
}
}
}
通过分析查询模式,我们对审计常用的时间范围配置自动预加载规则:
bash复制POST /_searchable_snapshots/cache/prewarm
{
"indices": "logs-2023*",
"query": {
"range": {
"@timestamp": {
"gte": "now-30d/d",
"lte": "now-7d/d"
}
}
},
"priority": "high"
}
对于跨冷热层数据的聚合查询,采用分阶段执行策略:
这种方法使得一个原本需要扫描10亿文档的查询,实际仅需处理约5万文档,耗时从分钟级降至秒级。