最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述TDengine 在蔚来能源系统的落地实践相关的知识,希望能为你提供帮助。
一、?项目背景?为了给用户提供更好的补能体验,蔚来能源在加电基础设施上进行了大量的投入,截止 2021 年底,已经在全国各地布局了换电站 777 座,超充桩 3,404 根,目充桩 3,461 根,为用户安装家充桩 96,000+ 根。
为了对设备进行更高效的管理,需要将设备采集数据上报至云端进行存储,并提供实时数据查询、历史数据查询等业务服务,用来做设备监控和分析。
?现状?
在业务诞生之初,我们用作数据存储的选型是 mysql + HBase,MySQL 存储设备最新实时数据,HBase存储设备原始数据,大体架构如下:
之所以选择 HBase,有以下几个理由:
?痛点?
初期因为设备不多,数据量不大,加上查询场景单一,HBase 表现不错,可以满足业务需求。
随着换电站和超充站等设备在全国的快速布局,设备数量持续增长,积累的数据量越来越多,长时间跨度数据查询效率出现瓶颈,再加上查询场景不断丰富,HBase 已经无法满足当前业务需要。问题主要体现在以下几点:
二、?落地方案?
?技术选型?
为了解决这些痛点,我们将目光投向时下流行并且更适合物联网领域的时序数据库。经过调研,对比多个技术选型,最终决定使用 TDengine 代替 HBase 作为设备原始数据存储。
在选型时我们考虑过 OpenTSDB,也是一款优秀的时序数据库产品,在部门其他业务中已经有过比较成熟的使用,能解决一部分遇到的痛点:
但是 OpenTSDB 底层还是基于 HBase 的,HBase 存在的一些问题,OpenTSDB 依然会有,并且架构并没有变简单,没有摆脱 HBase 的依赖。
经过对比,我们决定尝试一下 TDengine,其官方给出的性能指标,单节点部署情况下可以达到 14810 k/s 读取,和 880k/s 写入,同时 TDengine 具备的一些特点能很好地解决我们遇到的痛点:
?前期测试?
我们使用 TDengine 做了一些简单的性能测试,评估使用 TDengine 是否能满足我们的业务需求。
?测试准备?
?测试场景?模拟 10,000 个设备上报数据,消息并发约 4k 左右。
?SQL -- 代码示例,非真实代码?
??CREATE STABLE device_data_point_0 (ts timestamp, d1 nchar(64), d2 nchar(64), ...) TAGS (t1 binary(64));
?
?
?测试结论?采用批量写入数据方式,调整合适的单批次数据量大小,使用单机部署(8 核 32 GB,500 GB 存储)默认配置的 TDengine 服务,RESTful API写入方式,在 4k 并发流量下写入没有问题,同时消费积压数据时峰值达到 7 k/s,因为单条消息包含信息量太大,实际处理中会拆分为 30 条写入 TDengine,所以实际写入 QPS 为 210 k/s,比满足同样数据流量的 HBase 集群规模要小不少,可以节省成本,再加上 TDengine 本身部署不依赖其他三方软件,也可以同时节省运维成本。
?迁移方案?
经过测试,我们决定先对部分设备应用 TDengine 时序数据库替代 HBase,同时需要考虑如何在不影响业务功能的情况下平滑过渡并完成迁移。
?数据双写?因为目前没有现成的工具可以直接把数据从 HBase 迁移到 TDengine,如果自己开发一个工具做这件事情,开发成本太高,而且可能是一次性的。
考虑到不想浪费开发资源,同时我们需要一个过渡期,期间如果 TDengine 出现问题可以迅速切换回 HBase,不影响业务,所以不能马上把 HBase 废掉,所以我们决定先实现 TDengine 写入,并且暂时保持 HBase 和 TDengine 两个数据库双写。
?写入方式?根据前期测试结果,我们选择直接采用批量方式写入数据:
经过压测,在n = 1,000,t = 500 ms 情况下,单次写入耗时基本在 10 ms 以内,意味着我们可以支持单个设备类型每秒上万的并发写入,并且还有进一步的优化提升空间。
?查询切换?为了保证迁移过程顺利,并且迁移前后不会出现数据不完整的情况,我们做了一个查询开关:
迁移后架构变为如下所示:
?三、实际效果?目前我们已将线上部分设备的数据切换到 TDengine 集群,上线后集群表现稳定。
对比之前使用 HBase:
四、?总结?
?关于作者?
【TDengine 在蔚来能源系统的落地实践】李鹏飞,蔚来汽车能源数字化产品开发部高级工程师,目前负责能源物联平台开发。
推荐阅读
- [kubernetes] POD健康检测和自愈
- [kubernetes] 交付dubbo之zookeeper安装配置
- 四大功能!带你初识 Fabric | 容器网络系列第2期
- [kubernetes] 跨云厂商使用公网IP搭建k8s v1.20.9集群
- WebRTC开源技术平台新版EasyRTC如何获取推流信息列表()
- [kubernetes] 交付dubbo之在jenkins配置多jre版本的maven
- 基于Redis6.2.6版本部署Redis Cluster集群 #yyds干货盘点#
- [kubernetes] HPA实现自动水平伸缩POD
- ES2022 有什么新功能