本节摘要:运维监控、IoT 与金融三类场景对写入模式、时间精度、查询形态要求不同。Kubernetes 监控 99% 查询是
sum(rate(...[5m])) by (job);IoT 网关批量 push 多 field;金融 tick 要求微秒时间戳与低 jitter。本节用矩阵对照四家 TSDB 的适配度。
阅读完本节,你应当能够:
TSDB 不是单一产品品类。运维监控关心「最新 5 分钟是否异常」;IoT 关心「百万设备 append 与边缘带宽」;金融 关心「tick 顺序与回放精度」。同一套「P99 写入延迟」口号无法同时满足三者——VictoriaMetrics 案例显示:启用 ZSTD 后写入吞吐降 37%,但 P99 查询延迟降 62%,说明 freshness 与压缩 本身就在拉扯。
| 场景 | 写入特征 | 查询特征 | 时间精度 | 首选倾向 |
|---|---|---|---|---|
| K8s/APM 监控 | Pull、中等 cardinality | rate/histogram_quantile | 毫秒 | Prometheus 系 |
| 工厂 IoT | Push 突发、高吞吐 | 设备级窗口、降采样 | 毫秒~微秒 | Influx / QuestDB |
| 能源/电力 SCADA | 周期性采样 | 长周期趋势、对齐 | 毫秒 | Timescale + SQL |
| 高频行情 | 极高 append | tick 回放、asof join | 微秒~纳秒 | QuestDB / 专用 |
三类的差异其实可以量化到一张 SLA 表,选型时对着打勾即可:
| SLA 维度 | 运维监控 | IoT | 金融 tick |
|---|---|---|---|
| 写入模式 | 定时 pull、稳定 | 突发 batch、高峰海量 | 持续高频 append |
| 关键延迟 | 告警 1min 内出 | 采集→可见秒级 | 查询端到端毫秒内 |
| 时间精度要求 | 毫秒足够 | 毫秒~微秒 | 微秒~纳秒 |
| 保留周期 | 15~90 天 | 数月~数年 | 数年合规回放 |
| 一致性侧重 | 查询结果稳定 | 丢点可容忍、成本敏感 | 顺序严格、不可丢 |
这张表说明:没有一款产品能在所有 SLA 上同时拿满分,选型是找到「与你的 SLA 最匹配」而非「绝对最快」的产品。
Pod 每 5s 上报 container_cpu_usage_seconds_total,本质是 cgroup counter 差分求 rate。查询高度模板化:sum(rate(http_requests_total[5m])) by (service)。Prometheus 强制 server-side 时间戳(毫秒),避免客户端时钟漂移搞乱因果序——这与 IoT 设备自带 timestamp 的 push 模型形成对比。
OPC UA 网关一次 batch 47 个电池单体温度 field,适合 Influx line protocol 或 QuestDB ILP:单 measurement 多 field,避免 Prometheus「一值一 metric」的 label 膨胀。
边缘侧的正确做法是「先聚合再上云」。假设一个网关每 5 秒上报一次,云上只需要 1 分钟均值:
# 网关侧:Telegraf 配置示意(aggregation + 降采样) [[inputs.exec]] commands = ["/usr/local/bin/read_sensors.sh"] data_format = "influx" interval = "5s" [[processors.aggregate]] period = "1m" drop_original = true [[processors.aggregate.aggregations]] method = "mean" name_append = "_avg"
这样云端收到的是一条 temp_avg,而不是 12 条原始点,带宽与存储同时下降一个数量级。这个模式在 10⁴–10⁶ samples/s 的工业现场几乎是标配。
订单流时间精度逼近 ±37ns 时钟抖动(SOURCE 金融场景描述);需要 append-only 顺序与 asof join,TimescaleDB 的 timestamptz 与 QuestDB 的 designated timestamp 更常见,Prometheus 毫秒精度通常不够。
| 产品 | 监控 | IoT push | 金融 tick | SQL 分析 |
|---|---|---|---|---|
| Prometheus | ★★★★★ | ★★ | ★ | ★★ |
| InfluxDB | ★★★★ | ★★★★★ | ★★★ | ★★★ |
| TimescaleDB | ★★★ | ★★★★ | ★★★★ | ★★★★★ |
| QuestDB | ★★★ | ★★★★ | ★★★★★ | ★★★★ |
监控栈组合:Prometheus 本地 15d + Thanos/VictoriaMetrics 长期存储,是 CNCF 可观测性事实标准;OpenTelemetry metrics 经 OTLP 可写入多种后端。
IoT 边缘:先在网关做 batch 与降采样,避免把 device_serial 级标签直通云端——工业现场单厂可达 10⁴–10⁶ samples/s。
金融合规:保留原始 tick 与聚合层分离;热数据 QuestDB/专用引擎,温冷数据 Parquet + Timescale 外表。
以「求每只股票过去 1 分钟的最高成交价」为例,对比 QuestDB 与 Timescale 的写法,能直观感受 SQL 在金融场景的威力:
-- QuestDB:SAMPLE BY 对齐固定窗口 SELECT symbol, max(price) FROM trades WHERE ts > dateadd('h', -1, now()) SAMPLE BY 1m ALIGN TO CALENDAR; -- TimescaleDB:time_bucket 等效 SELECT time_bucket('1 minute', ts) AS minute, symbol, max(price) FROM trades WHERE ts > now() - interval '1 hour' GROUP BY minute, symbol;
两者都能在秒级内扫完数百万条 tick 并给出窗口聚合。若用 Prometheus 表达「窗口内最大值」会相对别扭——它不是为这种多列、多符号、需要对齐的 tick 查询设计的,这正是「按场景选产品」的直观例证。
遇到一个真实项目时,按下面这个流程走,通常十分钟内能给出合理结论:
⚠️ 常见坑:把订单号、trace_id 写进 Prometheus label——active series 爆炸,告警引擎本身先 OOM。
💡 关键直觉:场景决定「pull vs push」「毫秒 vs 纳秒」「PromQL vs SQL」——先画数据流图,再选产品,而非反过来。
下一章深入 metric-tags-time 模型与分区压缩机制。