ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Scrutiny 数据降采样(Downsampling)机制解析:InfluxDB 多级分桶保留策略与自动聚合任务

Scrutiny 数据降采样(Downsampling)机制解析:InfluxDB 多级分桶保留策略与自动聚合任务 Scrutiny 数据降采样Downsampling机制解析InfluxDB 多级分桶保留策略与自动聚合任务【免费下载链接】scrutinyHard Drive S.M.A.R.T Monitoring, Historical Trends Real World Failure Thresholds项目地址: https://gitcode.com/GitHub_Trending/sc/scrutinyScrutiny 作为一款硬盘 S.M.A.R.T 监控与历史趋势分析工具会持续采集 S.M.A.R.T 属性、自检结果、温度与磁盘容量等时序数据若不加控制InfluxDB 数据库将无限膨胀。本文围绕 docs/DOWNSAMPLING.md 展开完整讲解 Scrutiny 内建的四级降采样downsampling体系每个 bucket 的保留期、聚合范围与窗口、cron 调度以及底层 Flux 任务脚本与查询侧的分桶路由逻辑。读完本文你将能理解 Scrutiny 如何在短期精确与长期可趋势分析之间取得平衡并掌握通过retention_policy配置、InfluxDB Task 与分桶命名约定来控制数据生命周期的完整方案。为什么要降采样短期要精确长期只要趋势Scrutiny 的 collector 会周期性地向 InfluxDB 写入大量数据包括S.M.A.R.T 属性数据smartS.M.A.R.T 自检数据smart test温度数据temp磁盘容量/使用率等指标disk metrics这些数据在短期内必须精确——你需要看到此刻这块盘的温度是多少、累计通电时间是多少但做长期趋势分析时单个数据点并不重要真正有价值的是聚合结果例如过去一年里通电时间大致以什么速度增长温度的季节性变化。如果保留所有原始数据点数据库会无界增长如果直接丢弃旧数据又无法进行跨月、跨年的趋势对比。Scrutiny 的解决方案是按调度自动对旧数据进行降采样downsample用聚合数据替代原始数据并对聚合后的 bucket 设置不同的保留期限从而在数据库体积与历史数据可用性之间取得平衡。从源码看这一整套机制由后端仓库层scrutiny_repository.go在首次启动时自动初始化EnsureBuckets负责创建各级 bucket 并设置保留规则EnsureTasks负责在 InfluxDB 中注册周期性的降采样 Task二者都在 NewScrutinyRepository 初始化流程中被调用因此对用户来说几乎是零配置的。四层 bucket 体系与保留期Scrutiny 基于 InfluxDB 2.x 的 bucket 体系实现降采样围绕配置项web.influxdb.bucket默认主 bucket 名为metrics派生出一组带后缀的派生 bucket。完整的分桶与调度参数如下表摘自原文档Bucket 名称保留期降采样范围降采样聚合窗口降采样 Cron说明metrics15 天-2w -1w1w每周日凌晨 1:00主 bucket接收 collector 写入的原始数据metrics_weekly9 周-2mo -1mo1mo每月 1 日凌晨 1:30周聚合数据metrics_monthly25 个月-2y -1y1y每年 1 月 1 日凌晨 2:00月聚合数据metrics_yearly永久---年聚合数据无限期保留上表中的保留期与调度参数在源码中均有对应常量与硬编码值保留期常量定义于 scrutiny_repository.goRETENTION_PERIOD_15_DAYS_IN_SECONDS 1_296_00015 天、RETENTION_PERIOD_9_WEEKS_IN_SECONDS 5_443_2009 周、RETENTION_PERIOD_25_MONTHS_IN_SECONDS 65_318_40025 个月。三个降采样 Task 的 cron 分别注册为0 1 * * 0、30 1 1 * *、0 2 1 1 *任务名分别为tsk-weekly-aggr、tsk-monthly-aggr、tsk-yearly-aggr见 scrutiny_repository_tasks.go。值得注意的是所有 bucket 名称都基于web.influxdb.bucket动态生成例如主 bucket 为metrics时派生 bucket 为metrics_weekly、metrics_monthly、metrics_yearly见EnsureBuckets中的fmt.Sprintf(%s_weekly, ...)模式scrutiny_repository.go。如果你自定义了 bucket 名派生 bucket 会随之改名。retention_policy 配置项的作用EnsureBuckets中有一段关键逻辑只有当配置项web.influxdb.retention_policy为true时才会为 bucket 设置保留规则scrutiny_repository.go。对应配置位于 example.scrutiny.yaml 的web.influxdb段落web: influxdb: host: 0.0.0.0 port: 8086 retention_policy: true源码注释给出了该配置的用途在测试环境中可以将其设为false这样就能写入带旧时间戳的数据、并手动触发降采样脚本来验证行为而生产环境应当保持true让 InfluxDB 自动按保留期清理过期数据。此外EnsureBuckets对已存在的 bucket 也会主动校正其保留规则UpdateBucket确保与配置保持一致。降采样如何执行InfluxDB Task 与 Flux 脚本降采样不是由 Scrutiny 进程本身完成而是注册为InfluxDB 2.x 的 Task定时任务。EnsureTasks在每次启动时检查三个任务是否存在不存在则创建已存在且 Flux 脚本与当前生成的脚本不一致则更新scrutiny_repository_tasks.go。这意味着升级 Scrutiny 后降采样脚本会自动同步无需手动维护 InfluxDB 侧的任务。实际的 Flux 脚本由DownsampleScript方法生成scrutiny_repository_tasks.go其核心参数随聚合级别切换聚合级别sourceBucketdestBucketrangeStartrangeEndaggWindowweeklymetricsmetrics_weekly-2w-1w1wmonthlymetrics_weeklymetrics_monthly-2mo-1mo1moyearlymetrics_monthlymetrics_yearly-2y-1y1y以 weekly 任务为例实际注册到 InfluxDB 的 Flux 脚本如下与单元测试 scrutiny_repository_tasks_test.go 中的断言完全一致option task { name: tsk-weekly-aggr, cron: 0 1 * * 0, } sourceBucket metrics rangeStart -2w rangeEnd -1w aggWindow 1w destBucket metrics_weekly destOrg scrutiny from(bucket: sourceBucket) | range(start: rangeStart, stop: rangeEnd) | filter(fn: (r) r[_measurement] smart ) | group(columns: [device_wwn, _field]) | aggregateWindow(every: aggWindow, fn: last, createEmpty: false) | to(bucket: destBucket, org: destOrg) from(bucket: sourceBucket) | range(start: rangeStart, stop: rangeEnd) | filter(fn: (r) r[_measurement] temp) | group(columns: [device_wwn]) | toInt() | aggregateWindow(fn: mean, every: aggWindow, createEmpty: false) | set(key: _measurement, value: temp) | set(key: _field, value: temp) | to(bucket: destBucket, org: destOrg)这段脚本揭示了两个重要的设计细节降采样范围刻意滞后一个周期例如 weekly 任务处理的是-2w到-1w的数据而不是最近一周。这是为了保证上一周期的数据已经完整写入避免把正在写入的窗口聚合进去确保聚合结果的完整性。不同数据类型使用不同的聚合函数S.M.A.R.T 属性smartmeasurement按device_wwn与_field分组后使用last聚合——因为 S.M.A.R.T 属性多为累计值如通电时间、重映射扇区数取最后一个值才正确温度数据tempmeasurement则先toInt()再使用mean聚合——取一段时间内的平均温度更有趋势意义。源码中有一处 TODO 也提到last聚合未来可能会被更精确的表示方式替代scrutiny_repository_tasks.go 的注释中保留了更复杂的 Flux 草案对 string/bool 类型取last、对 int/float 类型取mean后再union。不同时间尺度的数据点分布5 个月与 5 年理解了范围滞后 窗口聚合 分桶保留之后就能推算任一时刻各级 bucket 中每个磁盘的数据点数量。运行 5 个月后的数据点分布假设主 bucket 每 7 天写入一批数据collector 默认每天运行一次经过 5 个月后单个磁盘在各 bucket 中的数据点大致如下原文档表格Bucket 名称数据点数量说明metrics157 个每日数据点 最多 7 个待处理数据点 1 个缓冲数据点metrics_weekly94 个已聚合的周数据点 4 个待处理数据点 1 个缓冲数据点metrics_monthly33 个已聚合的月数据点metrics_yearly0尚未有年聚合数据运行 5 年后的数据点分布5 年后各级 bucket 中的数据点分布如下原文档表格原文档中该表的具体数值未展开以-占位仅示意各级 bucket 仍按各自保留期与聚合周期运转Bucket 名称数据点数量说明metrics-原始数据按 15 天保留期滚动淘汰metrics_weekly-周聚合数据按 9 周保留期滚动淘汰metrics_monthly-月聚合数据按 25 个月保留期滚动淘汰metrics_yearly-年聚合数据永久保留可以看到这套体系的核心思想是越新的数据精度越高、保留期越短越旧的数据精度越低、保留期越长直至永久。15 天的原始数据足够支撑短期精确查询而年聚合数据则可无限期支撑这台盘 5 年前的通电时间/温度水平这类长期对比。查询侧的分桶路由数据从哪来降采样体系的另一面是查询侧如何正确地从正确的 bucket 取数据。Scrutiny 在后端维护了一套 duration key 到 bucket 名称与时间范围的映射scrutiny_repository.goduration key对应 bucket查询时间范围嵌套查询的 bucket 集合weekmetrics-1w~now()metricsmonthmetrics_weekly-1mo~-1wmetricsmetrics_weeklyyearmetrics_monthly-1y~-1mometricsmetrics_weeklymetrics_monthlyforevermetrics_yearly-10y~-1y全部四个 bucketlookupBucketName/lookupDuration/lookupNestedDurationKeys三个方法共同决定了查询行为主数据查询GetSummary直接对metrics、metrics_weekly、metrics_monthly、metrics_yearly四个 bucket 同时发起查询取每个字段的last()值后union排序从而在任意时刻拿到最新已知值scrutiny_repository.go。温度历史查询GetSmartTemperatureHistory通过aggregateTempQuery生成 Flux按 duration key 递归地查询嵌套 bucket例如forever会同时对四个 bucket 查询并union再统一按 1 小时窗口做mean聚合后输出scrutiny_repository_temperature.go。这套按时间尺度路由到不同 bucket的机制配合降采样 Task构成了完整的数据生命周期闭环写入端只有metrics读取端按时间范围透明地跨 bucket 读取聚合与淘汰则由 InfluxDB Task 与保留规则自动完成。验证与测试降采样脚本的正确性保障降采样脚本由大量单元测试守护可直接在仓库中查阅scrutiny_repository_tasks_test.goTest_DownsampleScript_Weekly、Test_DownsampleScript_Monthly、Test_DownsampleScript_Yearly分别断言三个聚合级别生成的完整 Flux 脚本与期望输出逐字符一致使用 mock 配置固定web.influxdb.bucketmetrics、web.influxdb.orgscrutiny。scrutiny_repository_temperature_test.goTest_aggregateTempQuery_Week/Month/Year/Forever验证温度历史查询在 week、month、year、forever 四种时间尺度下的分桶路由与 Flux 生成逻辑。这些测试同时起到了文档化的作用如果你想知道某次升级后降采样脚本到底变成了什么样运行go test ./webapp/backend/pkg/database/...或直接阅读测试中的断言字符串即可。运维实践要点综合原文档与源码实现使用与排查降采样机制时有以下几个关键点保留期与调度均不可通过 YAML 配置bucket 保留期、Task cron 都在源码中硬编码scrutiny.yaml中与降采样直接相关的只有web.influxdb.retention_policy以及web.influxdb.bucket、web.influxdb.org这两个影响 bucket 命名与组织归属的配置项。collector 的采集频率可通过COLLECTOR_CRON_SCHEDULE环境变量调整见 rootfs/etc/cron.d/scrutiny但降采样 Task 本身不可配置。InfluxDB Task 在首次启动时自动注册无需手动创建如果手动删除了任务重启 web 容器即可重建。任务名固定为tsk-weekly-aggr、tsk-monthly-aggr、tsk-yearly-aggr。生产环境保持retention_policy: true否则 bucket 不会设置保留规则原始数据不会被自动清理数据库仍会无界增长。排查数据缺失时注意时间滞后weekly/monthly/yearly 任务的聚合范围分别滞后 1 周/1 月/1 年刚部署完成时派生 bucket 中不会有数据这是正常现象需要等待首个聚合周期结束。手动验证降采样在测试环境retention_policy: false中写入带旧时间戳的数据后可手动执行 InfluxDB 侧的 Task 或直接运行生成的 Flux 脚本来验证聚合结果。通过理解这套多级分桶 滞后窗口聚合 分级保留的设计你可以清楚地回答Scrutiny 的数据到底存在哪、会保留多久、何时被聚合这三个问题也能够在自定义 bucket 名、调整部署架构或排查历史趋势数据异常时快速定位到正确的配置与源码位置。【免费下载链接】scrutinyHard Drive S.M.A.R.T Monitoring, Historical Trends Real World Failure Thresholds项目地址: https://gitcode.com/GitHub_Trending/sc/scrutiny创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表