导读:本期聚焦于林则安创作的《监控数据降采样到底是什么?如何在不丢关键信息的前提下压缩存储成本》,敬请观看详情。时序数据库在承载高频率监控指标时,原始数据点会在数周内膨胀到百亿级别,直接查询不仅慢而且贵。降采样本质是按时间窗口对原始序列做聚合,用均值、最大值等统计值替代细粒度样本。常见误区是认为降采样必然丢失异常毛刺,其实通过多分辨率分层存储,既能保留秒级细节又能用分钟级数据支撑长期趋势。本文对比滚动窗口与滑动窗口的差异,并给出基于Prometheus和InfluxDB的实操配置,说明如何根据业务SLA设定保留策略,避免盲目降采样导致告警失灵。

监控系统的后端每天都在产生海量时序数据,从主机CPU到业务接口耗时,每个指标通常以数秒一次的频率上报。当集群规模扩大,原始数据如果不加处理,存储成本会迅速失控,查询延迟也会高到无法接受。监控数据降采样就是一种主动性的数据压缩手段,它按照预设的时间粒度对原始数据点进行聚合计算,用更少的数据行表达同一时间段内的整体状态。降采样并不是简单地删除数据,而是用统计特征替代个体样本,从而在可控精度损失下显著降低系统负担。

监控数据降采样到底是什么?如何在不丢关键信息的前提下压缩存储成本

降采样的核心原理与常见聚合函数

降采样的底层逻辑是时间分桶,也就是把连续的时间轴切分成固定长度的区间,例如一分钟或五分钟为一个桶。每个桶内的多个原始样本会通过聚合函数计算出一个或几个代表值。最常用的聚合函数包括平均值、最大值、最小值、求和值以及分位数。平均值适合观察整体水位,最大值能保留区间内可能出现的峰值,对于告警来说尤为重要,因为很多故障表现为短时冲高。最小值则常用于观察低谷资源占用。

在实现层面,降采样可以分为预聚合和查询时聚合两类。预聚合是在数据写入存储后就由后台任务生成低精度表,查询直接读低精度表,性能最好。查询时聚合则不落盘,每次查询由引擎动态计算,灵活但消耗算力。对于监控场景,通常推荐预聚合配合多级保留策略。比如原始数据保留三天,一分钟粒度保留三十天,一小时粒度保留一年,这样既能排查近期问题,也能看长期容量趋势。

需要注意,聚合函数的选择直接影响降采样后数据的语义。如果只用平均值做降采样,那么秒级发生的瞬时超时可能会被平均掉,造成告警遗漏。因此在关键延迟指标上,建议同时保留最大值和分位数,或者使用水位线降采样,即记录桶内超过阈值的样本数。下面是一段用Python模拟降采样聚合的示例代码,展示如何对一个窗口内的数据点取最大值和平均值:

# 模拟原始监控点,每10秒一个,窗口为1分钟
raw_points = [0.2, 0.3, 0.9, 0.4, 0.5, 0.8]
window_size = 60

def down_sample(points):
    avg_val = sum(points) / len(points)
    max_val = max(points)
    return avg_val, max_val

avg, mx = down_sample(raw_points)
print("平均值:", avg, "最大值:", mx)

滚动窗口与滑动窗口的方案对比

在落地降采样时,工程师常面临滚动窗口和滑动窗口的取舍。滚动窗口指相邻桶之间不重叠,例如零点到一分、一分到两分,这种方案计算简单,存储规整, most时序数据库原生支持。它的缺点是边界处可能割裂突发曲线,比如一个持续四十秒的抖动被切在两个滚动窗口中间,各自的最大值都看起来正常。

滑动窗口则是以步长小于窗口宽度的形式移动,例如窗口五分钟、步长一分钟,这样相邻结果有重叠,能更平滑地反映变化,但计算和存储成本更高,因为同一原始点会参与多次聚合。在监控降采样中,滚动窗口已经能满足绝大多数趋势分析,只有在做细粒度异常检测时才考虑滑动窗口。可以通过下表快速判断选用哪种方式:

维度滚动窗口滑动窗口
计算开销
边界割裂风险
适用场景长期趋势、成本敏感短时异常、精度敏感

实际部署中也可以组合使用,用滚动窗口做天级存储,用滑动窗口在近期数据上做实时检测。下面的配置片段展示如何在InfluxDB中通过连续查询实现滚动降采样,将十秒精度数据聚合成一分钟精度:

CREATE CONTINUOUS QUERY "cq_1m" ON "metrics"
BEGIN
  SELECT MEAN("value") AS "mean_value", MAX("value") AS "max_value"
  INTO "metrics"."autogen"."cpu_1m"
  FROM "metrics"."autogen"."cpu_raw"
  GROUP BY time(1m), *
END

基于Prometheus的降采样与保留实战

Prometheus本身不提供自动降采样,但它通过本地TSDB的压缩和chunk机制减少存储放大,同时配合远程存储或Recording Rules实现降采样。Recording Rules是最常用的手段,它定时执行查询并将结果写回新的时间序列,相当于用户态预聚合。比如我们可以定义规则,把每秒采集的node_cpu_seconds_total计算成一分钟平均使用率,从而让面板查询更快。

在配置Recording Rules时,要关注评估间隔与降采样粒度的匹配。如果原始抓取间隔是十五秒,规则评估设为一分钟,那么每个规则点会聚合四个样本,是合理的。若评估间隔远大于原始间隔,则会丢弃中间样本,造成信息损失。此外,Prometheus的本地数据保留期建议设短一些,长期数据下沉到Thanos或Mimir,这些系统支持基于块的降采样,自动生成五分钟和一小时分辨率块,查询时按区间智能选择。

下面给出一个简单的Recording Rules示例,将请求延迟原始数据降采样为一分钟内的p99和平均值,方便后续告警和看板直接使用低精度指标:

groups:
- name: latency_down_sample
  rules:
  - record: http_request_latency_p99_1m
    expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[1m])) by (le))
  - record: http_request_latency_avg_1m
    expr: avg_over_time(http_request_duration_seconds_sum[1m]) / avg_over_time(http_request_duration_seconds_count[1m])

降采样策略制定时还要结合业务SLA。交易类接口要求秒级感知故障,原始数据至少要保留一天,降采样后的高粒度数据用于周报。离线分析类指标则可以直接从五分钟粒度起步。只有把保留周期、聚合函数、窗口大小三者联动设计,才能既压住成本又保住观测能力。

monitoring_datadown_samplingtime_series修改时间:2026-08-18 09:00:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。