1. 题目
平台接收服务、租户和区域标签的时序指标,短期排障需要秒级数据,长期报表只需要分钟或小时趋势。写入量持续增长,要求保留 15 天原始样本和 2 年聚合样本,同时控制成本并避免高基数拖垮查询。
2. 约束与澄清
- 先确认采样间隔、标签数量与基数、查询范围、SLO、允许的数据延迟和删除合规要求。
- 区分原始样本、固定窗口聚合、recording rule 预计算结果和长期归档。
- 不能用简单平均替代计数器、直方图或分位数;聚合函数必须保留指标语义。
- 明确写入至少一次、重复样本、乱序时间戳和租户隔离策略。
3. 核心架构
采集层先做标签白名单、基数预算和批量压缩,再写入按时间分块的热存储。查询层根据时间范围与分辨率路由:短窗口读原始块,长窗口读预聚合块,必要时拼接并标注分辨率。降采样作业以可重放的时间窗读取原始数据,输出带来源版本的聚合块,完成校验后再删除过期原始块。
4. 参考流程
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、版本、幂等写入和回放校验,监控缺口、延迟和异常尖峰保真度。