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,pressuretemperature是浮点型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,把今天讲的命令都敲一遍。遇到问题随时问我。