5.2 KiB
5.2 KiB
Part 5: 数据存储设计
文档定位:详细阐述平台的混合存储架构,明确不同类型数据的存储选型、模型设计及数据流转策略。
5.1 存储选型策略
AIoT 平台的数据呈现出明显的冷热分层与结构差异,因此采用“一主多从、动静分离”的混合存储策略。
| 数据类型 | 典型特征 | 选型方案 | 选型理由 |
|---|---|---|---|
| 业务元数据 | 强事务一致性、关联查询多、数据量中等 | MySQL 8.0 | 关系型数据库事实标准,生态成熟,支持复杂事务。 |
| 设备遥测数据 | 数据量极巨大、写多读少、时序性强、无需事务 | TDengine 3.0 | 专为物联网设计的时序数据库,写入性能是传统 DB 的 10 倍以上,支持超级表聚合查询。 |
| 热点/缓存数据 | 读多写多、对延迟极度敏感 (ms级) | Redis 7.0 | 内存数据库,用于缓存设备在线状态、Token、分布式锁。 |
| 非结构化数据 | 图片、视频片段、Excel 报表 | MinIO | S3 兼容的对象存储,支持分布式部署与纠删码容错。 |
5.2 关系型数据库设计 (MySQL)
核心业务数据存储于 MySQL,采用 aiot_platform 库(逻辑上可拆分)。
5.2.1 核心 ER 关系图
- 多租户模型:
system_tenant(租户) 1:Nsystem_users(用户) /iot_device(设备)。 - 业务闭环:
iot_device(设备) 1:Niot_device_event(告警) 1:1ops_work_order(工单)。
5.2.2 关键表结构说明
1. 设备表 (iot_device)
设备的“户口本”,存储设备的静态属性与认证信息。
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id |
BIGINT | 设备主键 | 分布式 ID |
product_id |
BIGINT | 产品ID | 关联产品物模型 |
device_name |
VARCHAR | 设备编码 | 唯一标识(如 IMEI、SN) |
auth_type |
VARCHAR | 认证方式 | Secret / Certificate / None |
device_secret |
VARCHAR | 设备密钥 | 一机一密模式下使用 |
status |
TINYINT | 启用状态 | 0-禁用,1-启用 |
tenant_id |
BIGINT | 租户ID | 多租户隔离键 |
2. 工单表 (ops_work_order)
业务运营的核心载体,与 Flowable 流程实例绑定。
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id |
BIGINT | 工单主键 | |
work_order_no |
VARCHAR | 工单编号 | 业务唯一,带日期前缀 |
type |
VARCHAR | 工单类型 | REPAIR(维修), CLEAN(保洁), PATROL(巡逻) |
priority |
INT | 优先级 | 1-低, 2-中, 3-高 |
status |
VARCHAR | 状态 | PENDING, PROCESSING, FINISHED |
process_instance_id |
VARCHAR | 流程实例ID | 关联 Flowable 流程 |
device_id |
BIGINT | 关联设备 | 可为空(非设备类工单) |
5.3 时序数据库设计 (TDengine)
用于存储海量的设备上报消息与日志,采用 “超级表 (Super Table)” 设计模式。
5.3.1 模型设计思路
- 一个超级表:定义同一类数据(如“设备消息”)的通用 Schema。
- 一个设备一张子表:每个设备对应超级表下的一个子表,子表名通常为
d_{deviceId}。 - 标签 (Tags):将设备的元数据(
device_id,product_id,tenant_id)作为 Tag,便于按维度聚合查询(例如:查询某租户下所有设备的平均温度)。
5.3.2 消息超级表 (iot_device_message)
存储所有从 Gateway 流入的原始消息及解析后的 Payload。
Schema 定义 (Fields):
| 字段名 | 类型 | 说明 |
|---|---|---|
ts |
TIMESTAMP | 消息上报时间(主键) |
method |
NCHAR(64) | 消息类型 (jt808.loc.report) |
params |
JSON | 消息体(JSON 格式存储) |
code |
INT | 响应码 |
data |
JSON | 响应数据 |
Tags 定义:
| 标签名 | 类型 | 说明 |
|---|---|---|
device_id |
BIGINT | 设备 ID |
product_id |
BIGINT | 产品 ID |
tenant_id |
BIGINT | 租户 ID |
建表语句示例:
CREATE STABLE iot_device_message (
ts TIMESTAMP,
method NCHAR(64),
params JSON,
code INT
) TAGS (
device_id BIGINT,
product_id BIGINT,
tenant_id BIGINT
);
5.4 缓存设计 (Redis)
5.4.1 Key 命名规范
遵循 模块:业务:ID 的格式,例如 iot:device:online:1001。
5.4.2 核心缓存场景
- 设备在线状态
- Key:
iot:device:online:{deviceId} - Value: String ("ONLINE" / "OFFLINE")
- TTL: 动态续期(心跳间隔 * 1.5)
- Key:
- 鉴权 Token
- Key:
iot:auth:{token} - Value: DeviceDetail JSON
- TTL: 2 小时
- Key:
- 防重锁
- Key:
lock:device:cmd:{deviceId}:{cmdId} - Value: Timestamp
- TTL: 5 秒(防止指令短时重复下发)
- Key:
5.5 数据归档与清理
- MySQL: 业务数据原则上永久存储。对于极早期(3年以上)的历史工单,可迁移至历史库。
- TDengine: 利用其 TTL 特性,配置数据保留策略(例如保留 180 天)。
ALTER DATABASE aiot_db KEEP 180;