存储与成本:采样、下采样、冷热分层、对象存储
某中等规模 SaaS 公司(200 服务、5000 Pod、总 QPS 约 50000)的可观测性月账单拆解:Loki $8000(日志索引 + 对象存储)+ Tempo $5000(全部走 S3)+ Mimir $3000(时序存储)+ Grafana Cloud $2000 = 每月 $18000。其中至少 $9000 花在了”过去三个月没人查过的日志”上。
可观测性数据的增长是线性的(与 QPS 和节点数成正比),但存储账单的增长常常是超线性的——因为数据堆积的速度超过了你去清理的速度。降本的杠杆从大到小排列:采样 > 保留期 > 压缩 > 冷热分层 > S3 比 SSD 便宜。本文拆解每个杠杆的工程原理和操作步骤。
一、五大支柱的成本结构
| 支柱 | 成本占比 | 主要成本来源 | 最大降本杠杆 |
|---|---|---|---|
| Logs | 40–60% | 索引(ES)或对象存储(Loki)+ 日志量 | 采样 + 保留期缩短 |
| Traces | 20–35% | Span 存储 + ES 索引(Jaeger)或 S3(Tempo) | 采样率 |
| Metrics | 10–20% | Prometheus TSDB 磁盘 + 内存 | 基数控制 + Recording Rules |
| Profiles | < 5% | 对象存储 | 采样频率 |
| Events | 合并到 Logs | — | — |
80/20 法则在这里同样成立:通常是 20% 的高基数服务产生了 80% 的可观测数据量。定位这几个”大户”是成本治理的第一步——按服务拆分 Metrics series count、Log volume(GB/day)、Trace span count、Profile data size。
二、采样:成本的最强杠杆
Trace 的 1% 采样 vs 100% 全量——存储成本差 100 倍。但 1% 的采样意味着 99% 的请求完全没有 Trace。采样率的选择没有最优解——只有在你当前的存储预算和排障需求之间找平衡。
按级别分层采样是最有效的策略:
- ERROR 全量:100%。错误请求的 Trace 是排障的核心资产,不值得省。
- 慢请求(> 阈值)全量:100%。同上。
- 正常请求 baseline:1%–10%,取决于预算。
- DEBUG/INFO 日志:1%–10%,ERROR 全量不变。
按服务差异化采样:订单服务的 1% 采样和报表服务的 100% 采样——存储成本接近但排障价值完全不对等。
三、保留期(Retention)的工程策略
各支柱的典型保留期基线:
- Metrics:原始 7–14 天,下采样聚合 30–90 天。用 Recording Rules 做长期聚合。
- Logs:7–30 天。按业务重要性分级——支付链 30 天、管理后台 7 天。
- Traces:3–7 天。Trace 的排障价值集中在前 48 小时——事故发生后 2 天内会查,之后就很少了。
- Profiles:14 天。用于性能趋势对比,但不需要长时间序列。
保留期的”断崖效应”:从 30 天压到 14 天——存储成本减半。从 14 天压到 7 天——再减半。但从 7 天压到 3 天——出事故时发现日志已被删除,根因永远找不到。不要为了省最后一两个月压到不可接受的短。
四、下采样(Downsampling)
时序数据的下采样是最成熟的实践——原始 15s 分辨率保留 7 天 → 5min 分辨率保留 30 天 → 1h 分辨率保留 1 年。Mimir/Thanos 的 compactor 在处理 block 时自动做这一步——将多个小 block 合并为大时间窗口的聚合 block。代价是精度丢失——下采样后你无法查询”30 天前某一秒的精确 CPU 使用率”,只能看到 5 分钟的平均值——但这对于容量规划完全够用。
日志的”下采样”是 pattern 聚合——将原始日志按 pattern 分组(如 Drain 算法),只保留 pattern 模板和出现频率。排障时看”这个服务的 ERROR 模式中,哪种最频繁”——而不是翻原始日志——效率更高。
五、冷热分层
- 热数据(SSD / NVMe):最近 1–3 天。需要毫秒级查询。
- 温数据(HDD / 高性能对象存储):3–30 天。秒级查询可接受。
- 冷数据(对象存储归档 / Glacier):30 天以上。合规/审计需要,分钟到小时级恢复可接受。
Loki 的 boltdb-shipper 架构天生支持这种分层:index 在 SSD 上,chunk 在 S3 上。Tempo 的所有 block 都在 S3 上。Prometheus TSDB 需要显式分层——通过 Thanos/Mimir 的 sidecar → 对象存储上传。
六、降本路径图
- 分层各支柱的数据量(Prometheus TSDB size、Loki chunk size、Tempo block size per day)
- 按”过去 30 天有人查过吗”标记冷热
- 逐步缩短保留期直到团队能接受的底线
- 开启采样——先采样 INFO 日志和正常 Trace
- 冷热分层——热数据 SSD → 温数据 HDD → 冷数据 S3
- 季度 review:数据增长率是否超过业务增长率?(超过 → 有基数泄漏或日志风暴)
七、工程坑点
保留期压太短。3 天保留期 → 出事故时日志已删 → Root Cause 永远找不到。保留期的底线是”长于你的事故响应周期”。
Loki max_entries_limit_per_query
设太大。一次查询扫描数百 TB 对象存储 → 查询执行 30
分钟 + S3 请求费用爆炸。
为了省成本把 sampling_rate: 0.01
写成了 sampling_rate: 0。零采样 = 所有
Trace 全丢。永远在配置变更后验证至少还有 Trace 进存储。
八、关键概念回顾
- 五大降本杠杆排序:采样 > 保留期 > 压缩 > 冷热分层 > S3 vs SSD。
- 保留期底线:长于事故响应周期。支付链 30 天、管理后台 7 天。
- 冷热分层:热(SSD 1-3天)→ 温(HDD 3-30天)→ 冷(S3 Archive 30天+)。
- 季度 review:数据增长率与业务增长率对齐——错位意味着泄漏。
九、下一步
成本控制住之后,下一个问题是多租户——当全公司的可观测性平台共用一个基础设施时,如何保证数据隔离和成本分摊。下一篇 多租户与安全。
上一篇:告警体系:Alertmanager、PagerDuty、OnCall 与分级抑制
参考资料
- Grafana, Mimir — Compactor, https://grafana.com/docs/mimir/latest/operators-guide/architecture/components/compactor/
- Grafana Loki, Storage, https://grafana.com/docs/loki/latest/operations/storage/
- Thanos, Compaction, https://thanos.io/tip/components/compact.md/
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【可观测性工程】数据模型:时间序列、日志、Span、Profile 的内部表达
拆解 Metrics、Logs、Traces、Profiles、Events 五大支柱在磁盘和内存中的内部数据模型。理解为什么 Loki 比 ES 省 5-10 倍存储、Tempo 为什么不索引 Span attribute、火焰图的本质是栈合并。
【可观测性工程】埋点哲学:粒度、采样、基数爆炸与成本模型
埋点不是多加几行日志,而是一整套关于什么该记、什么该采样、什么该丢弃的工程决策体系。从信号分层、基数控制、采样策略到落地规范与工程坑点,给出可操作的埋点治理框架。
【可观测性工程】Traces 栈与采样:Jaeger、Tempo、Zipkin、SkyWalking
拆解 Jaeger、Tempo、SkyWalking 三种开源分布式追踪方案的架构本质与工程取舍:全索引 vs 无索引、采样策略(头部/尾部/自适应)、传播协议(W3C TraceContext)的断裂诊断,以及选型决策框架。
【可观测性工程】时序数据库内核:TSM、TSI、倒排索引与 Gorilla 压缩
深入时序数据库的存储内核:Prometheus TSDB 的 WAL 与块管理、InfluxDB 的 TSM 引擎与 TSI 倒排索引、Gorilla 压缩算法的数学原理、VictoriaMetrics mergeset 架构、ClickHouse MergeTree 作为 metrics 后端,以及国内大厂在 series churn 和 compaction 风暴上踩过的坑。