3、InfluxDB基础:核心概念、安装启动与命令行操作
好,咱们进入正题。InfluxDB 这东西,说白了就是为时序数据量身定做的数据库。你想想看,物联网设备上报的数据,哪个不带时间戳?温度、湿度、电压、转速……全是随时间变化的序列。用传统的关系型数据库去存,不是不行,但查询效率、存储压缩、写入性能,都会让你头疼。InfluxDB 就是专门解决这些问题的。
3.1 核心概念:measurement、tag、field、timestamp
这四个概念,是 InfluxDB 的基石。我刚开始接触的时候,也绕了好一阵子。咱们一个一个说清楚。
3.1.1 measurement
你可以把它理解成关系数据库里的「表」。但又不完全一样。measurement 更像是一个逻辑上的分类,比如 temperature、humidity、cpu_load。它本身不定义字段结构,数据是动态的。
举个例子:
INSERT temperature,device_id=001,location=room1 value=25.6 1700000000
这里的 temperature 就是 measurement。它代表一类数据。
3.1.2 tag
tag 是带索引的,用来做快速过滤和分组。说白了,就是用来「查得快」的字段。比如设备 ID、地理位置、传感器类型。tag 的类型只能是字符串。
我个人习惯,把所有需要做 WHERE 条件、GROUP BY 分组的字段,都设计成 tag。比如:
device_idlocationsensor_type
我在项目中遇到过一个问题:有人把温度值也放到了 tag 里,结果查询慢得离谱。因为 tag 是字符串,而且会建立索引,但数值型数据做索引意义不大,反而浪费内存。记住,tag 只放离散的、有限的、用于过滤的字符串。
3.1.3 field
field 就是实际的数据值。比如温度 25.6、湿度 80%、电压 3.3V。field 的类型可以是浮点数、整数、字符串、布尔值。field 不会被索引,所以查询时如果按 field 过滤,性能会差一些。
嗯,这里要注意:同一个 measurement 里,不同行的 field 字段可以不一样。这是 InfluxDB 的灵活之处,也是容易踩坑的地方。
voltage 字段,有的没带。结果查询时,没带的数据会显示为 null,导致聚合函数计算结果异常。建议同一类数据,field 字段保持一致。
3.1.4 timestamp
时间戳,时序数据的灵魂。InfluxDB 默认使用 UTC 时间,精度到纳秒。如果你不指定,它会用服务器当前时间。但我建议,物联网设备上报时,一定要带上设备本地的时间戳,否则数据乱序了,你都不知道问题出在哪。
时间戳的格式,可以是:
- Unix 纳秒时间戳:
1700000000000000000 - RFC3339 格式:
2023-11-15T10:00:00Z
我个人习惯用 Unix 时间戳,因为计算方便,而且跨平台解析没歧义。
3.2 安装与启动
安装 InfluxDB 其实很简单。咱们以 1.x 版本为例(2.x 版本变化较大,但核心概念一致)。
3.2.1 在 Ubuntu 上安装
wget -q https://repos.influxdata.com/influxdb.key
sudo apt-key add influxdb.key
echo "deb https://repos.influxdata.com/ubuntu bionic stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update
sudo apt-get install influxdb
sudo systemctl start influxdb
sudo systemctl enable influxdb
启动后,默认端口是 8086。你可以用 curl 测试一下:
curl -G http://localhost:8086/ping
返回 {} 就说明服务正常。
3.2.2 在 Docker 中运行
如果你不想污染本地环境,Docker 是最方便的:
docker run -d --name influxdb \
-p 8086:8086 \
-v influxdb-data:/var/lib/influxdb \
influxdb:1.8
嗯,这里要注意:数据卷一定要挂载,否则容器删了,数据就全没了。我在生产环境吃过这个亏,容器重启后数据丢失,还好有备份。
3.3 命令行操作
InfluxDB 自带一个命令行工具 influx,可以直接连上去操作。我个人觉得,对于学习和调试,命令行是最直观的。
3.3.1 进入命令行
influx -host localhost -port 8086
如果一切正常,你会看到这样的提示符:
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
>
3.3.2 创建数据库
CREATE DATABASE iot_data
SHOW DATABASES
你会看到 iot_data 出现在列表中。InfluxDB 的数据库,你可以理解成一个独立的命名空间,不同项目的数据最好分库存储。
3.3.3 写入数据
写入数据用的是 INSERT 语句,格式是:
INSERT <measurement>,<tag_key>=<tag_value> <field_key>=<field_value> <timestamp>
举个例子:
USE iot_data
INSERT temperature,device_id=001,location=room1 value=25.6 1700000000
INSERT temperature,device_id=002,location=room2 value=26.3 1700000001
INSERT humidity,device_id=001,location=room1 value=80.2 1700000000
注意,tag 和 measurement 之间用逗号,tag 和 field 之间用空格。时间戳可以省略,但建议带上。
3.3.4 查询数据
查询用的是 SELECT 语句,和 SQL 很像:
SELECT * FROM temperature
SELECT * FROM temperature WHERE device_id='001'
SELECT * FROM temperature WHERE time > now() - 1h
你想想看,如果不用 tag,而是用 field 做过滤,比如 WHERE value > 25,性能就会差很多。因为 field 没有索引。
3.3.5 常用命令
| 命令 | 说明 |
|---|---|
SHOW DATABASES |
查看所有数据库 |
SHOW MEASUREMENTS |
查看当前数据库的所有 measurement |
SHOW TAG KEYS FROM <measurement> |
查看某个 measurement 的所有 tag 键 |
SHOW FIELD KEYS FROM <measurement> |
查看某个 measurement 的所有 field 键 |
DROP MEASUREMENT <measurement> |
删除整个 measurement |
SHOW TAG KEYS 和 SHOW FIELD KEYS 看一下数据结构,避免写错字段名。特别是接手别人的项目时,这一步能省不少 debug 时间。
3.3.6 删除数据
InfluxDB 没有 DELETE 语句(至少 1.x 版本没有)。要删除数据,只能删 measurement 或者删数据库。所以,设计数据保留策略(Retention Policy)就很重要了。
DROP MEASUREMENT temperature
DROP DATABASE iot_data
嗯,这里要特别提醒:DROP 操作不可逆。我在测试环境手滑过一次,把生产库的 measurement 删了,还好有备份。建议你在生产环境,永远不要直接执行 DROP,而是通过保留策略自动清理过期数据。
3.4 小结
这一章的内容,说白了就是 InfluxDB 的「四件套」:measurement、tag、field、timestamp。你只要记住:
- tag 用来过滤,field 用来存值
- 时间戳是核心,尽量带上
- 命令行是调试利器,多练练
下一章,咱们会深入 InfluxDB 的查询语法,特别是聚合函数和时间窗口,那才是真正发挥时序数据库威力的地方。
核心要点回顾:
- measurement ≈ 表,tag 带索引用于过滤,field 存实际数值
- 安装推荐 Docker,数据卷一定要挂载
- 命令行用
influx进入,INSERT写入,SELECT查询 - 没有 DELETE,用保留策略管理数据生命周期
公众号:蓝海资料掘金营,微信deep3321