用influxdb1-client连InfluxDB 1.x最稳:基于HTTP+Line Protocol,兼容1.8及更早版,需手动建库、配auth,禁用2.x客户端直连;写入须用BatchPoints批量、纳秒级时间戳、全局复用client实例。

用 influxdb1-client 连 InfluxDB 1.x 写入数据最稳
Go 官方没维护 InfluxDB 客户端,社区主流选择是 influxdata/influxdb1-client(注意不是 influxdb2-client)。它基于 HTTP + Line Protocol,兼容 1.8 及更早版本,不支持 2.x 的 token 认证和 bucket 概念。如果你连的是 InfluxDB 2.x 兼容 1.x API(即开启 [[http]] influxql-enabled = true),也能用,但得确认服务端配置开了 InfluxQL 接口。
常见错误:直接拿 2.x 的 influxdb2-client 去连 1.x 实例,报 404 Not Found 或 invalid path —— 因为路径是 /write 而非 /api/v2/write。
实操建议:
- go get github.com/influxdata/influxdb1-client/v2
- 初始化 client 时用
client.NewHTTPClient,传client.HTTPConfig{Addr: "http://localhost:8086"} - 写入前必须指定 database 名,用
c.Write(bp, "mydb"),mydb必须已存在(InfluxDB 不会自动建库) - 如果启用了 auth,记得在
HTTPConfig中设Username和Password,否则 401
用 influxdb2-client 连 InfluxDB 2.x 是唯一正解
2.x 版本彻底弃用 database/retention policy,改用 org/bucket/measurement,认证也强制 token。此时必须用 influxdata/influxdb-client-go(v2 客户端),否则根本连不上。
立即学习“go语言免费学习笔记(深入)”;
典型报错:Unauthorized: unauthorized access(token 错或权限不足)、bucket not found(名字拼错或 org 不匹配)。
实操建议:
- go get github.com/influxdata/influxdb-client-go/v2
- 初始化用
influxdb2.NewClient("http://localhost:8086", "your-token-here"),token 需带read/write权限 - 写入时必须同时指定
org和bucket,例如WriteAPI.WritePoint("my-org", "my-bucket", p) - Point 构造推荐用
influxdb2.NewPoint("cpu", map[string]string{"host": "server01"}, map[string]interface{}{"usage": 99.5}, time.Now()),tag 和 field 别混
批量写入性能差?别用单点 WritePoint 循环
逐个调用 WritePoint 或 Write 会触发大量 HTTP 请求,吞吐极低。真实采集场景必须攒批、压缩、复用连接。
关键影响项:
- InfluxDB 1.x 客户端:用
client.BatchPoints,设置BatchPointsConfig{BatchSize: 1000, JitterInterval: 100}控制批次大小和抖动 - InfluxDB 2.x 客户端:启用
WriteAPI的异步缓冲(默认开),并通过WriteAPI.Config().FlushInterval = 1000调整刷盘间隔 - 无论哪个客户端,都别在循环里反复
NewClient—— client 是线程安全的,全局复用一个实例 - Line Protocol 字符串拼错(比如 tag 值含空格未转义)会导致整批写入失败,且错误提示模糊,建议先用
influx write命令行验证格式
时间戳乱掉?Go 的 time.Time 默认精度不够
InfluxDB 默认按纳秒存时间,但 Go 的 time.Now() 在某些系统上可能只到微秒级,或者你用 Unix()(秒)或 UnixMilli()(毫秒)丢精度,导致多点被压成同一时间戳,聚合异常。
正确做法:
- 写入 Point 时显式传
time.Now().UTC().Round(time.Nanosecond),避免本地时区干扰 - 1.x 客户端若用
client.BatchPoints.AddPoint,内部会调p.Time().UnixNano(),所以确保p的时间字段是纳秒级 - 2.x 客户端构造
NewPoint时第 4 个参数必须是time.Time,别传int64时间戳 —— 它不会自动识别单位 - 如果采集程序跑在容器里,宿主机时间不同步也会让时间戳漂移,建议检查
ntpd或chrony状态
最易被忽略的一点:InfluxDB 查询时默认按本地时区解析时间,但存储是 UTC。如果你在 Grafana 里看到数据“偏了 8 小时”,大概率不是代码问题,而是查询语句没加 tz('Asia/Shanghai') 或面板时区没对齐。


















