在社区,有用户提到了一个这样的问题,千亿级大数据如何存储。这位同学给出了以下的使用背景。
我们关注到他的问题描述,虽然整体数据量并不是很大,但从应用场景上来看,非常符合时序数据库(Time-Series Database)的使用场景。首先数据产生具有明显的时间戳,每10秒记录一次数据。其次,是设备按照场站来划分,分别记录每个场站监控设备的数据。这种应用场景很典型,对于数据的需求存储高过读取,例如现在很火的车联网 GPS 数据、银行交易记录等,都需要对不同时期的数据做不同的压缩处理,以达到更高的压缩率以及更低的运维成本。这种情况下其实可以考虑下 TDengine Database,分布式、开源还支持 SQL,对于数据迁移方面也有非常成熟的迁移案例。
推荐使用 TDengine Database 的原因除了业务使用场景符合,还有一点非常重要,TDengine 特有的超级表(STable)能高效快速的完成存储和查询的需求,运用不同的压缩手段对冷热数据进行分别的压缩和落盘,对常用的查询数据进行预计算,这些都大大提高了数据库的性能。
具体的测试报告可以参见官方文档:
用InfluxDB开源的性能测试工具对比InfluxDB和TDengine - TDengine | 涛思数据
TDengine与OpenTSDB对比测试 - TDengine | 涛思数据
对于如何建库、建表,我们也有很详细的视频讲解
库、表、超级表是什么?怎么用?60后大叔抽丝剥茧讲清TDengine的数据建模 - 知乎
我们经常用最典型的电表数据来做举例,假设每个智能电表采集电流、电压两个量,其采集的数据如下图所示。
这里就要提到 TDengine database 的一个关键创新点——一个采集点一张表。同一类型的采集点用一个超级表来描述,也就是一个表结构Schema和静态标签Schema 。就上图来说,电表ID作为子表名(d1001, d1002, d1003, d1004等),动态采集的物理量作为各字段,静态属性(Location和groupId)作为子表标签。利用超级表作为模板,生成子表 – 对应各采集点,有了超级表,极大地方便了同类采集点的数据检索、查询、聚合。
我们再用新能源汽车为例做一个场景及建模的分析。
- 某车企拟对其生产、销售的新能源汽车进行追踪分析;
- 每辆车配置了远程采集终端,采集车辆状态信息:位置(经纬度)、车速、电池温度、电池电流、环境温度、轮胎胎压;
- 后台统计分析需要按:车型、销售区域、销售员、电池包容量、电机功率进行分类聚合;
- 6个采集量中前4个为同时采集,将其放入一张超级表 – vehicle_main, 其余2个测点,温度与胎压采集的频率完全不一样,分别创建2个超级表 – vehicle_temp, vehicle_tire;
- 每辆车有唯一编码VIN,采用该编码与超级表的表名前缀作为唯一表名。
SQL语句示例
CREATE DATABASE nev KEEP 3650;
USE nev;
CREATE TABLE vehicle_main (ts timestamp, longitude double, latitude double, vspeed int, btemp int, bcurrent int) TAGS (vin binary(30), model binary(20), szone binary(30), sales int, bcapacity float, mpower float);
CREATE TABLE vmTS8392EGV062192009 USING vehicle_main TAGS ("TS8392EGV062192009", "GTS7180", "Beijing.haidian", "10060089", 86.0, 125.5);
CREATE TABLE vehicle_temp (ts timestamp, vtemp int) TAGS (vin binary(30));
CREATE TABLE vtpTS8392EGV062192009 USING vehicle_vtemp TAGS ("TS8392EGV062192009");
CREATE TABLE vehicle_tire (ts timestamp, vpressure int) TAGS (vin binary(30));
CREATE TABLE vtrTS8392EGV062192009 USING vehicle_vtire TAGS ("TS8392EGV062192009");
//查询指定车辆最近10天的运行轨迹
SELECT ts, longtitude, latitude FROM vtrTS8392EGV062192009 where ts >now -10d
//按车型查询平均车速、平均动力电池温度、平均放电电流
SELECT AVG(vspeed), AVG(btemp), AVG(bcurrent) FROM vehicle_main GROUP BY model
通过以上的内容,希望能给大家更多的启发,也希望更多的技术小伙伴加入到我们的开源社区一起讨论和发现更多技术可能。技术支持 - TDengine | 涛思数据