Skip to content

SQL 与监控集成:3.x Parquet 引擎与 TIG 栈

基于 InfluxDB 3 Core/Enterprise · 核于 2026-08

速查

  • 3.x 的查询栈SQL(标准 ANSI)→ Apache DataFusion(Rust 查询引擎,解析优化执行)→ Apache Arrow(列式内存格式)→ Parquet(列式存储文件)。四层全开源、全列式。
  • 回归 SQL:3.x 主推标准 SQL,弃用 1.x 的 InfluxQL 与 2.x 的 Flux。SELECT mean(value) FROM cpu WHERE time > now() - interval '1 hour' GROUP BY date_bin(...) 即可查时序。
  • Parquet 列存:底层按列存储 + 高压缩比(相邻时间点的数值相似,delta/run-length 编码压缩极高)。列式聚合(只读需要的列)远快于行存。
  • Apache Arrow 内存格式:查询结果在内存里是列式的 Arrow RecordBatch,可零拷贝传给 Pandas/Polars/Spark/BI——无序列化开销。
  • Apache DataFusion:Rust 写的查询引擎(基于 Arrow),提供 SQL 解析、优化、向量化执行,InfluxDB 3.x 直接复用而非自研。
  • Flight RPC:Apache Arrow Flight 提供高性能远程查询协议(gRPC + Arrow 流),比 HTTP+JSON 快一个数量级,适合大数据量传输。
  • Telegraf:Go 写的采集 agent,插件化——input(数百种数据源)+ processor(转换)+ output(写出)。配置即启用,无需写采集代码。
  • Grafana:可视化平台,原生支持 InfluxDB 数据源(SQL/Flux),写查询画时序图、配告警,是「看监控」的标准界面。
  • TIG 数据流:服务器/应用 → Telegraf 采集 → InfluxDB 存储 → Grafana 查询展示。
  • 3.x 弃用 Flux:Flux 函数式语言学习曲线陡、生态小,3.x 转向 SQL(兼容 DataFusion 的 ANSI SQL + 时序扩展)。

一、3.x 的查询栈:SQL → DataFusion → Arrow → Parquet

3.x 完全重写了查询栈,拥抱开源列式生态:

   用户查询(SQL / InfluxQL / Flight RPC)


   ┌──────────────────┐
   │ Apache DataFusion │  ← SQL 解析、优化、向量化执行
   └────────┬─────────┘
            │ Apache Arrow(列式内存格式)

   ┌──────────────────┐
   │   Parquet 文件    │  ← 列式存储、高压缩、按时间分区
   └──────────────────┘

每一层都关键:

  • SQL 接口:用户写标准 SELECT ... FROM ... WHERE time > ... GROUP BY ...,DataFusion 解析执行。BI 工具(Superset/Metabase)、ORM、数据科学家无需学新语言。
  • DataFusion 执行:基于 Arrow 的向量化执行引擎,按批处理(一次处理一批列向量),CPU 缓存友好、能 SIMD 加速。
  • Arrow 内存格式:执行中间结果与最终结果都是 Arrow 列式表,零拷贝传给下游(Pandas/Polars/Spark/Flight 客户端),无序列化/反序列化开销。
  • Parquet 存储:数据持久化为 Parquet 列式文件,按时间分区(如每天一个文件)。列式压缩(数值列 delta/run-length encoding)让时序数据压缩比常达 10-50 倍。

SQL 查询时序示例

sql
-- 过去 1 小时每分钟 CPU 平均使用率(按 host 分组)
SELECT
  date_bin(INTERVAL '1 minute', time, TIMESTAMP '1970-01-01') AS bucket,
  host,
  AVG(usage) AS avg_usage
FROM cpu
WHERE time > now() - INTERVAL '1 hour'
GROUP BY bucket, host
ORDER BY bucket, host;
  • date_bin:把时间戳按窗口分桶(类似 InfluxQL 的 GROUP BY time(1m))。
  • 聚合函数 AVG/MAX/MIN/SUM/COUNT 直接用,列式执行高效。

二、为何 Parquet + Arrow:列式的胜利

通用行存(MySQL/PG 的 B+ 树)适合事务(取一整行),但分析聚合(只算某列的均值)要读整行浪费 IO。列式存储按列存,聚合时只读目标列:

维度行存(MySQL/PG)列存(Parquet)
存储粒度一行连续存一列连续存
聚合 IO读整行(含无关列)只读目标列
压缩比一般(同列数据类型一致,相似值可 delta/run-length)
适合事务、点查、取整行分析聚合、扫描大范围
随机更新慢(列存追加为主)

时序场景是「写多读少、按时间扫描聚合」,列式是天然契合:写入追加(列存擅长),查询是时间范围扫描 + 列聚合(列存只读目标列)。

Arrow 是 Parquet 的「内存版」——同样是列式,但为内存随机访问优化(Parquet 为磁盘压缩优化)。InfluxDB 3.x 用 Parquet 存盘、用 Arrow 在内存里算,两者格式接近,磁盘↔内存转换开销低。

三、Flight RPC:高性能远程查询

Apache Arrow Flight 是基于 gRPC 的远程查询协议,专门传 Arrow 数据:

  • 零拷贝流式传输:查询结果以 Arrow 流的形式直接传给客户端,无 JSON 序列化/解析。
  • 高吞吐:比 HTTP+JSON 快一个数量级,适合拉取大量时序点。
  • 客户端:Python(PyArrow)、Rust、Java、Go 等都有 Flight 客户端,可直接拉 Arrow 表喂给 Pandas/Polars。
客户端(PyArrow)
   │ Flight gRPC(Arrow 流)

InfluxDB 3.x → Parquet/Arrow → 零拷贝返回


Pandas DataFrame(零拷贝转换)

四、Telegraf:插件化采集 agent

Telegraf 是 InfluxData 出品的采集 agent,用 Go 写,插件化架构:

插件类型作用举例
input抓数据cpumemdisknginxmysqlredisdockerkafka_consumer
processor转换聚合、过滤、重命名、加 tag、单位换算
aggregator聚合窗口 min/max/mean
output写出influxdb_v2/influxdb_v3prometheus_clientkafka
  • 配置即启用:在 telegraf.conf 里启用 input/output 插件,无需写采集代码。想监控 nginx?启用 [[inputs.nginx]] 配个 URL 即可。
  • 轻量稳定:单二进制、内存占用低、长期跑在生产服务器无压力。
  • 不止写 InfluxDB:output 也能写 Prometheus/Kafka/其他,是通用采集层。

五、Grafana:可视化与告警

Grafana 是开源的可视化平台,原生支持 InfluxDB 数据源:

  • 数据源:3.x 用 SQL 数据源(也兼容 1.x/2.x 的 InfluxQL/Flux)。
  • 时序图:写 SQL 查询,结果画成时序折线/热力图/仪表盘。
  • 告警:基于查询配告警规则(CPU 持续 5 分钟超 80% 告警),通知到 Slack/邮件/钉钉。
  • Dashboard 复用:社区有海量现成的 InfluxDB 监控模板。

六、完整 TIG 数据流

  服务器/应用/IoT

       ▼ 采集(input 插件)
  ┌──────────┐  processor/aggregator(清洗聚合)
  │ Telegraf │
  └────┬─────┘
       │ HTTP Line Protocol / Flight
       ▼ 写入
  ┌──────────┐  Parquet 列存 + Arrow
  │ InfluxDB │  SQL / Flight RPC 查询
  └────┬─────┘
       │ 查询

  ┌──────────┐  时序图、仪表盘、告警
  │  Grafana │
  └──────────┘

下一步

掌握数据模型与查询栈后,可进入参考查阅三代 API 对比、降采样/retention 策略速查与易错点清单。