第一章: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.x | InfluxDB 2.x | 注意事项 |
|---|---|---|---|
| 查询语言 | 使用 InfluxQL(类 SQL 语法) | 使用 Flux(函数式、管道式语法) | 两者不兼容,迁移需重写查询逻辑。 |
| 数据模型 | Database + Retention Policy + Measurement | Organization + 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.x | 2.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 setup 或 influx 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-address | HTTP API 监听地址,默认 :8086。 | 修改后需重启服务;生产环境建议绑定内网 IP。 |
bolt-path | 内置 BoltDB 元数据存储路径,默认 /var/lib/influxdb2/influxd.bolt。 | 必须与 engine-path 在同一磁盘,避免性能问题。 |
engine-path | TSM 数据引擎存储路径,默认 /var/lib/influxdb2/engine。 | 磁盘需高性能(SSD 推荐);路径需有写权限。 |
log-level | 日志级别,可选 error, warn, info, debug。 | 生产环境建议 info,调试时用 debug。 |
reporting-disabled | 是否禁用匿名使用统计(默认 false)。 | 设为 true 可提升隐私性,不影响功能。 |
storage.wal-fsync-delay | WAL 同步延迟(如 0s 表示每次写入都 fsync)。 | 降低可提升写入性能,但增加宕机丢数据风险。 |
storage.max-concurrent-compactions | 最大并发压缩任务数,默认为 CPU 核数。 | 过高会占用大量 I/O 和 CPU,影响查询性能。 |
session-length-minutes | Web UI 会话有效期(分钟),默认 60。 | 安全敏感环境可缩短至 15–30 分钟。 |
tls.enabled | 是否启用 HTTPS(需配合 tls.certificate 和 tls.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(存储桶)
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| Bucket | InfluxDB 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 不需要预先定义,写入即创建;名称中不能包含逗号或空格。 |
| 动态 Schema | InfluxDB 无固定表结构,不同时间点可写入不同 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 查询能力。 |
| User | InfluxDB 2.x 中的”用户”主要指通过 Web UI 登录的账号;实际 API 访问依赖 Token。 | 用户本身不直接拥有权限,权限通过 Token 绑定的 Authorization 对象授予。 |
| Token(访问令牌) | 用于认证 API 请求的密钥字符串,绑定到特定 User、Org 和权限范围(读/写特定 Bucket)。 | Token 一旦泄露等于账户泄露;建议按最小权限原则创建专用 Token。 |
| All-Access Token | 初始化时自动生成的全权限 Token,可管理所有资源。 | 仅用于初始配置,生产环境应禁用或删除。 |
| Permission Scope | Token 可授权的操作包括: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/write | POST 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-east | Tag 值必须是字符串;等号后不能有空格;Tag 键不能重复。 |
| Field Set | <field_key>=<field_value>[,<field_key>=<field_value>]... | 至少一个字段,存储实际测量值。 | usage_idle=95.2,temp=23.5i | 类型由字面量决定:100i → 整数、100 或 100.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。 | 详见代码示例 1 | stop 默认为 now();时间窗口过大可能超内存限制。 |
filter() | filter(fn: (r) => boolean_expression) | 按条件过滤记录(支持 Tag 和 Field)。 | 详见代码示例 2 | 不能直接比较 _value 与其他字段;Tag 值必须用字符串字面量。 |
aggregateWindow() | aggregateWindow(every: duration, fn: function, [createEmpty: bool]) | 对时间窗口内的数据聚合(如求平均、最大值),并重采样。 | 详见代码示例 3 | fn 可为内置聚合函数(mean, sum, max, min, count 等);默认 createEmpty=true 会填充空窗口。 |
yield() | yield(name: "result_name") | 标记查询结果输出点(在复杂脚本中指定返回哪个流)。 | 详见代码示例 4 | — |
pivot() | pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value") | 将长格式(每行一个字段)转为宽格式(每行多个字段列)。 | 详见代码示例 5 | pivot() 必须放在 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/query | POST 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 和 --host。 | influx 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 提交。 | 详见代码示例 1 | Task 脚本本质是 Flux 查询,可以包含任意数据转换逻辑。 |
| 使用 HTTP API 创建 Task | POST /api/v2/tasks,Body 为 JSON,包含 flux 字段(含 Task 选项的完整脚本)。 | 详见代码示例 2 | API 创建后 Task 立即生效,按 every 设定的时间间隔开始调度。 |
| 使用 CLI 创建 Task | influx apply --file task.flux --org <org>(推荐)或 influx task create。 | 详见代码示例 3 | influx 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)用于后续查询。 | filter 和 aggregateWindow 默认保留所有 Tag,无需额外操作。 | Tag 在 aggregateWindow 中自动保留;若需删除某些 Tag,可使用 drop(columns: ["tag_to_remove"])。 |
| 避免重复写入 | 确保降采样任务不重叠处理同一时间窗口。 | 详见代码示例 3 | InfluxDB 不检查重复数据;若任务失败重试,可能写入重复点(相同时间+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 创建 Token | influx auth create --org <org> --read-bucket <bucket-id> --write-bucket <bucket-id> [--description "desc"] | 详见代码示例 1 | 必须使用 Bucket ID(非名称);可通过 influx bucket list 获取 ID。 |
| 使用 CLI 列出 Token | influx auth list --org <org> | influx auth list --org myorg | 显示 Token ID、描述、权限范围;不显示 Token 字符串本身(创建时需记录)。 |
| 删除 Token | influx auth delete --id <token-id> 或在 UI 中点击 “Revoke” | influx auth delete --id 09x8y7z6w5v4u3 | 删除后立即失效;所有使用该 Token 的客户端将被拒绝访问。 |
| Token 格式 | 一串 Base62 编码字符串,长度约 64–80 字符,例如:xKZp...xyz123 | Authorization: Token xKZp...xyz123 | Token 是认证凭证,等同于密码;必须通过 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 → HTTPS | InfluxDB 不内置 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 SDK | pip install influxdb-client | 需 Python 3.7+;不要安装 influxdb(1.x 库)。 |
| 初始化客户端 | from influxdb_client import InfluxDBClientclient = InfluxDBClient(url="http://localhost:8086", token="your-token", org="myorg") | 创建连接实例 | 详见代码示例 1 | URL 必须包含协议(http/https);token 需具备相应权限。 |
| 写入单点数据 | write_api = client.write_api()write_api.write(bucket="metrics", record="cpu,host=web01 usage=80.5") | 使用 Line Protocol 字符串写入 | 详见代码示例 2 | record 可为字符串、Point 对象或字典列表;默认同步写入。 |
| 写入 Point 对象 | from influxdb_client import Pointp = Point("cpu").tag("host", "db01").field("usage", 90.1).time(...)write_api.write(bucket="metrics", record=p) | 结构化构建数据点 | 详见代码示例 3 | Point 支持链式调用;时间精度可通过 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 SDK | npm install @influxdata/influxdb-client | 不要安装 influx(1.x 库)。 |
| 初始化客户端 | const {InfluxDB} = require('@influxdata/influxdb-client');const client = new InfluxDB({url: 'http://localhost:8086', token: 'your-token'}); | 创建连接实例 | 详见代码示例 1 | org 在写入/查询时单独指定,不在客户端初始化中设置。 |
| 写入 Line Protocol | const 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 对象写入 | 详见代码示例 3 | timestamp 若为数字,单位需与 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 | — |
| 关闭写入 API | await 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 SDK | go mod tidy | 使用 v2 模块路径;支持 Go 1.16+。 |
| 初始化客户端 | client := influxdb2.NewClient("http://localhost:8086", "your-token") | 创建连接实例 | 详见代码示例 1 | 延迟连接,实际连接在首次请求时建立。 |
| 写入 Line Protocol | writeAPI := client.WriteAPI("myorg", "metrics")writeAPI.WriteRecord("cpu,host=web01 usage=80.5")client.Close() | 异步写入(带缓冲) | 详见代码示例 2 | WriteAPI 内部使用 goroutine 批量发送;Close() 会 flush 并等待完成。 |
| 写入 Point | p := 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 | — |
| 错误处理 | 监听写入错误通道 | 详见代码示例 5 | Errors() 返回 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()); | 创建连接实例 | 详见代码示例 1 | Token 以 char[] 传入,避免字符串常量池泄露。 |
| 写入 Line Protocol | WriteApiBlocking writeApi = client.getWriteApiBlocking();writeApi.writeRecord("myorg", "metrics", WritePrecision.NS, "cpu,host=web01 usage=80.5"); | 同步阻塞写入 | 详见代码示例 2 | Blocking API 适合简单场景;高吞吐应使用异步 WriteApi。 |
| 写入 Point | Point point = Point.measurement("mem").addTag("host", "web01").addField("used_percent", 65.2).time(Instant.now());writeApi.writePoint("myorg", "metrics", point); | 结构化写入 | 详见代码示例 3 | Point 使用 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。 | 生产环境建议开启,但会增加少量开销;敏感环境可关闭。 |
注意:
_monitoringBucket 默认保留周期为 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,获取详细请求和内部状态。 | 详见代码示例 3 | debug 日志量极大,仅用于短期诊断;避免在生产长期开启。 |
| 常见错误:写入拒绝 | 错误信息如 partial write: field type conflict。 | 先写入 usage=90(float),再写入 usage=90i(integer)→ 失败。 | 同一 Field Key 在同一 Measurement 中必须保持类型一致;建议统一使用 float。 |
| 常见错误:权限不足 | HTTP 403 错误,日志显示 unauthorized: unauthorized access。 | influx auth list --org myorg(检查 Token 权限)。 | Token 权限范围不可修改,需重新创建。 |
| 高基数问题诊断 | 查询 _series 系统表估算基数。 | 详见代码示例 4 | — |
| 磁盘空间不足 | 日志出现 no space left on device 或写入停滞。 | df -h /var/lib/influxdb2;du -sh /var/lib/influxdb2/engine。 | InfluxDB 不自动清理超保留期数据(后台任务有延迟);需预留 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.0。 | Line 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 | 需要开源、高性能、真集群的 TSDB | VictoriaMetrics 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