作者:黄斯郡
一次调侃
在认识TDengine之前,我一直都在做工业互联网项目,其中的一些工作,包含数据从应用层到大数据库的汇总、分析计算,以及反馈应用层需要的业务报表数据。
例如计算平均每分钟的功率曲线、统计每分钟的用电量、对比不同设备乃至厂区的耗能情况,这里面既有实时流计算也有批处理。
如果把大数据系统作为一个中台型服务,它对应用层暴露的仅仅是HTTP形式的查询接口,背后需要涵盖很多技术组件,例如将Hadoop的HDFS/Hive做原始数据保留、使用Hbase保存计算后的数据、利用消息中间件Kafka同步各类数据库,计算框架是使用Flink还是Spark、分布式协调上选择Zookeeper。
因此,整个框架技术组件看起来非常的"重",一方面体现在你需要对Hadoop的技术组件非常熟悉:例如数据均衡备份冗余策略、Hive分区策略、Hbase的key设计规则;另一方面则体现在业务规则的不好把控和适应:以每分钟的功率计算为例,开始是取该分钟间隔内的后一个数值,后来改成取该分钟内的平均数值,凡此种种需要大数据系统从ods层面重新进行计算,会带来非常大的开发工作量。
项目经理经常调侃,"就是展示几条曲线,几个数据而已,为什么要那么复杂?"
一篇文章
在调侃之余,我们开发人员也在思考,其实工业互联网以设备为主线,统计的都是一段时间内单个设备的数据,难道就没有一个能够很好地强调物联网时序场景的大数据软件吗?
一次偶然机会,我在朋友圈看到了这篇文章——《比Hadoop快至少10倍的物联网大数据平台,我把它开源了》,再结合搜索引擎的这几个关键字——"秒杀Hadoop""分布式集群""开源",马上就吸引了我的注意,点进去一看,真的大有相见恨晚的感觉。
因为TDengine的优势完全可以解决我们的痛点——以设备数据模型创建超级表,以设备为单个子表,按时间先后顺序连续存储数据。在查询的时候,可以提供预计算的统计数据,可以基于设备单个子表的tag做聚合的功能,结合流计算中的滑动窗口、滚动窗口概念,还可以快速地基于原始数据得到聚合统计结果。
此外,TDengine还支持分布式集群部署,避免单点故障,提升存储计算能力。更重要的是,这个集群功能也是开源的!开源核心功能意味着不用担心以后给人卡脖子,也意味着会有一个的开源社区伴你同行。
启航扬帆
两篇文章
项目运行一段时间后,我们团队在客户端连接高可用方面也尝试着进行了思考和改进。实际场景下,我们会依据数据需求动态增加节点,但是不希望应用程序也跟着改动连接地址,所以我们希望应用程序的连接域名不变。那么,怎么实现呢?
比如,连接域名'td-prod-service:6030',通过负载均衡服务进行udp转发(TDengine的连接是走udp协议),随机分发连接请求到实际的三节点之一(prod-td-1:6030, prod-td-2:6030, prod-td-3:6030),之后,应用程序根据接收到的节点信息,和实际的节点发生连接。为了解决这个问题,我们曾和TDengine社区的官方小伙伴们进行很多互动交流,后来他们把这个做成了经典案例文章——《「GitHub问题精选」TDengine 如何做到客户端高可用?》
再接着,我们又接到了应用适应客户时区进行统计的需求,这个需求的背景是因为我们的设备遍布全球,每个客户审阅自己设备的统计数据时,当然期望是以客户自己所在时区为维度进行统计。很幸运,TDegnine不仅提供了时间窗口函数interval,还支持偏移 offset(偏移必须小于间隔)。
首先,我们配置taos的系统时区为"timezone UTC-12"(即地球早的时区)。然后,当中国时区客户(Asia/Shanghai (CST, +0800))查询以天为间隔时,我们会偏移4个小时,例如, interval(1d, 4h);当美国时区客户(America/Los_Angeles(PST, -0800)查询以天为间隔时,我们会偏移20个小时,例如, interval(1d, 20h);
后来,TDengine的社区技术支持人员也基于此做成了经典案例文章——《一文帮你掌握TDengine的降采样查询+跨时区统计》,当时我还没留意,是我的同事和我说“你看这个文章里的示范表叫daluo(我的微信ID名字)”我才发现。当时,我的心情是十分惊喜的。
这两篇文章在解决我们问题的同时,进一步完善了TDengine自身与用户交互的技术资料,我们真正做到了在开源社区中合作共赢。
几点希望
未来,我们希望TDengine可以继续保持开源的态势,及时友好地解答用户的疑问,为社区繁荣以及中国的开源软件建设充当开路者。
同时,我们也希望TDengine的软件部署可以向容器化的方式靠拢。毕竟在当下云原生的时代,容器化已经是团队提升效率必不可少的利器。想象一下未来的场景,基于云计算的强大共享存储计算能力,以及可靠稳定的容器化编排环境Kubernetes,开发者只需要简单的运行k8s operator就能运行TDengine,然后实现版本的升级以及计算资源的随意调度,将给运维带来极大的便利。
此外,结合传统的数据仓库星形模型,我们也希望TDengine可以实现多表的联合查询统计。因为在设备的背后是业务,设备总是会关联具体的车间、客户、厂区,而我们可能无法把所有的业务属性一次性预先作为tag写入到子表中(虽然我们现在是这样做的),当有新的业务属性需要关联的时候,我们又需要去增加超级表的tag,然后更新到对应的设备子表数据。而实际上,tag和设备数据更像是索引关系。所以,如果子表作为事实表可以随意和维度表进行关联统计查询,这又是一个多么美妙的场景!
后,我们希望结合机器学习等框架,TDengine可以衍生出自己的 "MapReduce" 作业框架,支持开发者在上面进行人工智能作业分析。
总结一下,就是希望TDengine可以在物联网大数据平台方向提供全栈的技术方案,为企业的提效降本提供扎实便利的技术基础,成为整个行业的事实标准。