InfluxDB 与 Telegraf —— TICK 栈的时序存储引擎与采集代理

运维监控软件手册 01-指标采集与时序存储 17.3 KB 原文

InfluxDB 与 Telegraf —— TICK 栈的时序存储引擎与采集代理

分类:01 指标采集与时序存储 适用:主机/容器/物联网/应用指标采集与高频写入;单机到中等规模,需 SQL 式或函数式时序查询 一句话:InfluxDB 负责高性能时序存储与查询,Telegraf 以插件化方式采集并处理指标后写入,两者合为 TICK 栈核心 官方:https://docs.influxdata.com/ | https://github.com/influxdata/influxdb | https://github.com/influxdata/telegraf 授权:InfluxDB OSS 与 Telegraf 均为开源(具体 LICENSE 以官方仓库为准),另有企业版与云服务

版本与镜像 tag 以官方最新稳定版为准:官方已提示 Docker latest 会指向 InfluxDB 3 Core,生产必须用具体版本 tag。本文以同时支持 InfluxQL 与 Flux 的 InfluxDB 2.x OSS 为主线。

1. 它解决什么问题

痛点 InfluxDB + Telegraf 的应对
指标来源杂乱(主机、容器、MQ、IoT) Telegraf 200+ 插件统一采集、清洗、路由
传统库写入吞吐与按时间范围查询效率低 TSM/列式存储针对时间戳与高写入优化
数据无限增长 retention policy / bucket 保留期自动过期 + 降采样任务
采集端需要改标签、转类型、过滤 processors / aggregators 写入前完成 ETL
缺可视化与告警闭环 Chronograf(UI)+ Kapacitor(告警)补齐 TICK 栈

不负责:日志/链路追踪、跨集群全局 PromQL 视图、原生多租户集群(OSS 单机)。

2. 核心概念与架构

数据模型(务必分清 tag 与 field)

术语 含义
measurement 相当于"表",如 cpu、http_requests
tag 字符串、带索引,用于过滤与 GROUP BY;tag 组合决定 series 数量
field 实际数值、不带索引,如 usage=42.5;同一 field 类型必须一致
timestamp 纳秒精度,可省略(用服务端时间);precision=s/ms/us/ns
point / series 一条数据 / measurement + tag set + field key 唯一组合,series cardinality 是容量核心
retention policy / bucket 1.x 的 RP(duration/replication)/ 2.x 的 bucket(含保留期)
database / org / bucket 1.x 用 database+RP;2.x 用 organization + bucket + token
TICK 栈 Telegraf 采集 + InfluxDB 存储 + Chronograf UI + Kapacitor 告警

line protocol(严格结构)

measurement,tag_key=tag_value,tag2=v2 field_key=field_value,field2=v2 timestamp
# 例:
cpu,host=web01,region=cn usage_idle=57.5,usage_user=42.5 1690000000000000000

规则:measurement 与 tag 用逗号、tag 与 field 用空格分隔;空格/逗号/等号须转义;字符串 field 加双引号,tag 值一律不加;时间戳默认纳秒。

组件与数据流

  Exporter/主机/MQ/DB ──> Telegraf ───────────────┐
   /metrics(Prometheus) ─> inputs.prometheus ────┤
        [agent] 调度 + [[inputs.*]] 采集          │
        [[processors.*]] 清洗 + [[aggregators.*]] │
        [[outputs.influxdb_v2]] 输出              │
                              v                  v
                  POST /api/v2/write ──> InfluxDB(8086)
                    (org/bucket/token)    │ TSM 存储 + TSI 索引
                                          │ retention 自动过期
  Chronograf(8888)/Grafana ──InfluxQL/Flux──> InfluxDB
  Kapacitor(9092) ──告警──> Slack/邮件/Webhook/Alertmanager 网关
版本 查询语言 组织单位 写入端点 CLI
1.x InfluxQL database + RP /write?db=<db> influx -execute
2.x(主线) Flux + InfluxQL 兼容 org + bucket /api/v2/write influx
3.x SQL + InfluxQL(Flux 不再支持) database/table /api/v2/write 兼容 influxdb3

⚠️ 大版本间数据格式与查询语言不兼容,跨版本须走官方迁移工具,不能原地回滚。

3. 安装与部署

3.1 环境准备

项 要求
系统 / 磁盘 Linux x86_64/ARM64;数据目录用本地 SSD(2.x 默认 ~/.influxdbv2)
时钟 / 端口 NTP 同步;InfluxDB 8086、Chronograf 8888、Kapacitor 9092;Telegraf 默认不监听
权限 专用非 root 用户;2.x 初始化后妥善保存 admin token

3.2 多种安装方式

A. 包仓库(官方 repos.influxdata.com)

wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main" > /etc/apt/sources.list.d/influxdata.list
apt-get update && apt-get install -y influxdb2 telegraf

B. Docker / docker compose

services:
  influxdb:
    image: influxdb:<version>
    volumes: ["./influxdb2:/var/lib/influxdb2"]
    ports: ["8086:8086"]
  telegraf:
    image: telegraf:<version>
    volumes: ["./telegraf.conf:/etc/telegraf/telegraf.conf:ro"]
    depends_on: [influxdb]

⚠️ 镜像 tag 必须写具体版本,勿用 latest(官方已指向 InfluxDB 3 Core)。

C. 二进制 + systemd

# 下载页 https://portal.influxdata.com/downloads/ ,资产名以该页为准
curl -LO "https://dl.influxdata.com/influxdb/releases/influxdb2-<version>-linux-amd64.tar.gz"
install -m 0755 influxdb2-<version>/influxd /usr/local/bin/influxd
useradd -r -s /sbin/nologin influxdb
systemctl daemon-reload && systemctl enable --now influxdb telegraf
# /etc/systemd/system/influxdb.service
[Unit]
[Service]
User=influxdb
ExecStart=/usr/local/bin/influxd --engine-path=/var/lib/influxdb2/engine --bolt-path=/var/lib/influxdb2/influxd.bolt
Restart=on-failure
[Install]
WantedBy=multi-user.target

D. Kubernetes Helm

helm repo add influxdata https://helm.influxdata.com/ && helm repo update
helm install influx influxdata/influxdb2 -n monitoring --create-namespace
helm install telegraf influxdata/telegraf -n monitoring -f telegraf-values.yaml

E. 一键初始化(2.x)

influx setup --username <admin> --password <password> --org <org> --bucket <bucket> --retention 30d --token <token> --force

3.3 首次启动与验证

curl -s http://localhost:8086/health && echo
telegraf --config /etc/telegraf/telegraf.conf --test
curl -s -X POST 'http://localhost:8086/api/v2/write?org=<org>&bucket=<bucket>&precision=s' -H 'Authorization: Token <token>' --data-binary 'smoke,host=init value=1'

浏览器打开 http://<host>:8086 进入 InfluxDB UI(Data Explorer)。

4. 配置文件详解

主配置路径:InfluxDB 2.x 无单一 conf(influxd flag:--engine-path / --bolt-path / --http-bind-address);1.x 为 /etc/influxdb/influxdb.conf;Telegraf 为 /etc/telegraf/telegraf.conf + 分片目录 telegraf.d/(TOML)。

载体 路径 / flag 说明
InfluxDB 2.x --engine-path / --bolt-path TSM 数据 / 元数据
Telegraf /etc/telegraf/telegraf.conf [agent] + [[inputs/processors/aggregators/outputs.*]]
关键项 含义 建议
bucket --retention 保留期 按容量设,如 30d
1.x cache-max-memory-size / max-series-per-database 写缓存 / series 上限 防 OOM、防基数爆炸
1.x index-version = "tsi" 启用 TSI 索引 高基数必开
[agent] interval / flush_interval 采集 / 刷写周期 10s / 10s
metric_batch_size / metric_buffer_limit 每批点数 / 缓冲上限 缓冲 ≥ 批大小数倍
[[outputs.influxdb_v2]] 2.x 输出 urls token organization bucket
[[outputs.influxdb]] 1.x 输出 urls database username password

完整可运行最小示例

# /etc/telegraf/telegraf.conf
[agent]
  interval = "10s"
  flush_interval = "10s"
  metric_batch_size = 1000
  metric_buffer_limit = 10000
[[inputs.cpu]]
  percpu = false
  totalcpu = true
  fieldpass = ["usage_idle", "usage_user"]
[[inputs.disk]]
[[processors.rename]]
  [[processors.rename.replace]]
    tag = "host"
    dest = "hostname"
[[outputs.influxdb_v2]]
  urls = ["http://<influx>:8086"]
  token = "<token>"
  organization = "<org>"
  bucket = "metrics"
telegraf --config /etc/telegraf/telegraf.conf --test

5. 核心使用方法(CLI / HTTP API / InfluxQL / Flux / Telegraf 配置)

写入与查询 API / CLI

curl -s -X POST 'http://<influx>:8086/api/v2/write?org=<org>&bucket=<bucket>&precision=s' -H 'Authorization: Token <token>' --data-binary @metrics.lp
curl -s -X POST 'http://<influx>:8086/api/v2/query?org=<org>' -H 'Authorization: Token <token>' -H 'Content-Type: application/vnd.flux' --data @query.flux
curl -s -X POST 'http://<influx>:8086/query?db=<db>&q=SHOW+MEASUREMENTS'
curl -s -X POST 'http://<influx>:8086/write?db=<db>' --data-binary 'cpu,host=a usage=1'
influx write -b <bucket> -o <org> -t <token> -f metrics.lp --format lp
influx query 'from(bucket:"<bucket>") |> range(start:-1h)' -o <org> -t <token>
influx bucket list -o <org> -t <token>
influx bucket create -n <bucket> -o <org> -r 30d -t <token>
influx auth list -o <org> -t <token>
influx backup /backup/influx-$(date +%F) -t <token>

InfluxQL 示例(1.x 原生 / 2.x 兼容层)

CREATE DATABASE metrics WITH DURATION 30d NAME rp_30d
SHOW MEASUREMENTS
SHOW SERIES CARDINALITY
SELECT mean("usage_idle") FROM "cpu" WHERE "host" = 'web01' AND time > now() - 1h GROUP BY time(5m), "region" fill(null)
SELECT derivative(mean("usage_user"), 1m) FROM "cpu" WHERE time > now() - 6h GROUP BY time(5m)
SELECT * INTO "rp_long"."cpu_5m" FROM "cpu" GROUP BY time(5m), *

Flux 示例(2.x)

from(bucket: "metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_idle" and r.host == "web01")
  |> aggregateWindow(every: 5m, fn: mean, createEmpty: false)
  |> yield(name: "mean")

Telegraf 配置与运维命令(inputs / outputs / processors / aggregators)

telegraf config > telegraf.conf
telegraf --input-filter cpu:mem:disk --output-filter influxdb_v2 config > telegraf.conf
telegraf --config telegraf.conf --test
telegraf --config telegraf.conf --config-directory /etc/telegraf/telegraf.d --test-warn
systemctl {start|stop|restart|status} telegraf
journalctl -u telegraf -f

UI:http://<host>:8086 的 Data Explorer 可切换 Flux/InfluxQL、建 dashboard、配 Checks;Chronograf http://<host>:8888 为经典 TICK UI。以上共 30+ 条可用命令。

6. 告警与通知

InfluxDB 2.x 内置 Checks(阈值/死人开关)+ Notification Endpoints/Rules(Slack、HTTP、PagerDuty、SMTP);经典 TICK 栈用 Kapacitor 订阅数据并用 TICKscript 告警。

# /etc/kapacitor/cpu_alert.tick
stream
  |from()
    .measurement('cpu')
  |alert()
    .crit(lambda: "usage_idle" < 10)
    .webhook('<webhook-url>')
kapacitor define cpu_alert -tick cpu_alert.tick -dbrp telegraf.rp_30d
kapacitor enable cpu_alert
对接对象 方式
Grafana 添加 InfluxDB 数据源,语言选 InfluxQL(1.x)或 Flux(2.x);Grafana 告警可直接基于该数据源
Alertmanager InfluxDB 2.x / Kapacitor 的 Webhook endpoint 指向 Alertmanager 转发网关(或桥接服务转换);无原生直连
通知渠道 Slack / Webhook / PagerDuty / SMTP,在 Notification Endpoint 配置

7. 实战场景

场景一:把现有 Prometheus 数据平滑接入 / 迁移到 InfluxDB(双跑零停机)

目标:不改现有 Prometheus 抓取,用 Telegraf 并行抓同样 exporter 写入 InfluxDB,验证后切读,随时可回退。

telegraf --config /etc/telegraf/telegraf.d/prom-to-influx.conf --test
systemctl restart telegraf
curl -s -X POST 'http://<influx>:8086/api/v2/query?org=<org>' -H 'Authorization: Token <token>' -H 'Content-Type: application/vnd.flux' --data 'from(bucket:"metrics") |> range(start:-10m) |> filter(fn:(r)=>r._measurement=="node_cpu_seconds_total") |> count()'
# /etc/telegraf/telegraf.d/prom-to-influx.conf
[[inputs.prometheus]]
  urls = ["http://<node-exporter>:9100/metrics", "http://<app-exporter>:8080/metrics"]
  metric_version = 2
[[outputs.influxdb_v2]]
  urls = ["http://<influx>:8086"]
  token = "<token>"
  organization = "<org>"
  bucket = "metrics"

验证:Flux count() 持续增长;Grafana 双数据源曲线重合;telegraf --test 输出含目标 measurement。 回滚:删该 .conf 并重启 Telegraf;Grafana 数据源改回 Prometheus;已写数据保留不删,源 Prometheus 全程未改动。

场景二:主机指标全链路采集 + 标签治理 + 类型清洗

目标:CPU/内存/磁盘统一采集,入口改标签、转类型、聚合,写入带 30 天保留的 bucket。

[agent]
  interval = "10s"
  flush_interval = "10s"
  metric_buffer_limit = 10000
[[inputs.cpu]]
  percpu = false
  totalcpu = true
[[inputs.mem]]
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs"]
[[processors.rename]]
  [[processors.rename.replace]]
    tag = "host"
    dest = "hostname"
[[processors.converter]]
  [[processors.converter.fields]]
    integer = ["bytes_sent", "bytes_recv"]
[[outputs.influxdb_v2]]
  urls = ["http://<influx>:8086"]
  token = "<token>"
  organization = "<org>"
  bucket = "metrics"
telegraf --config telegraf.conf --test | head -20
systemctl restart telegraf

验证:--test 输出含 hostname 标签且字段为整型;Data Explorer 能查到点。回滚:切回备份 telegraf.conf 并重启,bucket 数据按保留期自动过期。

场景三:降采样 + 分级保留,控制长期成本

目标:热 bucket 留 30 天原始点,冷 bucket 存 5 分钟均值留 1 年。

influx bucket create -n metrics_long -o <org> -r 365d -t <token>
influx task create -o <org> -t <token> -f downsample.flux
curl -s -X POST 'http://<influx>:8086/query?db=metrics' --data-urlencode 'q=CREATE CONTINUOUS QUERY cq_5m ON metrics BEGIN SELECT mean(usage_idle) INTO "rp_long"."cpu_5m" FROM "cpu" GROUP BY time(5m), * END'
option task = {name: "downsample_5m", every: 5m}
from(bucket: "metrics")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> aggregateWindow(every: 5m, fn: mean)
  |> to(bucket: "metrics_long", org: "<org>")

验证:influx task list 状态 active;metrics_long 有 5m 间隔点。回滚:influx task delete --id <task-id> -t <token>,冷数据保留。

8. 日常运维与故障排查

systemctl restart influxdb telegraf
journalctl -u telegraf -f | grep -iE 'error|warn'
curl -s http://<influx>:8086/health
curl -s http://<influx>:8086/metrics | grep -E 'influxdb_(write|query)'
telegraf --config /etc/telegraf/telegraf.conf --test
influx bucket list -o <org> -t <token>
现象 原因 处置
写入 400 field type conflict 同一 field 写入不同类型 固定类型;用 processors.converter 统一
内存暴涨 / OOM ⚠️ tag 高基数致 series cardinality 爆炸 高基数值改放 field;1.x 开 TSI、设 max-series-per-database
line protocol 解析失败 tag/field 顺序错、特殊字符未转义 按格式检查并转义
Telegraf 无数据但进程正常 token 权限错 / bucket 不存在 / 静默丢弃 telegraf --test、看日志、influx bucket list
2.x 调用 1.x /write?db= 报 404 版本端点混用 改用 /api/v2/write + Token 头
磁盘持续增长 未设 retention / 降采样任务失效 建带 -r 的 bucket、检查 influx task list

9. 性能、容量与高可用

项 公式 / 经验
series 基数 ≈ 每个 measurement 的 tag 组合数 × field 数;⚠️ 勿把 user_id/request_id 放 tag
磁盘 disk ≈ series_count × points/day × retention_days × bytes_per_point;TSM 压缩后经验 1~3 Byte/点,须压测校准
写入吞吐 与 metric_batch_size、flush_interval、磁盘 IOPS 相关;批大小建议 1000~5000
调优参数 interval / flush_interval / metric_batch_size / metric_buffer_limit / precision;1.x cache-max-memory-size、index-version=tsi
自监控 InfluxDB /metrics + Telegraf [[inputs.internal]] 写入独立 bucket,用另一套实例监控生产实例
  • 高可用:OSS 为单机(无原生集群 HA);用 Telegraf 多 [[outputs.influxdb_v2]] 双写到两个实例 + 反代读均衡,或选企业版/云集群;Telegraf 无状态可水平扩展。
  • 降采样 / 保留:bucket -r 自动过期;Flux task(2.x)/ 连续查询 + RP(1.x)把高频明细聚合成 5m/1h 冷数据;多 bucket 分层。

10. 安全加固、备份与升级

项 做法
认证 2.x 全 API 需 Authorization: Token <token>,用 influx auth create 发最小权限 token;⚠️ 1.x 默认无认证,须 auth-enabled = true
TLS influxd --tls-cert/--tls-key 或 Nginx 反代终止;Telegraf 输出用 https:// + insecure_skip_verify = false
备份 / 恢复 2.x influx backup <dir> / influx restore <dir> -t <token>;1.x influxd backup -portable / restore -portable;恢复前停服
升级 读 CHANGELOG → 备份 → 停服换二进制/镜像 tag → 验证 /health;⚠️ 跨 1.x→2.x→3.x 需官方迁移工具
回滚 保留旧二进制、备份与配置;⚠️ 大版本数据格式/查询语言不兼容,先在预发验证
influx backup /backup/influx-$(date +%F) -t <token>
systemctl stop influxdb && cp -a /var/lib/influxdb2 /backup/influxdb2-$(date +%F)
systemctl start influxdb && curl -s http://localhost:8086/health
influx restore /backup/<date> -t <token>

11. 常见坑

# 现象 原因 解决
1 ⚠️ 内存被打爆、写入变慢 把 user_id/request_id 放成 tag 改放 field 或丢弃;限制 tag 取值集合
2 写入 400 类型冲突 同一 field 写 int/string 混用 固定类型,用 processors.converter 统一
3 数据落在 1970 年或未来 时间戳精度与 precision 不一致 统一 ns 或显式 s/ms/us/ns
4 line protocol 解析失败 tag/field 顺序错、特殊字符未转义 按格式检查并转义
5 ⚠️ Docker latest 升级后 API 全变 官方 latest 已指向 InfluxDB 3 Core 固定具体版本 tag,先过预发
6 2.x 上报 404/401 误用 1.x /write?db= 与 influx -execute 用 /api/v2/write + Token + org/bucket
7 ⚠️ 磁盘被撑满 未设 bucket retention、任务失效 建带 -r 的 bucket,检查 influx task list
8 Telegraf 静默丢数据 token 权限不足 / bucket 不存在 / 缓冲过小 telegraf --test、看日志、调 metric_buffer_limit
9 ⚠️ 直接删 engine/wal 目录"清数据" 破坏 TSM 结构 用 retention 过期或 influx delete(以官方文档为准)
10 Flux 查询在 3.x 报语法错 3.x 不再支持 Flux 用 SQL/InfluxQL;Flux 仅 2.x

12. 速查表

类别 项 值 / 命令
默认端口 InfluxDB / Chronograf / Kapacitor 8086 / 8888 / 9092
配置 Telegraf 主配置 / 分片目录 /etc/telegraf/telegraf.conf / telegraf.d/
写入格式 line protocol measurement,tag=v field=v timestamp
API 2.x 写入 / 查询 POST /api/v2/write、POST /api/v2/query
API 健康 / 自监控 GET /health、GET /metrics
认证 2.x 请求头 Authorization: Token <token>
CLI 初始化 / bucket influx setup、influx bucket list/create
CLI 写入 / 查询 influx write、influx query
CLI 备份 / 恢复 influx backup <dir>、influx restore <dir>
查询语言 1.x / 2.x / 3.x InfluxQL / Flux+InfluxQL / SQL+InfluxQL
Telegraf 插件段 [[inputs.*]] / [[processors.*]] / [[aggregators.*]] / [[outputs.*]]
Telegraf 输出 2.x / 1.x [[outputs.influxdb_v2]] / [[outputs.influxdb]]
Telegraf 常用输入 / 自监控 cpu mem disk net prometheus exec / [[inputs.internal]]
仓库 官方包仓库 / 下载页 https://repos.influxdata.com/ / https://portal.influxdata.com/downloads/
服务 启停 systemctl {start|stop|restart|status} influxdb telegraf

13. 选型建议与同类对比

维度 InfluxDB + Telegraf Prometheus VictoriaMetrics TimescaleDB
数据模型 measurement / tag / field metric + labels metric + labels(Prom 兼容) 关系表 + hypertable
查询语言 InfluxQL / Flux / SQL(3.x) PromQL MetricsQL ⊃ PromQL 标准 SQL
采集 Telegraf 插件(拉 + 推) 主动 scrape vmagent / remote write 需外部写入
生态定位 通用时序平台 + IoT Kubernetes 云原生 Prometheus 远程存储 关系型 + 时序混合
集群 HA OSS 单机,企业版才有 单点为主 集群版原生 基于 PostgreSQL HA
高基数容忍 低(tag 基数敏感) 中 高 中

何时选:多源异构指标(主机/IoT/MQ)、需要 SQL 式或函数式查询、想要采集端强 ETL、团队熟悉 TICK 栈。 何时不选:纯 Kubernetes/Prometheus 生态且要全局 PromQL 视图(选 VictoriaMetrics/Thanos);tag 基数极高;需要 OSS 原生多机 HA;核心诉求是日志/链路追踪。

14. 参考链接

InfluxDB 与 Telegraf —— TICK 栈的时序存储引擎与采集代理 - 知识库 - 起航社区