TDengine在智慧城市大数据管理系统中的应用实践
TDengine应用场景
1.1 业务场景
系统整体的架构如下图所示,通过广联达自研的IoT平台接入物联网设备采集的时序数据,数据上报后放入TDengine物联网大数据平台,在此平台上再进一步做各种业务相关的应用层开发。
1.2 时序数据类型及规模
1.3 数据模型的设计
{"uuid":"012126","pm25":14.3,"pm10":18.9,"pa":100740.0,"temp":28.0,"rshi":86.4,"wind_speed":1.7,"wind_direction":157.5,"noise":77.2,"time":20190702180330}
{"uuid":"018181","pm25":20.2,"pm10":21.3,"pa":100740.0,"temp":28.1,"rshi":86.2,"wind_speed":1.62,"wind_direction":157.5,"noise":75.9,"time":20190702180330}
2)运行状态错误/报警值--时序数据
环境监测的状态报警数据样例如下:
{"uuid":"018181","item":"noise","value":75.9,"alarm":"true","level":"2","time":20190702180330}
{"uuid":"012126","item":"noise","value":77.2,"alarm":"true","level":"2","time":20190702180330}
选择TDengine的理由
2.1 TDengine对业务性能需求的满足和提升
物联网应用系统中对数据的查询需求多样且复杂,此前的实现方案都是借助于如HBase生态中的各种组件进行数据的存储和查询。在流处理过程中,更多采用Spark Streaming,或者Storm来进行实时处理查询等,由于TDengine相对于前者使用的各种重型组件来说,在部署维护、入门、数据迁移、学习使用上都有先天性的优势,因此在部署物联网数据存储平台过程中,结合实际业务中的数据查询需要,我们了TDngine实现。
1)窗口查询
物联网时序数据的一个典型查询应用就是窗口查询,而在传统解决方案中,不是实现窗口查询的方式难以落地,就是数据查询效率不能接受。在HBase中是通过各种汇聚来实现查询,效率难以保证;Spark Streaming的查询处理虽然可以通过SQL来实现,但是对于窗口函数的定义和读取晦涩冗长。在TDengine中,可以通过一个SQL语句直接实现,也可以通过API直接获取。在Spark Streaming中四五十行的逻辑,在TDengine的API中,调用五行即可达到目的。
2)连续查询
连续查询,通过interval()函数在TDengine中周期性进行聚合计算,并可直接获取新数据,对实际业务中的定时查询实现很有帮助,避免了进行起止时间查询的方式,对功能实现来说,降低不少编码工作。
3)支持标准SQL
TDengine支持标准的SQL操作,同时也提供了完备的JDBC驱动包,对传统的DBMS工具组件提供了标准支持,因此,原有基于Java的业务系统在开发效率上完全可以无缝迁移到TDengine中。对于大屏查询、报表工作等业务操作,无需进行特定的开发工作。
4)标签维度查询
按照业务常用的查询维度,在超级表上做不同的Tag,比如基于设备ID、位置描述、型号等信息,契合常用查询维度,结合Tag查询,直接可以对一类设备进行数据筛选查询,避免了之前系统,先查业务关系再去join实际数据的过程,逻辑上清晰,实现上简单,业务上便捷。
2.2 大幅提升时序数据读写及流处理性能
对于省市级规模的智慧城市管理系统,涉及的智能监测设备数量非常大,对监测点产生的时序数据的读写性能要求比较高,并且针对一些城市生命线或危险源相关的设备监测数据的实时流数据处理性能要求也很高,比如设备报警需要基于不同设备的阀值规则通过流处理生成报警信息,其实时性要求比较高。采用普通关系型数据库存储的解决方案很难满足业务上的性能要求,而采用TDengine的技术方案,不仅在时序数据读写的性能上有大幅提升,而且利用其针对时序数据高性能的插入、查询、聚合统计以及大规模的实时流式计算等功能,可大大提升基于业务规则的流数据处理性能。
2.3 节约计算资源和存储成本
由于TDengine采用独特的列式存储以及领先的压缩算法,其存储空间比一般数据库大大减少,从而节约了大量的计算资源和存储成本,并且从系统安装到数据备份、数据恢复几乎都能自动完成;扩容、升级等运维操作也能轻松完成 ,系统的运维成本也能降低不少。
TDengine应用技巧和经验
3.1 善用超级表
超级表(STable)作为TDengine的特色,具备了模板和索引的双重特性功能,结合Tag查询以及自动生成子表功能,对数据操作存储完全自动化、智能化,以及在简单业务上更加灵活。
3.2 善用JDBC工具
由于对SQL的支持,TDengine很容易支持JDBC规范的接口。我们在实际开发过程中,基于Java调用JDBC驱动来操作TDengine,得益于TDengine的SQL支持能力和完备JDBC驱动,我们用来开发的JDBC框架和DBClient工具直接可以进行工作,Mybatis和DataGrip工具继续在数据实现转型中发挥来巨大的辅助作用。
3.3 强大的订阅机制
在部分实时性要求比较高的场景下,我们尝试使用到了TDengine的订阅机制,对流处理中回调功能进行补全加强,订阅了一个SQL的查询结果集。目前,对于流处理业务来说,对符合固定逻辑的数据获取,非常好用,因此适合采用订阅的方式来进行逻辑驱动。目前TDengine中的订阅功能只有C和Java语言端的实现(在用1.5.2版本)。
TDengine应用中遇到的问题
4.1 JDBC驱动并非完美
虽然目前JDBC驱动已经非常完备,但是偶尔几个标准实现上会有不同的结果,当然这些功能都是非数据接口上的,不影响正常数据操作。目前发现的有:在DataGrip上的确认数据库是否存在的返回值,有不同结果;有些特定的SQL并不是标准类型,被IDE回报说不支持的类型,实际上能够执行成功。
4.2 文档有待完善,大家多多实践
目前的文档一些地方其实不够明确,大家需要多动手实践摸索,很多隐藏的内容,在文档中并未体现,多操作多尝试会有更多收获和体会。
来源 https://www.modb.pro/db/168918
相关文章