数据采集与存储:数据源类型、格式与策略
做数据回放,第一步就是搞清楚数据从哪来、长什么样、怎么存。这三个问题搞不定,后面定位问题就是空中楼阁。我这些年踩过的坑,十有八九都跟数据采集和存储有关。
数据源类型:三种最常见的“原材料”
数据源说白了就是数据的源头。我个人习惯把数据源分成三大类:传感器日志、数据库binlog、网络pcap。每种都有它的脾气。
1. 传感器日志
这是嵌入式系统里最常见的数据源。温度、湿度、加速度、GPS坐标……传感器每隔几秒吐一条记录。我在项目中遇到过一个问题:传感器采样频率是100Hz,但日志系统扛不住,丢包了。后来发现是日志写入线程优先级太低,被其他任务抢了CPU。
2. 数据库binlog
binlog是MySQL等数据库的二进制日志,记录了所有数据变更。做数据回放时,binlog能帮你精确还原某个时间点的数据库状态。嗯,这里要注意:binlog的格式有STATEMENT、ROW、MIXED三种。我建议用ROW格式,因为它记录了每一行数据的变化,回放时最精确。
3. 网络pcap
pcap是网络数据包的抓包文件。做网络协议分析、定位丢包或延迟问题时,pcap是首选。你想想看,一个TCP连接为什么卡住了?抓个pcap一看,哦,原来是重传风暴。
我曾经用pcap回放定位过一个诡异的问题:某设备每隔5分钟断连一次。抓包后发现,是路由器的ARP缓存过期了,设备没有及时刷新。这种问题,不看pcap根本想不到。
数据格式:CSV、JSON、Parquet
数据采回来了,用什么格式存?这取决于你要怎么用。我列个表,一目了然。
| 格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CSV | 简单、人类可读、Excel直接打开 | 不支持嵌套结构、大文件性能差 | 小规模数据、快速查看 |
| JSON | 支持嵌套、灵活、Web生态好 | 冗余大、解析慢 | API数据、配置、日志 |
| Parquet | 列式存储、压缩率高、查询快 | 不直观、需要工具查看 | 大数据分析、数据仓库 |
我个人习惯:调试阶段用CSV或JSON,方便肉眼检查。正式回放系统用Parquet,性能好太多。有一次我处理100GB的传感器数据,CSV格式跑了半小时没跑完,换成Parquet后,5分钟搞定。
存储策略:本地文件、云存储、消息队列
数据存哪?这得看你的回放系统是实时还是离线,数据量有多大。
1. 本地文件
最简单直接。适合单机调试、小规模数据。我刚开始做数据回放时,就是把pcap文件丢在本地,写个脚本循环读取。但本地文件有个问题:磁盘满了怎么办?我遇到过磁盘写满,导致回放程序崩溃的情况。
# 一个简单的本地文件读取示例
import pandas as pd
df = pd.read_csv('sensor_data.csv')
for index, row in df.iterrows():
replay(row) # 回放每一条数据
2. 云存储
数据量大、需要多机共享时,云存储是首选。S3、OSS、MinIO都行。我建议用对象存储,因为它支持版本管理,万一回放出问题,还能回滚到旧版本。
3. 消息队列
实时回放场景,消息队列是标配。Kafka、Pulsar、RabbitMQ都行。数据从采集端直接写入队列,回放系统从队列里消费。这样做的好处是:解耦、可扩展、支持回溯。
我记得有一次做实时回放,数据源是1000个传感器,每个每秒发10条数据。如果用本地文件,根本来不及写。换成Kafka后,轻松搞定。
知识体系结构图
下面这张图,把数据采集与存储的核心逻辑串起来了。你看一眼,就能明白整个流程。
说白了,数据采集与存储没有银弹。你得根据实际场景选。数据量大、实时性高,就上消息队列+Parquet。数据量小、调试用,本地文件+CSV就够了。
好了,数据采集与存储这块就聊到这。记住:数据源要准、格式要稳、存储要快。这三样做好了,后面的回放和定位问题就轻松多了。