代表性面试主题

如何设计时序指标的分层保留与降采样服务?

系统设计困难
OfferCC 编辑团队发布 更新

题干

监控平台每天写入数十亿条带标签时序样本。请设计一套保留 15 天高分辨率、2 年低分辨率数据的系统,说明降采样、查询路由、标签基数和数据校验。

1. 题目

平台接收服务、租户和区域标签的时序指标,短期排障需要秒级数据,长期报表只需要分钟或小时趋势。写入量持续增长,要求保留 15 天原始样本和 2 年聚合样本,同时控制成本并避免高基数拖垮查询。

2. 约束与澄清

  • 先确认采样间隔、标签数量与基数、查询范围、SLO、允许的数据延迟和删除合规要求。
  • 区分原始样本、固定窗口聚合、recording rule 预计算结果和长期归档。
  • 不能用简单平均替代计数器、直方图或分位数;聚合函数必须保留指标语义。
  • 明确写入至少一次、重复样本、乱序时间戳和租户隔离策略。

3. 核心架构

采集层先做标签白名单、基数预算和批量压缩,再写入按时间分块的热存储。查询层根据时间范围与分辨率路由:短窗口读原始块,长窗口读预聚合块,必要时拼接并标注分辨率。降采样作业以可重放的时间窗读取原始数据,输出带来源版本的聚合块,完成校验后再删除过期原始块。

4. 参考流程

text
ingest(sample):
  series = canonicalize(metric_name, sorted_labels)
  enforce_cardinality_budget(series)
  append_to_time_partition(series, sample)

downsample(window):
  raw = read_raw(window)
  agg = aggregate_by_metric_semantics(raw, resolution=5m)
  write_versioned_block(window, agg, source_watermark)
  verify_counts_checksums_and_watermark(agg)

query(range, step):
  blocks = choose_resolution(range, step)
  return merge_with_gap_and_resolution_metadata(blocks)

计数器可保存增量与重置信息,gauge 可保存 min/max/avg,直方图要合并 bucket 或原生 histogram 结构。查询结果应携带实际分辨率、覆盖范围和缺口,避免用户把降采样数据误当作原始精度。

5. 一致性与成本取舍

降采样可能因迟到样本或重复执行而产生不同结果,因此作业要使用 watermark、版本号和幂等写入;窗口关闭后仍需定义修订期。高基数标签会同时放大内存、索引和查询成本,应限制任意用户标签、按租户配额或预聚合。更高分辨率、更长保留期和更低查询延迟之间存在直接存储与计算成本。

6. 验证与观测

  • 对每个时间窗校验输入输出样本数、计数器增量、bucket 总量、校验和与 watermark。
  • 回放同一窗口多次,确认幂等且结果版本可替换。
  • 监控写入拒绝率、系列数、查询样本数、降采样延迟、缺口率和存储成本。
  • 用真实故障查询对比原始与聚合结果,确认尖峰、重置和异常不会被平均抹平。

7. 常见误区

  • 只按时间平均所有指标,破坏计数器、分位数或直方图语义。
  • 把标签字符串未排序就作为系列键,造成重复系列和错误基数。
  • 降采样完成前删除原始块,失败后无法重放或修订迟到数据。
  • 查询路由只看时间范围,不考虑 step、缺口和分辨率元数据。

8. 面试评分点

能定义分层数据模型

应区分原始、预聚合和归档数据,说明每层分辨率、保留期与查询用途。

能保持指标语义

应分别处理 counter、gauge、histogram 和分位数,避免用一个平均函数覆盖所有类型。

能控制基数与成本

应提出标签规范、租户配额、写入拒绝和存储预算,并解释查询与成本的关系。

能设计可重放验证

应使用 watermark、版本、幂等写入和回放校验,监控缺口、延迟和异常尖峰保真度。

公开来源

同类题目

资源

产品对比

每份对比均基于官方资料,并标注复核日期。

查看完整对比

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具