Linux边缘计算网关搭建:Docker+时序数据库的一体化方案
边缘计算不是把服务器搬过去那么简单
2026年物联网项目的数据量在爆炸。一个中型工厂的传感器节点从几百个增长到几千个,每个节点每秒上报一次数据,数据链路从"设备→云端→展示"变成了"设备→边缘网关→云端+本地决策"。
边缘计算的核心诉求很直接:数据在产生的地方就处理掉,不要全量上云。一是带宽成本扛不住,二是网络延迟不可接受。做工业异常检测,传感器数据到云端跑AI推理再返回结果,网络抖动一下就是两三秒延迟,产线上两三秒的异常不处理就是批量报废。
这篇文章讲怎么用Docker+时序数据库搭建一个完整的边缘计算网关,从数据接入到本地存储到实时分析,全部在网关本地完成。
边缘网关的硬件与软件选型
硬件规格底线
边缘网关不是随便找台设备就能当。实际项目中的硬件底线:
| 指标 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | ARM Cortex-A55 四核 | ARM Cortex-A76 或 x86 J4125 |
| 内存 | 2GB | 4-8GB |
| 存储 | 32GB eMMC | 128GB SSD |
| 网络 | 千兆以太网 | 千兆+WiFi6+4G冗余 |
| 接口 | 2个串口 | 4个串口+2个USB |
2GB内存是底线因为要跑Docker容器+时序数据库+消息中间件,低于2GB系统开销就吃掉一半,留给业务逻辑的内存不够用。
软件栈组成
一个完整的边缘网关软件栈包含四个容器:
- 数据采集:MQTT Broker(EMQX或Mosquitto),接收设备数据
- 数据存储:时序数据库(InfluxDB或TDengine),存储历史数据
- 数据处理:Node-RED或自研Python服务,做规则引擎和边缘计算
- 管理界面:Grafana或自建Web面板,可视化监控
Docker Compose一键部署
docker-compose.yml
version: '3.8'
services:
mosquitto:
image: eclipse-mosquitto:2.0
container_name: edge-mqtt
restart: always
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
networks:
- edge-net
influxdb:
image: influxdb:2.7
container_name: edge-influx
restart: always
ports:
- "8086:8086"
volumes:
- influx-data:/var/lib/influxdb2
- ./influxdb/config:/etc/influxdb2
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=admin
- DOCKER_INFLUXDB_INIT_PASSWORD=Edge@2026
- DOCKER_INFLUXDB_INIT_ORG=edge
- DOCKER_INFLUXDB_INIT_BUCKET=sensor_data
- DOCKER_INFLUXDB_INIT_RETENTION=30d
networks:
- edge-net
nodered:
image: nodered/node-red:latest
container_name: edge-nodered
restart: always
ports:
- "1880:1880"
volumes:
- nodered-data:/data
depends_on:
- mosquitto
- influxdb
networks:
- edge-net
grafana:
image: grafana/grafana:10.4.0
container_name: edge-grafana
restart: always
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=EdgeAdmin2026
depends_on:
- influxdb
networks:
- edge-net
volumes:
influx-data:
nodered-data:
grafana-data:
networks:
edge-net:
driver: bridge
一个docker compose up -d命令,四个服务全部就绪。网关启动后8086端口是InfluxDB管理界面,1880是Node-RED流程编辑器,3000是Grafana看板。
时序数据库选型与配置
InfluxDB vs TDengine
| 维度 | InfluxDB | TDengine |
|---|---|---|
| 写入性能 | 10万点/秒 | 100万点/秒 |
| 压缩率 | 5-10x | 10-20x |
| 查询语法 | Flux/InfluxQL | SQL-like |
| 资源占用 | 中等 | 低 |
| 中文社区 | 一般 | 活跃 |
对于ARM边缘网关,TDengine的资源占用更友好,压缩率更高意味着存储成本更低。但InfluxDB的生态和Grafana集成更成熟。实际选择看团队熟悉度。
数据模型设计
时序数据库的数据模型和关系型数据库完全不同。以InfluxDB为例,measurement相当于表,tag是索引字段,field是实际数据值:
# 数据格式示例
sensor_data,device_id=ESP32_001,location=workshop1 temperature=26.3,humidity=65.2,battery=3.7 1695100800000000000
device_id和location是tag(会被索引,适合过滤),temperature等是field(不索引,适合聚合)。
设计原则:把经常用作查询条件的字段放tag,把数值型测量值放field。不要把所有字段都设为tag(索引太多影响写入性能),也不要都设为field(查询时全表扫描)。
Node-RED构建边缘数据处理流程
数据采集到存储的自动化流程
Node-RED用拖拽式编程连接各组件。核心流程:MQTT输入 → 数据格式转换 → 写入InfluxDB → 异常判断 → 告警输出。
[
{
"id": "mqtt_input",
"type": "mqtt in",
"topic": "/device/+/sensor/+",
"broker": "edge_mqtt",
"qos": 0
},
{
"id": "parse_json",
"type": "function",
"func": "const payload = JSON.parse(msg.payload);\nconst parts = msg.topic.split('/');\nreturn {\n payload: {\n device_id: parts[2],\n sensor_type: parts[4],\n value: payload.value,\n timestamp: new Date().getTime()\n }\n};"
},
{
"id": "influx_write",
"type": "influxdb out",
"measurement": "sensor_data",
"tags": [
{"key": "device_id", "value": "device_id"},
{"key": "sensor_type", "value": "sensor_type"}
],
"fields": [
{"key": "value", "value": "value"}
]
},
{
"id": "threshold_check",
"type": "function",
"func": "const thresholds = {\n temperature: { min: 10, max: 45 },\n humidity: { min: 20, max: 90 }\n};\nconst type = msg.payload.sensor_type;\nconst val = msg.payload.value;\nconst range = thresholds[type];\nif (range && (val < range.min || val > range.max)) {\n return { \n payload: {\n device_id: msg.payload.device_id,\n alert: type + ' out of range',\n value: val,\n range: range,\n timestamp: msg.payload.timestamp\n }\n };\n}\nreturn null;"
},
{
"id": "alert_mqtt",
"type": "mqtt out",
"topic": "/edge/alert",
"broker": "edge_mqtt"
}
]
边缘智能:本地规则引擎
不是所有异常都适合上云判断。简单阈值判断在边缘做,复杂模式识别才上传云端。Node-RED的function节点就够实现轻量规则引擎:
- 温度连续3次超上限 → 触发设备降温指令
- 数据采集间隔突变(从1秒变成5分钟) → 设备可能离线告警
- 多传感器交叉验证(温度高+电流高 → 过载预警)
这些规则不需要AI模型,简单逻辑判断就能覆盖80%的工业异常场景。
Grafana数据可视化
实时看板配置
Grafana连接InfluxDB数据源后,配置实时看板。关键配置:
- 数据源:InfluxDB,查询语言选InfluxQL
- 查询:SELECT mean("value") FROM "sensor_data" WHERE ("device_id" = '$device') AND time > now() - 1h GROUP BY time(10s) fill(null)
- 刷新间隔:5秒自动刷新
- 阈值线:在图表上画红色阈值线,超线区域自动标红
变量化查询让看板支持设备切换:
SELECT mean("value")
FROM "sensor_data"
WHERE ("device_id" =~ /^$device$/)
AND $timeFilter
GROUP BY time($__interval), "sensor_type"
fill(linear)
$device是Grafana变量,从InfluxDB的tag值自动填充下拉选项,用户可以切换查看不同设备的数据。
断网续传与本地缓存
边缘网关最核心的可靠性指标:网络断开时数据不丢。做法是本地缓存+网络恢复后批量上传。
本地缓存策略
InfluxDB本身就是本地存储,断网期间数据写入不受影响。关键是要监控本地存储空间和缓存时长,避免磁盘写满:
import subprocess
import requests
class EdgeSync:
def __init__(self):
self.influx_url = "http://localhost:8086"
self.cloud_url = "https://cloud.example.com/api/sync"
def check_disk_usage(self):
result = subprocess.run(
['df', '-h', '/var/lib/docker'],
capture_output=True, text=True
)
# 解析使用率
usage = int(result.stdout.split('\n')[1].split()[3].replace('%', ''))
return usage
def sync_to_cloud(self):
disk_usage = self.check_disk_usage()
if disk_usage > 85:
# 磁盘紧张,只上传告警数据
query = 'SELECT * FROM alerts WHERE time > now() - 1h'
else:
# 正常批量上传
query = 'SELECT * FROM sensor_data WHERE time > now() - 10m'
# 从InfluxDB查询数据
data = self.query_influx(query)
# 上传到云端
try:
response = requests.post(self.cloud_url, json=data, timeout=30)
if response.status_code == 200:
# 上传成功,可选删除已同步数据
pass
except requests.RequestException:
# 网络不通,下次重试
pass
def run(self):
while True:
self.sync_to_cloud()
time.sleep(60)
从边缘网关到完整物联网平台
边缘网关解决了数据采集、本地处理和断网续传。但一个完整的物联网平台还需要设备管理、规则引擎、告警通知、数据看板等管理功能。这些Web化管理功能可以用导航站系统来统一组织入口。
虎王科技的导航站项目anime_nav_pro_plus(gitee.com/zesso/anime_nav_pro_plus)就是一个适合做物联网平台前端管理的方案。它支持后台管理、分类排序、搜索跳转、统计点击量,每个分类有独立配色。物联网平台里"设备管理"“数据看板”“告警中心”"系统配置"这些模块作为分类入口,用导航站组织比从零搭管理界面快得多。
边缘计算的价值不在于技术多先进,而在于把数据处理从云端拉到数据产生的源头。当你的网关能在毫秒级做异常检测、在断网时缓存数据、在恢复网络后自动同步,整个物联网系统的带宽成本和运维复杂度都会显著下降。
做边缘计算网关开发最大的坑不是技术栈选型,而是运维环境搭建——Docker在ARM设备上的存储驱动、InfluxDB的内存控制、Node-RED的容器权限。这些都是实际部署时才会暴露的问题,建议先在测试环境跑一周压测再上生产。觉得有用点赞收藏,边缘计算网关的部署踩坑记录后续会持续更新。

浙公网安备 33010602011771号