做设备监控、环境监测、或者长时间采集项目的朋友,早晚会遇到同一个问题:硬盘不够用了。
一套数据采集系统跑起来,每秒几百个点,一天下来就是几千万条记录。一个月、一年之后,数据库几十个G甚至几个T,查询一次要等半天,备份恢复更是灾难。客户还要求"历史数据至少保存三年",听着就头大。
今天咱们就聊聊:历史数据存储量太大,到底该怎么处理? 压缩、归档、还是干脆删一部分?各种策略的优缺点和适用场景,一次说清楚。
一、先算一笔账:你的数据量到底有多大?
很多项目刚开始时,没人认真算过存储量。我们见过一个客户,说"数据不多,就几十个通道",结果每个通道每秒采1000次,一天就是:
-
50通道 × 1000次/秒 × 86400秒 = 每天约43.2亿条数据
-
每条数据按时间戳+浮点数+质量戳≈20字节,每天约86GB
一年就是30TB,普通硬盘根本扛不住。
所以第一步永远是做估算。算清楚:采样率 × 通道数 × 存储时长 × 每条数据字节数。心里有数之后,再决定用什么策略。
二、数据压缩:先让数据"瘦身"
压缩是最直接的思路,而且无损压缩和有损压缩要分开考虑。
1. 无损压缩 ------ 不丢精度,适合关键数据
对于不能丢失精度的数据(比如温度、压力、报警记录),用无损压缩。
常见方法:
-
差分编码 + 可变长度编码:相邻两个数据的变化量往往很小,存差值比存原值省空间。差值再用简单哥德尔编码或干脆存int16。
-
工业时序数据库内置压缩:InfluxDB、TDengine、TimescaleDB等,都自带高效的压缩算法。实测压缩率能达到5~10倍,甚至更高。
-
通用压缩(ZIP、LZ4、Zstd) :简单粗暴,但针对数值型数据的压缩率不如专用时序库。
实际案例:一个客户原来用SQL Server存原始浮点数,一年数据300GB。换成TDengine(自动压缩)后,降到40GB,查询速度还快了几十倍。不需要改代码,只换了底层数据库。
2. 有损压缩 ------ 牺牲一点精度换巨大空间
对于分析趋势、统计报表这类用途,不需要小数点后五六位。比如温度传感器精度本来就是±0.5℃,存到0.001℃纯属浪费。
典型方法:
-
旋转门压缩(Swinging Door) :只保存那些"不在容差范围内"的点,中间的直线能拟合的数据点直接丢弃。常见于SCADA和PI System。
-
死区压缩(Deadband) :变化量超过阈值才存新点,否则沿用上一个值。阈值设0.1%,数据量轻松减掉90%以上。
-
采样率降维:如果原始采样率100Hz,但分析只需要1Hz,可以定期做重采样,丢弃中间99%的数据。前提是业务上能接受。
选择有损还是无损,只有一个标准:业务上允许多大的误差。跟客户确认清楚,别自己拍脑袋。
三、归档策略:冷热数据分开存放
压缩做完之后,数据量还是大,就要上归档了。核心思想:热数据放高速存储(SSD),冷数据挪到低速存储(机械盘或云归档)。
1. 按时间分片 + 自动清理
-
设置数据保留周期,比如"在线热数据保存3个月,之后自动转归档"。
-
归档时按月份或季度分文件存储,文件名带时间范围,方便以后查询。
-
超过最终保留期限(比如3年)的数据,自动删除或提示用户手动清理。
2. 聚合与降采样 ------ 冷数据的"缩略图"
历史数据保留那么细的粒度其实很少用到。可以对冷数据做降采样:
-
原始秒级数据保存1个月
-
之后聚合为分钟均值、最大值、最小值,保存6个月
-
再之后聚合为小时均值,保存3年
这样既保留了趋势,又极大减少了存储量。查询老数据时,如果请求的时间范围太大,后台自动从聚合表返回结果,用户几乎无感知。
3. 使用云存储或外部介质
对于超大规模项目,本地存不下就只能上云或外挂。
-
云对象存储(AWS S3、阿里云OSS) :把超过1年的数据打包成Parquet或ORC格式上传,查询时再拉回来(延时几十秒到几分钟)。
-
磁带或蓝光光盘:极端冷数据,比如法规要求保存10年但几乎不会访问的,可以写磁带或光盘后离线存放。
四、数据库选型:别死磕传统关系库
很多项目上来就用SQL Server或MySQL存时序数据,不是不行,但性价比低。专为时序数据设计的数据库(Time Series Database,TSDB)在压缩和查询上都更有优势:
-
TDengine:国产开源,列式存储+块压缩,写入和查询都快,压缩率比通用库高3-5倍。
-
InfluxDB:老牌TSDB,生态成熟,但集群版收费。
-
TimescaleDB:基于PostgreSQL,支持标准SQL,熟悉PG的团队上手很快。
-
DolphinDB:功能强,内置分析函数,适合金融量化,但学习成本高。
迁移成本评估:如果现有系统已经基于MySQL/ SQL Server稳定运行,不建议为了压缩率大动干戈。但如果还处于选型阶段,优先考虑TSDB。
五、实际案例:一个数据压缩归档的配置参考
假设一个风电监测项目:
-
100台风电机组,每台20个测点
-
采样频率1Hz
-
要求保存原始数据3个月,之后保存小时均值5年
做法:
-
前端采集程序写入TDengine,数据库启用默认压缩,原始数据占用约200GB/月(300个测点×1Hz×一个月)。
-
每天凌晨运行一个任务,将3个月前的原始数据聚合为小时均值,写入另一个表"hourly_avg",同时删除原始数据。
-
小时均值表数据量大幅降低(减少3600倍),5年仅约200GB。
-
再老的数据(超过5年)打包上传到对象存储,本地只保留最近5年的索引。
最终客户只需要一台2TB的普通服务器,就满足了所有要求,成本比最初方案降低了90%。
由你创科技能做什么
我们由你创科技 在上位机软件开发过程中,几乎每个项目都会遇到"历史数据存储"问题。从最初的数据采样设计、数据库选型,到中间的数据压缩策略、降采样逻辑,再到最后的冷热分离、自动归档,我们都沉淀了一套成熟的方案。
如果你正在被海量数据折磨------数据库越来越大、查询越来越慢、备份时间越来越长------欢迎来找我们聊聊。我们不一定非要重新开发一套新系统,也许只是给你现有的软件加一层压缩和归档模块,就能再撑好几年。
毕竟,能存下所有数据不算本事,能存得聪明、查得快、成本低,才是真功夫。