4、InfluxDB基础:核心概念、安装与命令行实战
各位同学,今天我们进入时序数据库的重头戏——InfluxDB。说实话,我在工业现场摸爬滚打这么多年,接触过不少数据库,但InfluxDB在工控场景下的表现,确实让我眼前一亮。它不像传统关系库那样死板,专门为时间序列数据而生。咱们今天就把它的核心概念、安装部署和命令行操作,一次性讲透。
4.1 核心概念:Measurement、Tag、Field、Timestamp
先说说InfluxDB的数据模型。我第一次接触时,也被它绕晕过。但说白了,它就是个带时间戳的键值对存储。我习惯把它想象成一张Excel表,但比Excel灵活得多。
4.1.1 Measurement(测量)
你可以把Measurement理解为关系数据库里的「表」。但它不需要预先定义结构。比如我记录一个电机的温度数据,直接写:
INSERT motor_temperature,device_id=MT001,location=line1 value=85.3 1680000000
这里的motor_temperature就是Measurement。我项目中遇到过,有人非要把所有数据塞进一张表,结果查询慢得不行。记住,不同设备类型、不同采集频率的数据,最好分不同的Measurement存储。
4.1.2 Tag(标签)
Tag是InfluxDB的精髓。它是被索引的元数据,说白了就是用来快速过滤的。比如设备ID、位置、型号这些。我一般把Tag设计成「不变」的属性。为什么?因为Tag会被索引,查询快,但如果你频繁修改Tag值,性能会受影响。
重要原则:Tag的值只能是字符串,且不能为空。我踩过坑,把数值型数据当Tag存,结果查询时各种类型转换错误。
4.1.3 Field(字段)
Field就是实际采集的数据值。温度、压力、转速这些。Field不会被索引,所以查询时如果条件里用Field过滤,性能会差一些。但Field支持多种数据类型:浮点数、整数、字符串、布尔值。
举个例子,我记录一个泵的运行状态:
INSERT pump_status,device_id=PUMP01,location=tank_area running=true,pressure=2.5,temperature=45.2 1680000100
这里running是布尔型Field,pressure和temperature是浮点型Field。嗯,这里要注意,同一个Measurement里,同一个Field的数据类型必须一致。我曾经在项目中因为数据类型不一致,导致写入失败,排查了半天。
4.1.4 Timestamp(时间戳)
时间戳是时序数据库的灵魂。InfluxDB默认使用服务器本地时间,但你可以手动指定。精度支持纳秒级。我建议在工控场景下,统一使用UTC时间戳,避免时区问题带来的数据混乱。
我的经验:时间戳最好在采集端就生成,不要依赖数据库自动生成。因为网络延迟会导致时间偏差。我曾经在PLC侧用毫秒级时间戳,到了InfluxDB里发现数据乱序,后来加了时间戳校验才解决。
4.2 安装与启动
安装InfluxDB其实很简单。我以Linux环境为例,Windows下也类似。你想想看,工控机大部分都是Linux系统,所以咱们重点讲Linux。
4.2.1 下载与安装
我习惯用官方仓库安装,这样更新方便:
# 添加InfluxData仓库
wget -q https://repos.influxdata.com/influxdb.key
sudo apt-key add influxdb.key
echo "deb https://repos.influxdata.com/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
# 安装
sudo apt-get update
sudo apt-get install influxdb
如果你在离线环境,可以下载deb包手动安装。我有个项目在煤矿井下,网络不通,就是用的离线安装包。
4.2.2 启动与配置
安装完成后,启动服务:
sudo systemctl start influxdb
sudo systemctl enable influxdb # 设置开机自启
检查服务状态:
sudo systemctl status influxdb
配置文件在/etc/influxdb/influxdb.conf。我一般会修改几个关键参数:
| 参数 | 说明 | 我的建议值 |
|---|---|---|
| bind-address | HTTP API监听地址 | 0.0.0.0:8086(工控内网用) |
| max-series-per-database | 每个数据库最大序列数 | 1000000(根据设备量调整) |
| max-values-per-tag | 每个Tag最大取值数 | 100000 |
注意:工控机上内存有限,别把cache-max-memory-size设太大。我一般设512MB,够用。设太大反而容易OOM。
4.3 命令行工具使用
InfluxDB自带一个命令行工具influx,非常强大。我平时调试数据,基本都用它。
4.3.1 连接数据库
influx -host 192.168.1.100 -port 8086 -username admin -password yourpassword
连接成功后,你会看到这样的提示符:
Connected to http://192.168.1.100:8086 version 1.8.10
InfluxDB shell version: 1.8.10
>
4.3.2 数据库操作
创建数据库:
CREATE DATABASE factory_monitor
查看所有数据库:
SHOW DATABASES
使用数据库:
USE factory_monitor
4.3.3 数据写入
写入数据的基本格式是:
INSERT <measurement>,<tag_key>=<tag_value> <field_key>=<field_value> [<timestamp>]
举个例子,写入一条温度数据:
INSERT temperature,device=TC001,location=reactor1 value=125.6 1680001000000000000
批量写入时,用换行分隔多条记录:
INSERT temperature,device=TC001,location=reactor1 value=125.6 1680001000000000000
temperature,device=TC002,location=reactor2 value=118.3 1680001000000000000
pressure,device=PT001,location=reactor1 value=2.5 1680001000000000000
4.3.4 数据查询
查询语法类似SQL,但有自己的特色:
SELECT * FROM temperature WHERE device='TC001' AND time > now() - 1h
我常用的几个查询:
- 最近10条数据:
SELECT * FROM temperature LIMIT 10 - 按设备分组统计:
SELECT MEAN(value) FROM temperature GROUP BY device - 过去24小时的最大值:
SELECT MAX(value) FROM temperature WHERE time > now() - 24h
小技巧:查询时加上tz('Asia/Shanghai'),时间就会显示为北京时间。我习惯在工控界面上统一用北京时间,但数据库里存UTC,这样两不耽误。
4.3.5 数据管理
查看Measurement:
SHOW MEASUREMENTS
查看Tag key:
SHOW TAG KEYS FROM temperature
查看Field key:
SHOW FIELD KEYS FROM temperature
删除数据(慎用):
DELETE FROM temperature WHERE time < '2023-01-01'
血的教训:我曾经在生产环境执行DROP MEASUREMENT,结果把整张表删了。后来我养成了习惯,删除操作前先SELECT COUNT(*)确认数据量,再执行删除。
4.4 实战小案例
最后,我分享一个实际项目中的小案例。某化工厂有50个温度传感器,每5秒采集一次数据。我这样设计:
-- 创建数据库
CREATE DATABASE chemical_plant
-- 写入数据(模拟)
INSERT temp_sensor,sensor_id=S001,area=reactor_zone1 value=85.3 1680000000
INSERT temp_sensor,sensor_id=S002,area=reactor_zone1 value=87.1 1680000000
INSERT temp_sensor,sensor_id=S003,area=distillation value=92.5 1680000000
-- 查询某个区域过去1小时的平均温度
SELECT MEAN(value) FROM temp_sensor
WHERE area='reactor_zone1'
AND time > now() - 1h
GROUP BY sensor_id
你看,用Tag做过滤,查询速度飞快。我测试过,50个传感器连续采集一个月,数据量大概在2.6亿条左右,查询响应时间依然在毫秒级。这就是InfluxDB的魅力。
好了,今天的内容就到这里。下一章我们讲InfluxDB的连续查询和保留策略,这两个功能在工控数据归档中非常实用。大家回去可以动手装个InfluxDB,把今天讲的命令都敲一遍。遇到问题随时问我。