企业介绍
万朗水务科技集团专注于为城市管理者(水务、住建、水利、生态环境等部门)在城市水脉的建设、修复与运维中提供系统性、智慧化、综合解决方案,是城市水脉健康&智慧管理专家。作为一家以科技创新为引擎、以技术服务为核心的专业化公司,在解决城市内涝、雨季淹城看海、管网漏损比重大、爆管、局部积水塌方、城市水体黑臭、河道污染等棘手问题方面拥有多个生态化、智慧化、系统化的解决方案。
业务场景
水环境综合治理运维系统是万朗集团旗下子公司万朗智水科技有限公司研发的一套针对一体化截污装置、河道等多种水环境对象,实现智能化运维管理的综合性平台。其需要对智能在线设备中的液位、电流、硫化氢等参数进行监测,并通过PLC程序进行自动化管理设备的启停与报警短信推送。传感器采集的信息通过MQTT协议传到网关,网关收集到信息后会定时推送到业务后台服务,由服务层来做数据存储和实时分析。设备运行业务数据放在MySQL里面,液位、电流频率、硫化氢、雨量物联网数据放在Taos里面。
TDengine应用场景
1.1时序数据类型及规模
在水环境综合治理运维系统中,使用TDengine的数据存储各类终端设备的采集数据,比如硫化氢、电压、电流、雨量、温度、液位、闸门、风机、排风扇、溶解氧等信息。
目前系统上存在20个点每个点有80+个监测数据上传,每日新增的监测数据量约为100MB。如果按照此类设备的增量,后面会达到2000个点每天将近10G的数据量。
现场设备监测数据图例:
时序数据库部分存储量图例:
水环境综合治理运维系统图例:
1.2数据模型的设计
目前已每个监测点的id作为TAGS创建了超级表STable:
1.2.3首先创建超级表:
CREATE TABLE DevTagValue (createTime timestamp,sampleTime timestamp,tagName binary(100),updateTime binary(50),tagValue binary(50),devID binary(50),Id binary(50))
TAGS (location binary(100));
1.2.4子表:
CREATE TABLE devtagvalue_300219010764 USING DevTagValue TAGS ('300219010764');
CREATE TABLE devtagvalue_300219030026 USING DevTagValue TAGS ('300219030026');
一个点一张表,这样做的优势是非常明显,监测点的数据根据id插入到对应子表中,其中子表是根据业务动态创建的。对其作指定时间范围的查询,不用考虑子表的数据,直接从时间戳索引得到想要时间范围的数据,效率很高。
选择TDengine的理由
在系统前期的版本中,我们使用了MySQL数据库来存储设备上报数据。但接入系统的设备量日益增长、用户对数据实时性反馈的要求也越来越高,MySQL已经无法满足业务需求。我们发现将设备数据转移到时序数据库TDengine中存储是个更好的解决方案。
刚开始MySQL中存储了一个点上报的所有数据频率普遍在秒级,对一个表的插入与查询的压力过大,然后以站点进行了分表操作。效果好了点,由于数据量太大查询效率极低。总结规律后根据监测数据的类型进行分表操作,这样对于一个点效果明显提升,但是业务在不断扩张,站点在不断增加的情况下频繁的跨表操作MySQL查询出现了延时甚至超时死锁的情况。
时序库的选型
一:OpenTSDB + HBase
这个方案目前使用的人比较多,但有写缺陷
1)HBase集群配置要求高,需要很好的调优,需要专门精通人员去维护增加了不少人员成本。2)OpenTSDB默认的compaction策略每到整点都会对上一小时的数据查询出来compact成一行,写入到HBase,删除原始数据,这个相当耗费cpu。即使关闭compaction,修改tsd.storage.enable_appends = true 启用append的方式低配机器 cpu也是相当高。综合考虑人员及服务器等成本还是放弃了。
二:TDengine
TDengine是一个简单快捷高性能的时序数据库,提供高性能的同时大大降低了安装、部署、维护的成本,是当前水环境综合运维系统底层采用的变量数据存储引擎。TDengine解决了我们几个之前较为头疼的问题。
1)安装简单。下载rpm包,一个命令安装完毕即可运行。2)性能强劲。测试场景:十万张点表,每个点表1s需要存储1条记录。在实际测试过程中,使用http接口,采用单机4C16G的配置,8线程每次写500条记录,10万条记录写入只需要300ms(如果使用java客户端更快);单变量采样查询基本在2ms内完成。整个测试持续了48小时,测试期间cpu在20%-30%之间,内存维持在6G左右,写入相当稳定,没有出现超时。
综合考虑,使用TDengine硬件成本和开发维护成本大大降低,写入和查询速度还比opentsdb等高一个级别。
使用mysql查询3个点一年的数据直接请求超时,使用TDengine基本就2s左右就能返回给页面进行渲染。
总结:
万朗智水采用TDengine后节省了其他方案搭建集群的费用,并且在写入速度和查询性能方面完全满足了业务的需求,作为一款为物联网场景设计的时序数据库,TDengine确实展现了在设备多、采集频率高的情形下显示出其性能高、架构简答的优势。相同的设备实时数据查询场景。其超级表的设计省去了不少联表查询逻辑,大大简化了业务层的开发工作。我们当前的系统已经发挥出其数据缓存和时序索引的能力,会在后面继续探索使用下TDengine的流式计算和订阅的功能,充分发挥底层数据库的功能,再进一步优化平台的系统架构。
作者简介:
武择丰,上海万朗智水科技有限公司研发部研发工程师,开源社区爱好者,目前负责智水公司所有项目后台框架搭建,业务研发等工作。