Article

时间序列数据库InfluxDB

更新于:2026-07-16

第一章:InfluxDB 概述

1.1 什么是时序数据库

概念名称说明注意事项
时序数据(Time Series Data)按时间顺序记录的数据点,通常包含时间戳、指标值及相关元数据(如标签)。例如:服务器 CPU 使用率、传感器温度读数等。时序数据具有高写入频率、低更新频率、强时间局部性等特点。
时序数据库(TSDB)专为高效存储、查询和处理时序数据而设计的数据库系统,优化了时间范围查询、数据压缩、降采样等操作。不适合用于频繁更新或复杂事务场景;与关系型数据库定位不同。
数据生命周期管理TSDB 通常支持自动过期(TTL)机制,可按时间策略自动删除旧数据,节省存储成本。需合理设置保留周期,避免关键历史数据被误删。

1.2 InfluxDB 的特点与优势

特性名称说明注意事项
高性能写入支持每秒百万级数据点写入,适用于 IoT、监控等高频采集场景。写入性能受硬件、网络及 schema 设计影响。
内置时间索引自动为时间戳建立高效索引,加速基于时间范围的查询。查询必须包含时间范围(如 range()),否则性能下降。
Line Protocol简洁高效的文本协议,用于向 InfluxDB 发送数据,格式为:measurement,tag_key=tag_value field_key=field_value timestamp标签(tag)用于索引和过滤,字段(field)用于存储实际值;标签值不可为空。
Flux 查询语言InfluxDB 2.x 引入的函数式查询语言,支持数据转换、聚合、连接等复杂操作。Flux 学习曲线较陡,但比 InfluxQL 更强大灵活。
内置可视化与仪表盘提供 Web UI(Data Explorer、Dashboards)支持数据探索与可视化。仅限基础可视化,复杂 BI 需对接 Grafana 等工具。
任务调度与自动化支持通过 Tasks 定期执行 Flux 脚本,实现数据降采样、告警等自动化流程。Task 执行依赖系统资源,需监控其运行状态。
多租户支持通过 Organization 和 Bucket 实现逻辑隔离,适用于多团队或多客户场景。OSS 开源版功能完整,但无官方集群支持;企业版提供高可用方案。

1.3 InfluxDB 1.x 与 2.x 的主要区别

差异项InfluxDB 1.xInfluxDB 2.x注意事项
查询语言使用 InfluxQL(类 SQL 语法)使用 Flux(函数式、管道式语法)两者不兼容,迁移需重写查询逻辑。
数据模型Database + Retention Policy + MeasurementOrganization + Bucket(替代 Database + RP)Bucket 是命名空间+保留策略的组合体。
用户权限基于用户和角色的简单权限控制基于 Token 的 RBAC(细粒度权限控制)2.x 更安全,但配置更复杂。
内置 UI无官方 Web UI(需 Chronograf 或第三方)内置完整 Web 控制台(含 Dashboard、Tasks、Alerts)2.x 开箱即用体验更好。
API 接口多个独立 API(/write, /query 等)统一 RESTful API + 新增 /api/v2 端点2.x API 更规范,支持 OpenAPI。
客户端库支持多种语言,但多基于 1.x 协议官方提供统一 influxdb-client SDK(支持 Python/JS/Go/Java 等)建议新项目直接使用 2.x 客户端。
配置方式主要通过配置文件(influxdb.conf)支持命令行参数、环境变量、配置文件(influxd config)2.x 更符合云原生配置习惯。
开源状态1.x 仍维护,但新功能集中在 2.x2.x 为当前主力版本,持续更新新项目应优先选择 2.x。

第二章:安装与配置

2.1 本地安装(Linux / macOS / Windows)

操作名称操作细节注意事项
Linux 安装(Debian/Ubuntu)通过 wget 下载 deb 包并使用 dpkg 安装,详见代码示例 1。版本号请替换为最新版;需确保系统为 64 位;首次启动后需通过 Web UI 初始化。
Linux 安装(RHEL/CentOS)通过 wget 下载 rpm 包并使用 yum 安装,详见代码示例 2。若使用 dnf(如 CentOS 8+),替换 yum 为 dnf。
macOS 安装(Homebrew)通过 Homebrew 安装,详见代码示例 3。Homebrew 安装的是最新稳定版;默认前台运行,关闭终端即停止服务。
Windows 安装从官网下载 .msi 安装包(如 influxdb2-2.7.10-windows-amd64.msi),双击安装。需以管理员权限运行安装程序;防火墙可能阻止 8086 端口访问。
验证安装访问 http://localhost:8086,若出现初始化页面则安装成功。若无法访问,检查服务是否运行(systemctl status influxdb2 或任务管理器)。

代码示例 1 — Linux 安装(Debian/Ubuntu):

wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.10-amd64.deb
sudo dpkg -i influxdb2-2.7.10-amd64.deb

启动服务:

sudo systemctl start influxdb2

代码示例 2 — Linux 安装(RHEL/CentOS):

wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.10.x86_64.rpm
sudo yum localinstall influxdb2-2.7.10.x86_64.rpm

代码示例 3 — macOS 安装(Homebrew):

brew install influxdb

启动:

influxd

2.2 Docker 部署

操作名称操作细节注意事项
拉取镜像执行 docker pull influxdb:2.7.10建议指定版本号,避免 latest 引入不兼容更新。
启动容器(临时)通过 docker run 运行容器并映射端口,详见代码示例 1。数据未持久化,容器删除后数据丢失。
启动容器(持久化)通过挂载卷持久化数据和配置,详见代码示例 2。挂载卷路径需提前创建;Windows 用户将 $PWD 替换为绝对路径。
设置初始用户(非交互式)通过环境变量设置用户名、密码、组织、Bucket 等,详见代码示例 3。所有 DOCKER_INFLUXDB_INIT_* 变量必须同时提供,否则初始化失败。
查看日志执行 docker logs -f influxdb可用于排查启动失败或初始化错误。

代码示例 1 — 启动容器(临时):

docker run --name influxdb -p 8086:8086 influxdb:2.7.10

代码示例 2 — 启动容器(持久化):

docker run --name influxdb -p 8086:8086 \
  -v $PWD/influxdb2:/var/lib/influxdb2 \
  -v $PWD/config.yml:/etc/influxdb2/config.yml \
  influxdb:2.7.10

代码示例 3 — 设置初始用户(非交互式):

docker run -p 8086:8086 \
  -e DOCKER_INFLUXDB_INIT_MODE=setup \
  -e DOCKER_INFLUXDB_INIT_USERNAME=myuser \
  -e DOCKER_INFLUXDB_INIT_PASSWORD=mypass \
  -e DOCKER_INFLUXDB_INIT_ORG=myorg \
  -e DOCKER_INFLUXDB_INIT_BUCKET=mybucket \
  -e DOCKER_INFLUXDB_INIT_RETENTION=336h \
  influxdb:2.7.10

2.3 初始配置与首次登录

操作名称操作细节注意事项
访问初始化页面浏览器打开 http://localhost:8086,进入 Setup 页面。首次访问必须完成初始化,否则 API 不可用。
填写组织信息输入 Organization Name(如 “MyCompany”)和 Bucket Name(如 “metrics”)。Organization 是逻辑隔离单位,不可更改;Bucket 名称可后续添加。
创建初始用户输入 Username、Password,并确认。系统自动生成 All Access Token。密码需满足复杂度要求(至少8位,含大小写+数字);Token 用于 API 认证。
获取初始 Token初始化完成后,在 UI 的 “Load Data > Tokens” 中查看自动生成的 token。此 token 拥有全权限,务必妥善保管;建议后续创建细粒度 token。
CLI 登录通过 influx setupinflux config create 配置 CLI 连接,详见代码示例 1。CLI 配置保存在 ~/.influxdbv2/configs,支持多环境切换。

代码示例 1 — CLI 登录:

influx setup

按提示输入上述信息,或使用已有 token:

influx config create --host-url http://localhost:8086 --token YOUR_TOKEN --org myorg --active

2.4 配置文件详解(influxd.conf / influxdb.conf)

注:InfluxDB 2.x 默认不生成配置文件,需手动创建或通过 influxd print-config 生成模板。配置文件通常命名为 config.yml(YAML 格式),而非 1.x 的 influxdb.conf(TOML)。

配置项(YAML 路径)说明注意事项
http-bind-addressHTTP API 监听地址,默认 :8086修改后需重启服务;生产环境建议绑定内网 IP。
bolt-path内置 BoltDB 元数据存储路径,默认 /var/lib/influxdb2/influxd.bolt必须与 engine-path 在同一磁盘,避免性能问题。
engine-pathTSM 数据引擎存储路径,默认 /var/lib/influxdb2/engine磁盘需高性能(SSD 推荐);路径需有写权限。
log-level日志级别,可选 error, warn, info, debug生产环境建议 info,调试时用 debug
reporting-disabled是否禁用匿名使用统计(默认 false)。设为 true 可提升隐私性,不影响功能。
storage.wal-fsync-delayWAL 同步延迟(如 0s 表示每次写入都 fsync)。降低可提升写入性能,但增加宕机丢数据风险。
storage.max-concurrent-compactions最大并发压缩任务数,默认为 CPU 核数。过高会占用大量 I/O 和 CPU,影响查询性能。
session-length-minutesWeb UI 会话有效期(分钟),默认 60。安全敏感环境可缩短至 15–30 分钟。
tls.enabled是否启用 HTTPS(需配合 tls.certificatetls.key)。启用后所有客户端必须使用 HTTPS 访问。

示例最小配置文件(config.yml):

http-bind-address: ":8086"
bolt-path: "/var/lib/influxdb2/influxd.bolt"
engine-path: "/var/lib/influxdb2/engine"
log-level: "info"
reporting-disabled: true

启动时指定配置文件:

influxd --config /path/to/config.yml

第三章:核心概念

3.1 Bucket(存储桶)

概念名称说明注意事项
BucketInfluxDB 2.x 中的数据容器,用于存储时间序列数据;替代了 1.x 中的 Database + Retention Policy 组合。每个 Bucket 属于一个 Organization。Bucket 创建后无法重命名;删除 Bucket 将永久丢失其中所有数据。
Retention Period(保留周期)Bucket 可配置数据自动过期时间(如 7d、30d、0 表示永不过期)。过期数据由后台任务自动清理。保留周期最小为 1 小时;设为 0 需谨慎,可能导致磁盘耗尽。
Bucket ID系统分配的唯一标识符(UUID),用于 API 调用和权限控制。UI 中通常显示 Bucket 名称,但 API 必须使用 ID 或名称(部分接口支持名称)。
Default Bucket初始化时创建的默认 Bucket,常用于快速写入测试数据。生产环境建议按业务划分多个 Bucket(如 metrics、logs、events)。

3.2 Measurement(测量)

概念名称说明注意事项
Measurement表示一类时序数据的逻辑分组,例如 “cpu_usage”、“temperature”。在 Line Protocol 中作为第一个字段。Measurement 不需要预先定义,写入即创建;名称中不能包含逗号或空格。
动态 SchemaInfluxDB 无固定表结构,不同时间点可写入不同 Field 或 Tag,系统自动合并 schema。过度发散的 schema(如每条数据 Tag 键不同)会导致高基数问题,影响性能。
Measurement 与 Bucket 关系一个 Bucket 可包含多个 Measurement;Measurement 名称在 Bucket 内唯一。查询时需指定 Bucket,Measurement 通过 from(bucket: "...") 引用。

3.3 Tag 与 Field

概念名称说明注意事项
Tag元数据键值对,用于索引和高效过滤(如 host="server01", region="us-west")。Tag 值为字符串类型。Tag 会被索引,查询快;但高基数 Tag(如 user_id)会显著增加内存和存储开销。
Field实际测量值,支持 float、integer、boolean、string 类型(如 value=0.85, status=true)。Field 不被索引。同一 Measurement 中,同一 Field Key 的类型必须一致,否则写入失败或被丢弃。
Tag vs Field 选择原则用于 WHERE 条件或 GROUP BY 的维度应设为 Tag;仅用于展示或计算的值应设为 Field。错误地将高基数标识符(如 UUID)作为 Tag 会导致”高基数问题”,严重降低性能。
Implicit Tag _measurement系统自动添加的 Tag,值为 Measurement 名称。可在 Flux 中通过 r._measurement 引用,无需显式写入。

3.4 Timestamp(时间戳)

概念名称说明注意事项
Timestamp每个数据点的时间标识,默认精度为纳秒(ns)。可由客户端指定或由服务端自动生成(写入时刻)。时间戳是 InfluxDB 的核心排序依据;不指定时使用服务器当前时间。
时间格式(Line Protocol)可选追加在行末,单位为纳秒(如 1672531200000000000);也可用秒/毫秒,但需明确转换。若提供非纳秒时间戳,需在写入时通过 precision 参数声明(如 ?precision=s)。
时区处理InfluxDB 内部始终以 UTC 存储;Flux 查询中可通过 timezone 函数转换显示时区。客户端应统一使用 UTC 时间写入,避免时区混乱。
乱序写入支持支持一定范围内的乱序写入(由 TSM 引擎处理),但极端乱序会影响压缩效率。建议按时间顺序写入;若必须乱序,避免跨大时间窗口(如先写明天数据再写今天)。

3.5 Organization(组织)与 User(用户)

概念名称说明注意事项
Organization逻辑隔离单位,用于多租户场景;所有资源(Bucket、Task、Dashboard)都属于某个 Organization。开源版支持多个 Organization,但无跨 Org 查询能力。
UserInfluxDB 2.x 中的”用户”主要指通过 Web UI 登录的账号;实际 API 访问依赖 Token。用户本身不直接拥有权限,权限通过 Token 绑定的 Authorization 对象授予。
Token(访问令牌)用于认证 API 请求的密钥字符串,绑定到特定 User、Org 和权限范围(读/写特定 Bucket)。Token 一旦泄露等于账户泄露;建议按最小权限原则创建专用 Token。
All-Access Token初始化时自动生成的全权限 Token,可管理所有资源。仅用于初始配置,生产环境应禁用或删除。
Permission ScopeToken 可授权的操作包括:read/write buckets、read tasks、write checks 等。权限粒度精确到资源级别(如只读某个 Bucket)。

3.6 Task(定时任务)与 Check(监控检查)

概念名称说明注意事项
Task基于 Flux 脚本的定时作业,按设定频率(如每5分钟)自动执行,常用于降采样、数据聚合或写入新 Bucket。Task 必须包含 option task = {name: "...", every: "5m"} 声明;首次运行有延迟。
Task 调度精度最小调度间隔为 1 分钟;实际执行时间可能因系统负载略有偏差。高频任务(<1m)不被支持,需考虑外部调度器。
Check监控规则,定期执行查询并评估是否触发告警条件(如 CPU > 90% 持续 5 分钟)。Check 本身不发送通知,需配合 Notification Rule 和 Endpoint(如 Slack、Email)。
Check 与 Task 区别Check 用于”检测异常”,Task 用于”执行操作”;Check 结果写入 _monitoring Bucket。Check 的 Flux 脚本必须返回带有 _level 字段(ok, warn, crit)的数据流。
内置监控 Bucket_monitoring_tasks 是系统保留 Bucket,分别存储 Check 结果和 Task 日志。不建议手动写入这些 Bucket;可通过 Flux 查询其内容用于调试。

第四章:数据写入

4.1 使用 HTTP API 写入数据

方法名称语法用途注意事项
POST /api/v2/writePOST http://<host>:8086/api/v2/write?org=<org>&bucket=<bucket>[&precision=<unit>]通过标准 REST 接口向指定 Bucket 写入时序数据,适用于任意编程语言或工具集成。org 和 bucket 可使用名称或 ID;Token 必须具有该 Bucket 的写权限;时间戳默认为纳秒。
指定时间精度在 URL 中添加 precision 参数:s(秒)、ms(毫秒)、us(微秒)、ns(纳秒,默认)简化客户端时间戳生成,避免手动补零。若未指定 precision 且时间戳位数不足(如 10 位),InfluxDB 会将其视为纳秒,导致时间严重错误(如解析为 1970 年)。

POST /api/v2/write 完整请求示例:

POST /api/v2/write?org=myorg&bucket=metrics HTTP/1.1
Host: localhost:8086
Authorization: Token xK...xyz
Content-Type: text/plain; charset=utf-8

cpu,host=web01 usage_idle=95.2 1704067200000000000
mem,host=web01 used_percent=67.3 1704067200000000000

指定时间精度请求示例:

POST /api/v2/write?org=myorg&bucket=logs&precision=s HTTP/1.1

event,level=info msg="started" 1704067200

4.2 使用 CLI(influx write)写入

方法名称语法用途注意事项
influx write(字符串)influx write --bucket <bucket> --org <org> [--host <url>] [--token <token>] "<line_protocol>"快速从命令行写入单条或多条测试数据。若已通过 influx config create 配置默认连接,可省略 --host/--token/--org
influx write(文件)influx write --bucket <bucket> --org <org> --file <filename>从本地文件批量导入 Line Protocol 数据。文件必须为 UTF-8 编码;空行和以 # 开头的注释行会被自动跳过。
指定精度(CLI)添加 --precision s / ms / us / ns 参数

代码示例 1 — influx write(字符串):

influx write --bucket metrics --org myorg "cpu,host=db01 usage=80.5 1704067200000000000"

代码示例 2 — influx write(文件):

echo "temp,sensor=A value=23.5" > data.lp
influx write --bucket sensors --org myorg --file data.lp

4.3 Line Protocol 语法详解

元素名称语法格式说明示例注意事项
Measurement<measurement>数据类别名称,必须存在,位于行首。cpu不能包含空格、逗号;建议使用小写字母和下划线。
Tag Set[,<tag_key>=<tag_value>]...可选的键值对,用于索引和过滤,多个用逗号分隔。,host=server01,region=us-eastTag 值必须是字符串;等号后不能有空格;Tag 键不能重复。
Field Set<field_key>=<field_value>[,<field_key>=<field_value>]...至少一个字段,存储实际测量值。usage_idle=95.2,temp=23.5i类型由字面量决定:100i → 整数、100100.0 → 浮点、"text" → 字符串、true/false → 布尔。
Timestamp[<timestamp>]可选时间戳,单位纳秒(默认),置于行末。1704067200000000000若省略,服务端使用接收时间;时间戳前必须有一个空格。
完整行格式<measurement>[,<tag_key>=<tag_value>...] <field_key>=<field_value>[,<field_key>=<field_value>...] [<timestamp>]单条数据的标准结构disk,device=sda free=102400i,used_percent=45.3 1704067200000000000整行不能换行;Tag 与 Field 之间用单个空格分隔;Field 之间用逗号分隔。
特殊字符转义空格 \ , 逗号 \,, 等号 \=支持 Tag/Field 键或值中包含特殊字符event,source=appv2 msg="hello\ world"仅在 Line Protocol 字符串中需要转义;JSON 或其他协议无需此规则。

4.4 批量写入与性能优化

操作名称操作细节注意事项
单次请求批量写入将多行 Line Protocol 数据拼接为单个请求体(每行一条),通过一次 HTTP POST 或 CLI 调用发送。推荐每批 5,000–10,000 行;过大可能导致超时(默认 10 秒)或内存溢出。
控制批次大小根据网络带宽、服务器负载和数据生成速率动态调整批次行数(如 1k~50k)。小批次增加请求开销(高延迟),大批次增加失败重试成本;建议通过压测确定最优值。
异步写入应用层使用内存队列 + 后台线程/协程定期批量提交,避免阻塞主业务逻辑。需实现失败重试机制(如指数退避);确保数据顺序性要求是否满足(InfluxDB 不保证跨批次顺序)。
避免高基数不要将用户 ID、订单号、UUID 等高基数标识符作为 Tag;改用 Field 或预聚合后存储。高基数会导致内存爆炸、查询变慢甚至 OOM。
使用整数而非浮点若精度允许,用 value=100i 代替 value=100.0整数占用更少存储空间,压缩率更高,写入更快。
时间戳对齐尽量让同一批数据的时间戳相近或有序(如按采集时间排序)。乱序严重会降低 TSM 压缩效率;极端乱序(如未来时间)可能触发写入拒绝(取决于配置)。
监控写入性能查询 _monitoring Bucket 中的指标,如 write_request_bytes(写入流量)、points_written(成功写入点数)、write_errors(写入错误次数)。写入延迟突增可能预示磁盘 I/O 瓶颈、内存不足或网络问题;建议设置告警。

可通过 _series 系统表监控基数:

import "influxdata/influxdb/schema"
schema.measurements(bucket: "mybucket")

第五章:数据查询

5.1 Flux 查询语言基础

概念/元素名称说明代码示例注意事项
基本结构Flux 查询由管道(|>)连接多个函数组成,从数据源开始,经过过滤、转换,最终输出结果。详见代码示例 1
数据模型字段每条记录包含系统字段:_time(时间戳)、_value(实际值)、_field(字段名)、_measurement(测量名),以及用户定义的 Tag(如 host, region)。详见代码示例 2
注释使用 // 单行注释或 /* ... */ 多行注释。详见代码示例 3
变量定义使用 variable = expression 定义常量或中间结果。详见代码示例 4
时间字面量支持相对时间(-1h, -30m)和绝对时间(2024-01-01T00:00:00Z)。详见代码示例 5相对时间基于查询执行时刻;绝对时间必须带时区(建议用 Z 表示 UTC)。

代码示例 1 — 基本结构:

from(bucket: "metrics")
  |> range(start: -5m)

代码示例 2 — 数据模型字段:

// 返回所有字段
from(bucket: "metrics")
  |> range(start: -1h)

代码示例 3 — 注释:

// 查询最近1小时CPU使用率
from(bucket: "metrics")
  |> range(start: -1h)

代码示例 4 — 变量定义:

bucketName = "metrics"
from(bucket: bucketName)
  |> range(start: -10m)

代码示例 5 — 时间字面量:

range(start: 2024-01-01T00:00:00Z, stop: 2024-01-02T00:00:00Z)

5.2 常用 Flux 函数(filter, range, aggregateWindow 等)

函数名称语法用途代码示例注意事项
from()from(bucket: "name")指定查询的数据源 Bucket。from(bucket: "metrics")必须是第一个函数;bucket 名称区分大小写。
range()range(start: time, [stop: time])限定时间范围,必选参数 start。详见代码示例 1stop 默认为 now();时间窗口过大可能超内存限制。
filter()filter(fn: (r) => boolean_expression)按条件过滤记录(支持 Tag 和 Field)。详见代码示例 2不能直接比较 _value 与其他字段;Tag 值必须用字符串字面量。
aggregateWindow()aggregateWindow(every: duration, fn: function, [createEmpty: bool])对时间窗口内的数据聚合(如求平均、最大值),并重采样。详见代码示例 3fn 可为内置聚合函数(mean, sum, max, min, count 等);默认 createEmpty=true 会填充空窗口。
yield()yield(name: "result_name")标记查询结果输出点(在复杂脚本中指定返回哪个流)。详见代码示例 4
pivot()pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")将长格式(每行一个字段)转为宽格式(每行多个字段列)。详见代码示例 5pivot() 必须放在 yield() 之前。
map()map(fn: (r) => ({ r with new_col: expression }))对每行记录添加或修改字段。详见代码示例 6常用于单位转换或派生指标;注意保留原始字段需用 r with

代码示例 1 — range():

range(start: -1h)

range(start: -7d, stop: -1d)

代码示例 2 — filter():

filter(fn: (r) => r._measurement == "cpu" and r.host == "web01")

filter(fn: (r) => r._field == "usage_idle" and r._value > 90)

代码示例 3 — aggregateWindow():

aggregateWindow(every: 5m, fn: mean)

aggregateWindow(every: 1h, fn: max, createEmpty: false)

代码示例 4 — yield():

data = from(...)
  |> ...

data

代码示例 5 — pivot():

from(bucket: "metrics")
  |> range(start: -1h)

代码示例 6 — map():

map(fn: (r) => ({ r with usage_percent: r._value * 100 }))

5.3 使用 HTTP API 查询数据

方法名称语法用途代码示例注意事项
POST /api/v2/queryPOST http://<host>:8086/api/v2/query?org=<org>通过 REST API 执行任意 Flux 查询,适用于程序化集成。详见代码示例 1
响应格式返回 CSV 格式数据流(默认),包含表头和多行记录。详见代码示例 2客户端需解析 CSV;可通过 Accept: application/json 请求 JSON,但官方不推荐(性能差)。
超时控制默认查询超时为 10 秒;可通过 dialect 参数调整(实验性)。详见代码示例 3长时间查询应优化 Flux 脚本或缩小时间范围;避免在 API 中执行全表扫描。

代码示例 1 — POST /api/v2/query:

POST /api/v2/query?org=myorg HTTP/1.1
Host: localhost:8086
Authorization: Token xK...xyz
Content-Type: application/json

{
  "type": "flux",
  "query": "from(bucket:\"metrics\") |> range(start: -1h)"
}

代码示例 2 — 响应格式(CSV):

#datatype,string,long,dateTime:RFC3339,double,string,string
#group,false,false,true,false,true,true
#default,_result,,,,,
,result,table,_time,_value,_field,_measurement
,,0,2024-01-01T12:00:00Z,95.2,usage_idle,cpu

代码示例 3 — 超时控制:

{
  "type": "flux",
  "query": "...",
  "dialect": {"header": true, "delimiter": ",", "commentPrefix": "#"}
}

5.4 使用 CLI(influx query)执行查询

方法名称语法用途代码示例注意事项
influx query(内联)influx query --org <org> '<flux_script>'在终端快速执行简单 Flux 查询。详见代码示例 1
influx query(文件)influx query --org <org> --file <script.flux>执行保存在文件中的复杂 Flux 脚本。详见代码示例 2文件需为 UTF-8 编码。
输出格式控制添加 --format csv / json / flux 控制输出格式(默认为表格)。详见代码示例 3
使用默认配置若已运行 influx config create,可省略 --org--hostinflux query 'from(bucket:"test") |> range(start:-5m)'CLI 会自动读取 ~/.influxdbv2/configs 中的 active 配置。

代码示例 1 — influx query(内联):

influx query --org myorg 'from(bucket:"metrics") |> range(start:-10m)'

代码示例 2 — influx query(文件):

echo 'from(bucket:"logs") |> range(start:-1h)' > query.flux
influx query --org myorg --file query.flux

代码示例 3 — 输出格式控制:

influx query --org myorg --format=csv 'from(bucket:"metrics") |> range(start:-5m)'

第六章:任务与自动化

6.1 创建与管理 Tasks(定时任务)

操作名称操作细节代码示例注意事项
创建 Task(Flux 脚本)编写包含 option task = {name: "...", every: "..."} 的 Flux 脚本,并调用 API 或 UI 提交。详见代码示例 1Task 脚本本质是 Flux 查询,可以包含任意数据转换逻辑。
使用 HTTP API 创建 TaskPOST /api/v2/tasks,Body 为 JSON,包含 flux 字段(含 Task 选项的完整脚本)。详见代码示例 2API 创建后 Task 立即生效,按 every 设定的时间间隔开始调度。
使用 CLI 创建 Taskinflux apply --file task.flux --org <org>(推荐)或 influx task create详见代码示例 3influx apply 支持声明式管理(可版本控制);task create 仅支持简单脚本。
查看 Task 状态在 UI 的 “Tasks” 页面查看运行历史,或通过 CLI 查询。详见代码示例 4失败的运行会显示错误日志;可通过 influx task run retry --run-id <id> 重试。
暂停/恢复 Task在 UI 点击 “Pause” / “Resume”,或使用 API PATCH /api/v2/tasks/<id> 设置 status: "inactive" / "active"详见代码示例 5暂停后不会触发新运行,但不影响已启动的运行实例。

代码示例 1 — 创建 Task(Flux 脚本):

option task = {name: "hourly-cpu-summary", every: 1h}

from(bucket: "metrics")
  |> range(start: -1h)

代码示例 2 — 使用 HTTP API 创建 Task:

POST /api/v2/tasks?org=myorg HTTP/1.1
Authorization: Token xK...xyz
Content-Type: application/json

{
  "flux": "option task = {name: \"daily-backup\", every: 24h}\nfrom(bucket: \"logs\") |> range(start: -24h)"
}

代码示例 3 — 使用 CLI 创建 Task:

task.flux 文件内容:

option task = {name: "clean-old-data", every: 24h}
// 执行清理逻辑

执行:

influx apply --file task.flux --org myorg

代码示例 4 — 查看 Task 状态:

influx task list --org myorg
influx task run list --task-id <task-id>

代码示例 5 — 暂停/恢复 Task:

curl -X PATCH http://localhost:8086/api/v2/tasks/09abc... \
  -H "Authorization: Token xK...xyz" \
  -H "Content-Type: application/json" \
  -d '{"status":"inactive"}'

6.2 数据降采样(Downsampling)

操作名称操作细节代码示例注意事项
基础降采样 Task定期从高精度 Bucket 读取数据,聚合后写入低精度 Bucket。详见代码示例 1目标 Bucket 需提前创建并具有合适的保留周期。
多字段降采样对同一 Measurement 的多个 Field 分别聚合。详见代码示例 2不同字段可使用不同聚合函数(如 temperature→mean, error_count→sum)。
保留原始标签降采样后仍需保留关键 Tag(如 host, region)用于后续查询。filteraggregateWindow 默认保留所有 Tag,无需额外操作。Tag 在 aggregateWindow 中自动保留;若需删除某些 Tag,可使用 drop(columns: ["tag_to_remove"])
避免重复写入确保降采样任务不重叠处理同一时间窗口。详见代码示例 3InfluxDB 不检查重复数据;若任务失败重试,可能写入重复点(相同时间+Tag+Field);建议设计幂等写入。

代码示例 1 — 基础降采样 Task:

option task = {name: "downsample-5m-to-1h", every: 1h}

from(bucket: "metrics_raw")
  |> range(start: -2h) // 略大于窗口,防边界丢失

代码示例 2 — 多字段降采样:

data = from(bucket: "system")
  |> range(start: -2h)

代码示例 3 — 避免重复写入(固定偏移):

option task = {name: "ds", every: 1h, offset: 5m}

6.3 数据保留策略(Retention Policy 替代方案)

概念/操作名称说明操作细节注意事项
Bucket 保留周期InfluxDB 2.x 中,数据保留由 Bucket 的 Retention Period 控制,替代了 1.x 的 Retention Policy。创建 Bucket 时指定:UI 设置 “Retention” 为 7d、30d 或 Infinity;CLI:influx bucket create --name metrics --org myorg --retention 168h;API:POST /api/v2/buckets,body 中设置 "retentionRules": [{"everySeconds": 604800}]保留周期最小为 1 小时(3600 秒);设为 0 表示永不过期(UI 显示 “Infinity”)。
修改保留周期可更新现有 Bucket 的保留时间(延长或缩短)。CLI:influx bucket update --id <bucket-id> --retention 720h;API:PATCH /api/v2/buckets/<id>,更新 retentionRules。缩短保留周期会立即触发后台清理任务,删除超期数据;无法恢复。
系统保留 Bucket_monitoring_tasks 有默认保留周期(通常 7–15 天),可单独调整。详见代码示例 1监控数据本身也占用存储,长期运行需关注其大小。
无”分片”概念InfluxDB 2.x 不再暴露 shard group 等底层概念,保留策略完全由 Bucket 统一管理。无需手动管理 shard;系统自动按时间分段存储和清理。简化了运维,但失去了 1.x 中对 shard duration 的精细控制。
保留 vs 降采样策略保留策略控制”数据生命周期”,降采样控制”数据粒度”;两者常配合使用。示例架构:原始数据保留 7 天(Bucket “raw” → retention=7d),降采样后数据保留 1 年(Bucket “agg_1h” → retention=365d),Task 每小时将 raw 聚合写入 agg_1h。避免对高频原始数据设置过长保留,节省成本;降采样数据用于长期趋势分析。

代码示例 1 — 修改系统保留 Bucket:

influx bucket list --org myorg  # 获取系统 Bucket ID
influx bucket update --id <_monitoring-id> --retention 168h

第七章:权限与安全

7.1 用户与 Token 管理

操作名称操作细节代码示例注意事项
创建用户(UI)在 Web 控制台 “Accounts > Users” 中点击 “Create User”,输入用户名和密码。仅在本地部署(OSS)中可用;InfluxDB Cloud 由平台管理用户。
创建 Token(UI)在 “Load Data > Tokens” 中点击 “Generate API Token”,选择类型:All Access、Read/Write for specific buckets、Custom。All Access Token 拥有组织内全部权限,禁止用于生产应用。
使用 CLI 创建 Tokeninflux auth create --org <org> --read-bucket <bucket-id> --write-bucket <bucket-id> [--description "desc"]详见代码示例 1必须使用 Bucket ID(非名称);可通过 influx bucket list 获取 ID。
使用 CLI 列出 Tokeninflux auth list --org <org>influx auth list --org myorg显示 Token ID、描述、权限范围;不显示 Token 字符串本身(创建时需记录)。
删除 Tokeninflux auth delete --id <token-id> 或在 UI 中点击 “Revoke”influx auth delete --id 09x8y7z6w5v4u3删除后立即失效;所有使用该 Token 的客户端将被拒绝访问。
Token 格式一串 Base62 编码字符串,长度约 64–80 字符,例如:xKZp...xyz123Authorization: Token xKZp...xyz123Token 是认证凭证,等同于密码;必须通过 HTTPS 传输,禁止硬编码在客户端代码中。

代码示例 1 — 使用 CLI 创建 Token:

influx auth create \
  --org myorg \
  --read-bucket 09a1b2c3d4e5f6 \
  --write-bucket 09a1b2c3d4e5f6 \
  --description "app-metrics-token"

7.2 RBAC 权限模型

概念名称说明权限表示方式(API/CLI)注意事项
Permission(权限)最小授权单元,定义对特定资源的操作(read/write)。详见代码示例 1资源类型包括:buckets, tasks, checks, dashboards, orgs, users 等。
Authorization(授权对象)将一组 Permission 绑定到一个 Token,代表该 Token 的能力集合。CLI 创建时通过 --read-bucket, --write-task 等参数隐式生成;也可通过 API POST /api/v2/authorizations 提交完整权限列表。一个 Token 对应一个 Authorization;删除 Authorization 即撤销 Token。
内置角色(无)InfluxDB 2.x 没有预定义角色(如 admin、viewer),所有权限需显式声明。需手动组合多个 Permission 实现”只读用户”、“运维员”等角色。增加了灵活性,但也提高了权限管理复杂度;建议通过脚本批量生成标准 Token。
Org 级权限可授予对整个 Organization 的管理权限(如创建 Bucket、Task)。详见代码示例 2拥有 org write 权限的 Token 可创建/删除 Bucket,相当于”管理员”。
最小权限原则应用 Token 仅授予必要权限,例如:写入指标仅 write to metrics bucket;查询面板仅 read from dashboards + read from buckets。详见代码示例 3避免使用 All Access Token;定期审计 Token 权限。
权限继承无继承机制;每个 Authorization 独立定义权限集。无法通过”用户组”统一授权;需为每个服务/用户单独创建 Token。

代码示例 1 — Permission JSON 结构:

{
  "action": "read",
  "resource": {
    "type": "buckets",
    "id": "09a1b2c3..."
  }
}

代码示例 2 — Org 级权限:

{
  "action": "write",
  "resource": {
    "type": "orgs",
    "id": ""
  }
}

代码示例 3 — 最小权限原则示例:

# 示例:仅读取两个 Bucket
influx auth create \
  --org myorg \
  --read-bucket id1 \
  --read-bucket id2

7.3 HTTPS 与 TLS 配置

配置项说明配置方式(config.yml)注意事项
启用 HTTPS强制所有 HTTP 流量通过 TLS 加密,防止 Token 和数据泄露。详见代码示例 1证书需包含完整信任链(含中间 CA);私钥文件权限应设为 600(仅 owner 可读)。
自签名证书(测试)开发环境可使用自签名证书,但客户端需跳过验证。使用 OpenSSL 生成:openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes生产环境必须使用可信 CA 签发的证书(如 Let’s Encrypt)。
强制重定向 HTTP → HTTPSInfluxDB 不内置 HTTP 重定向;需在前端反向代理(如 Nginx)中配置。详见代码示例 2若仅启用 TLS 而未关闭 HTTP 端口,仍可能通过 HTTP 访问(取决于启动参数)。
客户端连接(HTTPS)所有客户端(CLI、SDK、curl)需使用 https:// 前缀。influx query --host-url https://influx.example.com:8086 ...curl -k https://...-k 仅用于自签名测试)使用自签名证书时,CLI 需加 --skip-verify,SDK 需禁用 SSL 验证(不推荐生产使用)。
禁用 HTTP(仅监听 HTTPS)默认情况下,http-bind-address 监听所有接口;启用 TLS 后仍可通过 HTTP 访问(除非明确绑定到 localhost)。http-bind-address: "127.0.0.1:8086" 限制本地,并在反向代理后启用公网 HTTPS。更安全的做法:InfluxDB 仅监听内网,公网流量经 TLS 终止于反向代理。
证书自动更新(Let’s Encrypt)需配合外部工具(如 certbot)更新证书,并重载 InfluxDB(或重启)。无内置 ACME 支持;更新后执行 systemctl reload influxdb2(若支持 SIGHUP)。InfluxDB 不支持热加载新证书;部分部署方式需重启服务生效。

代码示例 1 — 最小 TLS 配置文件(config.yml):

http-bind-address: ":8086"
tls:
  enabled: true
  certificate: "/etc/ssl/influxdb/fullchain.pem"
  key: "/etc/ssl/influxdb/privkey.pem"
log-level: "info"

启动命令:

influxd --config /etc/influxdb/config.yml

代码示例 2 — Nginx HTTP 重定向示例:

server {
    listen 80;
    server_name influx.example.com;
    return 301 https://$host$request_uri;
}

第八章:客户端 SDK 使用

8.1 Python 客户端(influxdb-client)

方法名称语法用途代码示例注意事项
安装客户端pip install influxdb-client安装官方 Python SDKpip install influxdb-client需 Python 3.7+;不要安装 influxdb(1.x 库)。
初始化客户端from influxdb_client import InfluxDBClient
client = InfluxDBClient(url="http://localhost:8086", token="your-token", org="myorg")
创建连接实例详见代码示例 1URL 必须包含协议(http/https);token 需具备相应权限。
写入单点数据write_api = client.write_api()
write_api.write(bucket="metrics", record="cpu,host=web01 usage=80.5")
使用 Line Protocol 字符串写入详见代码示例 2record 可为字符串、Point 对象或字典列表;默认同步写入。
写入 Point 对象from influxdb_client import Point
p = Point("cpu").tag("host", "db01").field("usage", 90.1).time(...)
write_api.write(bucket="metrics", record=p)
结构化构建数据点详见代码示例 3Point 支持链式调用;时间精度可通过 WritePrecision 指定(NS, US, MS, S)。
执行 Flux 查询query_api = client.query_api()
tables = query_api.query('from(bucket:"metrics") |> range(start:-1h)')
执行查询并返回结果表详见代码示例 4
关闭客户端client.close()释放连接资源client.close()在脚本结束或长时间运行服务中应显式关闭,避免连接泄漏。

代码示例 1 — 初始化客户端:

from influxdb_client import InfluxDBClient

client = InfluxDBClient(
    url="https://influx.example.com:8086",
    token="xK...xyz",
    org="myorg"
)

代码示例 2 — 写入单点数据:

write_api = client.write_api()
write_api.write(
    bucket="metrics",
    record="mem,host=web01 used_percent=65.2 1704067200000000000"
)

代码示例 3 — 写入 Point 对象:

from influxdb_client import Point

p = Point("sensor") \
    .tag("location", "roomA") \
    .field("temp", 23.5) \
    .time(datetime.utcnow(), WritePrecision.S)

write_api.write(bucket="metrics", record=p)

代码示例 4 — 执行 Flux 查询:

query_api = client.query_api()
tables = query_api.query('from(bucket:"logs") |> range(start:-1h)')

8.2 JavaScript / Node.js 客户端

方法名称语法用途代码示例注意事项
安装客户端npm install @influxdata/influxdb-client安装官方 Node.js SDKnpm install @influxdata/influxdb-client不要安装 influx(1.x 库)。
初始化客户端const {InfluxDB} = require('@influxdata/influxdb-client');
const client = new InfluxDB({url: 'http://localhost:8086', token: 'your-token'});
创建连接实例详见代码示例 1org 在写入/查询时单独指定,不在客户端初始化中设置。
写入 Line Protocolconst writeApi = client.getWriteApi(org, bucket, 'ns');
writeApi.writeRecord('cpu,host=web01 usage=80.5');
await writeApi.close();
异步批量写入详见代码示例 2必须调用 close()flush() 确保数据发送;精度单位为 'ns''us''ms''s'
写入结构化对象writeApi.writePoint({measurement: 'mem', tags: {host: 'web01'}, fields: {used_percent: 65.2}, timestamp: new Date()});使用 JS 对象写入详见代码示例 3timestamp 若为数字,单位需与 writeApi 精度一致;Date 对象自动转为纳秒。
执行 Flux 查询const queryApi = client.getQueryApi(org);
const fluxQuery = 'from(bucket:"metrics") |> range(start:-1h)';
queryApi.queryRows(fluxQuery, {next(row, tableMeta) {...}, error(error) {...}, complete() {...}});
流式处理查询结果详见代码示例 4
关闭写入 APIawait writeApi.close()确保缓冲区数据发送完毕await writeApi.close();在应用退出前必须调用,否则可能丢失最后一批数据。

代码示例 1 — 初始化客户端:

const {InfluxDB} = require('@influxdata/influxdb-client');
const client = new InfluxDB({
    url: 'https://influx.example.com:8086',
    token: 'xK...xyz'
});

代码示例 2 — 写入 Line Protocol:

const writeApi = client.getWriteApi('myorg', 'metrics', 's');
writeApi.writeRecord('event msg="started" 1704067200');
await writeApi.close();

代码示例 3 — 写入结构化对象:

writeApi.writePoint({
    measurement: 'sensor',
    tags: {location: 'roomB'},
    fields: {temp: 24.1},
    timestamp: Math.floor(Date.now() / 1000) // 秒级
});

代码示例 4 — 执行 Flux 查询:

const queryApi = client.getQueryApi('myorg');
queryApi.queryRows(
    'from(bucket:"logs") |> range(start:-1h)',
    {
        next(row, tableMeta) { console.log(row); },
        error(error) { console.error(error); },
        complete() { console.log('Done'); }
    }
);

8.3 Go 客户端

方法名称语法用途代码示例注意事项
安装客户端go get github.com/influxdata/influxdb-client-go/v2安装官方 Go SDKgo mod tidy使用 v2 模块路径;支持 Go 1.16+。
初始化客户端client := influxdb2.NewClient("http://localhost:8086", "your-token")创建连接实例详见代码示例 1延迟连接,实际连接在首次请求时建立。
写入 Line ProtocolwriteAPI := client.WriteAPI("myorg", "metrics")
writeAPI.WriteRecord("cpu,host=web01 usage=80.5")
client.Close()
异步写入(带缓冲)详见代码示例 2WriteAPI 内部使用 goroutine 批量发送;Close() 会 flush 并等待完成。
写入 Pointp := influxdb2.NewPoint("mem", map[string]string{"host": "web01"}, map[string]interface{}{"used_percent": 65.2}, time.Now())
writeAPI.WritePoint(p)
结构化写入详见代码示例 3时间戳类型为 time.Time;字段值支持 int, float64, bool, string。
执行 Flux 查询queryAPI := client.QueryAPI("myorg")
result, err := queryAPI.Query(context.Background(), "from(bucket:\"metrics\") |> range(start:-1h)")
同步查询详见代码示例 4
错误处理监听写入错误通道详见代码示例 5Errors() 返回 error channel;应在后台 goroutine 中监听。

代码示例 1 — 初始化客户端:

client := influxdb2.NewClient(
    "https://influx.example.com:8086",
    "xK...xyz",
)

代码示例 2 — 写入 Line Protocol:

writeAPI := client.WriteAPI("myorg", "logs")
writeAPI.WriteRecord("event level=info msg=ready")
// 程序退出前:
client.Close()

代码示例 3 — 写入 Point:

p := influxdb2.NewPoint(
    "sensor",
    map[string]string{"location": "roomC"},
    map[string]interface{}{"temp": 22.8},
    time.Unix(1704067200, 0),
)
writeAPI.WritePoint(p)

代码示例 4 — 执行 Flux 查询:

queryAPI := client.QueryAPI("myorg")
result, err := queryAPI.Query(
    context.Background(),
    `from(bucket:"alerts") |> range(start:-1h)`,
)

代码示例 5 — 错误处理:

go func() {
    for err := range writeAPI.Errors() {
        log.Println("Write error:", err)
    }
}()

8.4 Java 客户端

方法名称语法用途代码示例注意事项
添加依赖(Maven)<dependency><groupId>com.influxdb</groupId><artifactId>influxdb-client-java</artifactId><version>6.10.0</version></dependency>引入官方 Java SDK版本需与 InfluxDB 2.x 兼容;检查 Maven Central 最新版本。
初始化客户端InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", "your-token".toCharArray());创建连接实例详见代码示例 1Token 以 char[] 传入,避免字符串常量池泄露。
写入 Line ProtocolWriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeRecord("myorg", "metrics", WritePrecision.NS, "cpu,host=web01 usage=80.5");
同步阻塞写入详见代码示例 2Blocking API 适合简单场景;高吞吐应使用异步 WriteApi
写入 PointPoint point = Point.measurement("mem").addTag("host", "web01").addField("used_percent", 65.2).time(Instant.now());
writeApi.writePoint("myorg", "metrics", point);
结构化写入详见代码示例 3Point 使用 Builder 模式;时间类型为 java.time.Instant
执行 Flux 查询String query = "from(bucket:\"metrics\") |> range(start:-1h)";
List<FluxTable> tables = client.getQueryApi().query(query, "myorg");
同步查询详见代码示例 4
关闭客户端client.close()释放 HTTP 连接池client.close();实现 AutoCloseable,建议用 try-with-resources。

代码示例 1 — 初始化客户端:

InfluxDBClient client = InfluxDBClientFactory.create(
    "https://influx.example.com:8086",
    "xK...xyz".toCharArray()
);

代码示例 2 — 写入 Line Protocol:

WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeRecord(
    "myorg", "logs", WritePrecision.S,
    "event msg=started 1704067200"
);

代码示例 3 — 写入 Point:

Point p = Point.measurement("sensor")
    .addTag("location", "roomD")
    .addField("temp", 21.9)
    .time(Instant.ofEpochSecond(1704067200));
writeApi.writePoint("myorg", "metrics", p);

代码示例 4 — 执行 Flux 查询:

String query = "from(bucket:\"errors\") |> range(start:-1h)";
List<FluxTable> tables = client.getQueryApi().query(query, "myorg");

第九章:监控与运维

9.1 系统指标监控(_monitoring bucket)

指标类别说明查询示例注意事项
写入指标监控数据写入吞吐量、延迟和错误率。关键字段:write_request_bytes(接收字节数)、points_written(成功写入点数)、write_errors(写入失败次数)。详见代码示例 1
查询指标跟踪查询执行次数、耗时和资源消耗。关键字段:query_duration_seconds(查询耗时分布)、queries_active(当前活跃查询数)。详见代码示例 2
存储指标监控 TSM 引擎状态。关键字段:tsm_level_sizes_bytes(各压缩层级大小)、series_created(新增时间序列数)。详见代码示例 3
Task 指标监控定时任务执行状态。关键字段:task_run_success / task_run_fail详见代码示例 4
系统资源InfluxDB 进程的 CPU、内存、goroutine 数等(需启用 internal monitoring)。默认不开启,需在 config.yml 中设置 reporting-disabled: false,并查询 _monitoring 中的 “runtime” measurement。生产环境建议开启,但会增加少量开销;敏感环境可关闭。

注意:_monitoring Bucket 默认保留周期为 7 天,可通过 CLI 修改:

influx bucket update --id $(influx bucket list --name _monitoring --org myorg --json | jq -r '.[0].id') --retention 168h

代码示例 1 — 写入指标查询:

from(bucket: "_monitoring")
  |> range(start: -1h)

代码示例 2 — 查询指标查询:

from(bucket: "_monitoring")
  |> range(start: -30m)

代码示例 3 — 存储指标查询:

from(bucket: "_monitoring")
  |> range(start: -6h)

代码示例 4 — Task 指标查询:

from(bucket: "_monitoring")
  |> range(start: -24h)

9.2 日志管理与故障排查

操作名称操作细节代码示例 / 命令注意事项
查看日志(systemd)InfluxDB 作为 systemd 服务运行时,使用 journalctl 查看日志。详见代码示例 1日志级别由 log-level 配置项控制;默认为 info。
查看日志(Docker)容器化部署时,使用 docker logs 命令。详见代码示例 2若容器重启频繁,需加 --details 查看退出原因。
启用调试日志临时提升日志级别至 debug,获取详细请求和内部状态。详见代码示例 3debug 日志量极大,仅用于短期诊断;避免在生产长期开启。
常见错误:写入拒绝错误信息如 partial write: field type conflict先写入 usage=90(float),再写入 usage=90i(integer)→ 失败。同一 Field Key 在同一 Measurement 中必须保持类型一致;建议统一使用 float。
常见错误:权限不足HTTP 403 错误,日志显示 unauthorized: unauthorized accessinflux auth list --org myorg(检查 Token 权限)。Token 权限范围不可修改,需重新创建。
高基数问题诊断查询 _series 系统表估算基数。详见代码示例 4
磁盘空间不足日志出现 no space left on device 或写入停滞。df -h /var/lib/influxdb2du -sh /var/lib/influxdb2/engineInfluxDB 不自动清理超保留期数据(后台任务有延迟);需预留 20% 磁盘缓冲。

代码示例 1 — 查看日志(systemd):

sudo journalctl -u influxdb2 -f
sudo journalctl -u influxdb2 --since "1 hour ago"

代码示例 2 — 查看日志(Docker):

docker logs -f influxdb
docker logs --tail 100 influxdb

代码示例 3 — 启用调试日志:

# 临时启动:
influxd --log-level debug

# 或在 config.yml 中设置:
# log-level: "debug"

代码示例 4 — 高基数问题诊断:

import "influxdata/influxdb/schema"
schema.tagValues(
  bucket: "metrics",
  tag: "host"
)
  |> count()

9.3 备份与恢复

操作名称操作细节命令注意事项
备份元数据(Buckets/Tasks/Tokens)使用 influx backup 命令备份组织级配置(不含原始时序数据)。详见代码示例 1仅备份 BoltDB 元数据(users, buckets, tasks, tokens 等);不包含实际时间序列数据。
备份完整数据(OSS 限制)InfluxDB OSS 不支持官方全量数据备份命令;需直接复制数据目录。详见代码示例 2必须停服备份,否则数据损坏;恢复时需完全覆盖 /var/lib/influxdb2
恢复元数据使用 influx restore 从备份文件恢复配置。详见代码示例 3目标实例必须为空(无同名 Organization);否则冲突。
导出数据为 Line Protocol通过 Flux 查询 + to() 函数导出到另一个 Bucket,或使用第三方工具(如 influxdb-exporter)。详见代码示例 4(变相备份)。
云版备份(InfluxDB Cloud)自动每日快照,保留 30 天;可通过 UI “Data > Backup & Restore” 恢复。仅限付费计划;OSS 用户无法使用。
备份策略建议元数据:每日自动备份;数据:通过降采样 + 长保留 Bucket 实现逻辑备份;物理备份:定期停服 tar 打包。cron 示例:0 2 * * * /usr/bin/influx backup --org myorg /backups/meta-$(date +%F)物理备份体积大,仅用于灾难恢复;日常依赖保留策略 + 降采样更高效。

重要提醒: InfluxDB 2.x OSS 没有内置的在线全量备份命令(如 1.x 的 influxd backup),官方推荐通过以下方式替代:

  • 关键配置(Token/Bucket/Task)用 influx backup 保护
  • 原始数据通过合理保留策略 + 降采样实现生命周期管理
  • 极端场景下停机物理备份

代码示例 1 — 备份元数据:

influx backup \
  --host http://localhost:8086 \
  --token xK...xyz \
  --org myorg \
  /backup/meta-2024-02-01

代码示例 2 — 备份完整数据(OSS):

sudo systemctl stop influxdb2
tar czf influxdb2-backup.tar.gz /var/lib/influxdb2
sudo systemctl start influxdb2

代码示例 3 — 恢复元数据:

influx restore \
  --host http://localhost:8086 \
  --token xK...xyz \
  --org myorg \
  /backup/meta-2024-02-01

代码示例 4 — 导出数据为 Line Protocol(变相备份):

option task = {name: "export-daily", every: 24h}
from(bucket: "prod")
  |> range(start: -24h)

第十章:性能调优与高可用

10.1 写入性能优化

优化策略操作细节示例 / 配置注意事项
批量写入将多条 Line Protocol 合并为单次 HTTP 请求或 SDK 调用,减少网络往返。Python:records = ["cpu,host=a usage=10", "cpu,host=b usage=20"]
write_api.write(bucket="m", record=records)
推荐每批 5,000–10,000 行;过大会导致超时(默认 10s)或内存溢出。
异步写入(带缓冲)使用客户端异步 API(如 Go/Node.js 的 WriteAPI),内部自动批量提交。Go:writeAPI.WriteRecord("cpu,host=x usage=30") 非阻塞写入;程序退出前 client.Close()必须在应用关闭前调用 Close() 或 Flush(),否则丢失缓冲数据。
避免高基数不将用户 ID、订单号、UUID 等高基数字段作为 Tag;改用 Field 或预聚合。❌ 错误:event,user_id=abc123 ...
✅ 正确:event ... user_count=1i(聚合后)
高基数会导致内存爆炸、查询变慢甚至 OOM;通过 _series 监控基数增长。
使用整数代替浮点若精度允许,用 value=100i 而非 value=100.0Line Protocol:sensor,temp=23i 1704067200000000000整数占用更少存储空间,压缩率更高,写入更快。
时间戳对齐与有序尽量按时间顺序写入,避免严重乱序(如先写明天再写今天)。数据采集端按时间排序后再批量发送。极端乱序会降低 TSM 压缩效率;未来时间可能被拒绝(取决于配置)。
调整 WAL 同步策略在 config.yml 中设置 storage.wal-fsync-delay 减少磁盘 sync 频率。storage:
wal-fsync-delay: "100ms"
默认为 0s(每次写入都 sync);增大可提升吞吐,但增加宕机丢数据风险。
增加并发写入连接客户端使用多个写入协程/线程并行提交不同批次。Python:用 ThreadPoolExecutor 并发调用 write_api。受服务器 CPU 和 I/O 限制;建议压测确定最优并发数(通常 4–16)。

10.2 查询性能优化

优化策略操作细节示例 / Flux 代码注意事项
缩小时间范围始终使用尽可能窄的 range(start: ..., stop: ...)from(bucket:"m") |> range(start: -1h)
from(bucket:"m") |> range(start: -365d)
全年查询极易超内存限制;前端应限制用户选择范围(如 ≤7 天)。
先 filter 再聚合aggregateWindow 前使用 filter 减少处理数据量。详见代码示例 1过滤条件应包含高选择性 Tag(如 host="web01")。
避免 SELECT *不要返回所有 Measurement/Field;明确指定所需字段。filter(fn: (r) => r._field == "usage_idle")
❌ 无 field 过滤
返回无关字段增加网络和内存开销。
使用降采样数据对长期趋势分析,查询 _1h_1d 降采样 Bucket,而非原始数据。from(bucket:"metrics_1h") |> range(start: -30d)降采样数据体积小、查询快;需提前通过 Task 生成。
限制结果行数对探索性查询,使用 limit(n: N) 防止返回海量数据。from(bucket:"logs") |> limit(n: 1000)UI Data Explorer 默认 limit 1000;API 调用应显式限制。
避免跨 Bucket 联合查询尽量单 Bucket 查询;跨 Bucket 需 union(),性能差。union(tables: [from(b1), from(b2)])
✅ 统一写入同一 Bucket(用 Tag 区分)
跨 Bucket 查询无法利用本地索引,需全量拉取后合并。
监控慢查询查询 _monitoring 中的 query_duration_seconds 定位瓶颈。详见代码示例 2对持续 >2s 的查询进行优化或拆分。

代码示例 1 — 先 filter 再聚合:

from(bucket:"m")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu")
  |> aggregateWindow(every: 1m, fn: mean)

代码示例 2 — 监控慢查询:

from(bucket:"_monitoring")
  |> filter(fn: (r) => r._field == "query_duration_seconds")
  |> filter(fn: (r) => r._value > 5.0)

10.3 集群部署与高可用架构(InfluxDB Cloud vs OSS)

架构方案适用场景相关框架/产品选型理由可搭配的项目周边架构项目构建方式项目开发成本
单机 OSS 部署开发测试、小型 IoT 项目(<10k 点/秒)InfluxDB OSS 2.x免费开源,功能完整,适合 PoC 和边缘部署Prometheus(指标采集)、Grafana(可视化)、Telegraf(数据收集)Docker Compose / systemd低(0 成本)
高可用 OSS(社区方案)中型企业自建,需容灾(无官方集群支持)InfluxDB OSS + HAProxy + 共享存储(NFS/GlusterFS)利用负载均衡实现读写入口高可用;共享存储保证数据一致Keepalived(VIP)、Consul(服务发现)、Thanos(长期存储)Ansible / Terraform中(需运维团队)
InfluxDB Cloud生产 SaaS 应用、无需运维、弹性伸缩InfluxDB Cloud(AWS/GCP/Azure)官方托管,自动扩缩容、备份、高可用;按用量付费Auth0(认证)、AWS Lambda(ETL)、Cloudflare(WAF)CLI + CI/CD高(按用量计费)
InfluxDB Enterprise(已停售)历史企业客户(新项目不推荐)InfluxDB Enterprise 1.x支持多节点集群、水平扩展Kafka(消息队列)、Flink(流处理)自定义部署脚本极高(许可费+运维)
替代方案:VictoriaMetrics需要开源、高性能、真集群的 TSDBVictoriaMetrics Cluster兼容 InfluxDB Line Protocol,支持水平扩展,资源占用更低VMSelect/VMinsert/VMStorage 分层架构Helm(K8s)中(开源免费)

重要说明:

  • InfluxDB OSS 2.x 官方不提供集群版,所谓”高可用”仅能通过主备 + 共享存储实现,且不支持多写节点。
  • InfluxDB Cloud 是唯一官方支持的高可用、可扩展方案,适合生产环境。
  • 若需开源集群能力,建议评估 VictoriaMetrics 或 TimescaleDB(基于 PostgreSQL)。

各方案代码示例:

方案 1 — 单机 OSS 部署(docker-compose.yml):

# docker-compose.yml
version: '3'
services:
  influxdb:
    image: influxdb:2.7
    ports:
      - "8086:8086"
    volumes:
      - ./influxdb2:/var/lib/influxdb2
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=pass
      - DOCKER_INFLUXDB_INIT_ORG=myorg
      - DOCKER_INFLUXDB_INIT_BUCKET=metrics

目录结构:

- docker-compose.yml
- influxdb-config.yml
- init.sh(初始化脚本)

方案 2 — 高可用 OSS(haproxy.cfg):

# haproxy.cfg 片段
frontend influxdb_in
bind *:8086
default_backend influxdb_nodes

backend influxdb_nodes
balance roundrobin
server node1 10.0.1.10:8086 check
server node2 10.0.1.11:8086 check

⚠️ 注意:OSS 不支持多写节点,仅能主备切换(非真正集群)

目录结构:

- haproxy.cfg
- influxdb-node1.yml
- influxdb-node2.yml
- shared-storage-mount.sh

方案 3 — InfluxDB Cloud(Python 写入示例):

# Python 写入 Cloud
from influxdb_client import InfluxDBClient
client = InfluxDBClient(
    url="https://us-west-2-1.aws.cloud2.influxdata.com",
    token="your-cloud-token",
    org="your-org-id"
)
write_api = client.write_api()
write_api.write("metrics", record="cpu usage=80")

目录结构:

- cloud-config.json
- flux/tasks/
- terraform/main.tf(IaC)

方案 4 — InfluxDB Enterprise: 已停售,新项目不推荐。

方案 5 — 替代方案 VictoriaMetrics(Helm values.yaml):

# Helm values.yaml 片段
server:
  retentionPeriod: "30d"
  extraArgs:
    - "-influxSkipSinglePoint"

目录结构:

- values.yaml(Helm)
- vmcluster.yaml