数据压缩比 38.65%,TDengine 重塑 3H1 的存储与性能
小T导读:这篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一。作者通过自身实践,详细分享了 TDengine 在高端装备运维服务平台中的应用,涵盖架构改造、性能测试、功能实现等多个方面。从压缩效率到查询性能,从功能优化到使用体验,文章不仅展示了 TDengine 的技术优势,也提出了许多宝贵的改进建议,给人以深刻启发。
为什么选择 TDengine?
在装备行业的物联网场景中,实时数据量极为庞大,涵盖温度、压力、振动、位移等多种参数,对这些数据的高效分析和精准预警成为一大挑战。具体需求可以总结如下:
-
高并发写入:需要支持每条记录附带时间戳的高频数据写入。
-
灵活表设计:不同传感器设备的数据字段各不相同,需要针对每个设备灵活建表。
-
长期存储与压缩:原始数据需存储至少 5 年,要求具备高效的数据压缩能力以降低存储成本。
-
国产化支持:需满足国产化要求,并能提供快速响应的厂商服务。
我们选择使用 TDengine 社区版 2.2.1.1 进行分布式模拟测试,实验环境搭建在以下配置的三台服务器上:
测试一:验证时序数据库在 3 台节点上的写入性能 模拟了 2 个厂区、共 10 个车间的数据,每个车间包含 1000 个监测点。从 2017-07-14 10:40:00.000 开始写入模拟数据,时间戳间隔为 0.001 秒,每个监测点写入 50 万条记录。
测试采用 8 个线程并行写入。在超过 50 亿条记录后停止写入程序,测试结果显示,平均写入速度达 191 万条/秒。
测试二:验证时序数据库在 3 台节点上的数据压缩能力 基于测试一的结果,检查 3 台数据库节点的实际文件存储大小,具体数据如下:
落盘后的文件总大小为 36GB,而原始数据大小为约 93.13GB(按 50 亿条记录,每条 20 字节计算)。由此可得,数据压缩比达到 38.65%。
测试三:验证时序数据库在 3 台节点上的历史数据回溯查询性能 随机选取一个测点,查询其在特定时间段内的历史数据。例如,从 2017-07-14 10:40:00.000 到 2017-07-14 10:40:10.000,共计 10 秒内的 10001 条记录(查询结果输出至文件)。对应的数据库查询语句如下:
select * from d0 where ts >= ‘2017-07-14 10:40:00.000’ and ts <= ’2017-07-14 10:40:10.000’ >> /dev/null;
试验证明,TDengine 具有卓越的写入性能、高并发能力以及极低的查询延迟。其分布式架构确保了系统的可靠性、稳定性和数据完整性。基于测试结果,我们迅速将 TDengine 应用于现有业务系统,进行升级改造入。
TDengine 在 3H1 上的落地实践
3H1 高端装备运维服务平台重点解决高端成形装备企业由制造化向服务化转型的关键问题,为企业提供工业互联网与智能运维的整体解决方案。
如下图所示,TDengine 与高端成形装备的智能数据采集终端模块深度集成,助力采集终端完成对设备运行数据的采集,为系统提供设备数据基础。工业云计算服务平台则进一步提供数据的存储、转换和分析能力,为业务系统提供强有力的数据支持。同时,智能运维服务系统由装备智能运维服务平台和智能运维服务 APP 组成,分别为企业人员提供系统和移动端的服务支持。
针对企业多种应用场景,系统应用服务共分为以下六大功能模块:
1.企业驾驶舱:专为设备制造企业的管理者设计,便于全面掌握平台数据和关键业务流程指标。通过直观的界面,管理者可以轻松了解设备销售情况、企业接入信息以及平台数据的采集情况。同时,驾驶舱支持对关键业务流程进行管理,包括设备监控、报警信息展示、维修效率分析、设备故障情况以及三包任务的追踪和管理。
2.设备资源管理:旨在为每台高端成形装备建立电子档案,便于全面了解设备的历史状态、当前运行情况,并优化设备运行与未来状况预测。在查看具体设备信息时,系统主要呈现以下四个维度:当前工况、健康分析、维修情况和历史工况。
其中,当前工况为用户提供设备的基本信息、关键指标和报警情况的总览,帮助快速掌握设备的实时运行状态。
健康分析的目的是帮助用户全面掌握设备的当前状态以及健康状况随时间的变化趋势。如果设备面临故障风险,系统能够快速识别风险来源及故障模块,为用户提供精准的诊断支持。
维修情况则是为用户提供设备维修信息的全面概览,并支持对当前维修任务的流程进行实时跟踪。
历史工况是为了进行故障模块预排查。
3.维修服务管理:面向维修服务部门,提供维修任务的实时状态和历史效率分析。系统展示当前待处理任务数量,例如待接单、待派单和待回访任务,并支持查看和操作每项任务,详尽覆盖维修流程的每个环节。
维修效率分析则是对维修中的关键效率指标进行统计分析,包括近一年来的订单量的变化情况、维修响应时间变化情况、故障类型分布、维修人员任务统计等,方便维修管理人员对维修服务和效率进行管理。
4.设备健康分析:通过分析设备的历史和当前运行数据,预测设备未来可能发生的故障,并提供故障的可能性和类型评估,帮助维修部门为用户制定维保策略,提前主动联系用户,提升服务效率。
5.三包服务管理:服务于三包部门,提供当前维保活动提醒、设备维保活动记录、设备维保到期预警等功能。
6.备品备件管理:通过建立与维修保养相关的备品备件档案,用户和相关部门人员可在移动端和系统端进行备件的查询、申请和审批操作,简化流程,提高维修保养效率。此外,利用数据分析预测备品备件需求,既能满足需求,又能有效降低库存成本。
引入 TDengine 后,这六大功能模块的使用效果显著提升,不仅在数据写入和查询性能上表现优异,高效的压缩效率也进一步优化了性能与成本的平衡,实现了最佳的系统效能。
分析思路环节
架构改造升级到 TDengine 后,效果非常明显,硬件资源减少到原来的 1/5,效率有了明显的提升。我们相信,随着存储规模的不断变大,这种改善和提升效果会越来越明显。此外,在运维管理、费用支出、开发测试等方面也有了很大的改善。
-
开发人员现在可以自己电脑上搭建一套环境,随便折腾,不用担心跑不起来,也不用担心影响别人;
-
性能测试的时候,用配置低一些的机器也没问题,照样能做出压测效果;
-
遇到技术难题,原来通过 Google、百度、StackOverflow 寻找答案,现在可以直接在官方渠道 https://github.com/taosdata/TDengine 提 issue,也可以在 TDengine 的技术社区进行提问,TDengine 的技术专家亲自答复,响应非常快;
-
TDengine 的体积小,上传起来非常快,有些私有化部署项目,不允许访问外网,只能手动上传,体积小的优势就非常明显;
-
安装部署简单,配合 Docker 容器,可以在几分钟内完成安装部署;
-
运营监控工作变简单了,只需要对 TDengine 的几个进程进行监控;
-
占用的磁盘空间明显变小了,减少到原来的 1/5;
-
使用的主机减少到原来的 1/5,相应的费用支出也减少了。
总结思考
此次升级改造总体较为顺利,但也遇到了一些挑战,特别是在数据建模过程中。但办法总比困难多,通过一些方法和技巧,我们成功将 TDengine 调整为 schema-free 数据库,满足了本项目的需求,最终顺利完成了系统的升级改造。
目前,TDengine 已全面支持所有物联网设备的数据上报,并为应用层提供了多种场景的支持。我们现在使用到的功能还比较简单,主要是插入、连续查询和降采样查询,但这已足够满足物联网平台的需求。像 UNION、GROUP BY、JOIN 和聚合查询等高级功能虽然暂未使用,但它们在大数据分析中非常有价值,未来可在相关项目中尝试使用,甚至有望替代 Hadoop 全家桶。
在使用过程中,我们也发现了一些可以改进的地方:
-
JDBC-JNI 依赖动态库,导致安装和部署较为繁琐。虽然通过 JDBC-RESTful 解决了这个问题,但多了一层 RESTful Connector,性能略有下降。理想的解决方案是开发一个基于纯 Java 的 JDBC 驱动,直接连接后端服务。
-
客户端以命令行形式为主,对开发者,尤其是初学者或习惯图形界面的用户并不友好。图形界面支持如语法高亮、语法检查等功能非常实用。目前已有社区开发者贡献了两个 GUI 工具,但如果能由官方提供支持,体验会更佳。
总而言之,在引入 TDengine 后,3H1 原有业务系统通过升级改造实现了显著提升,不仅大幅降低了研发和维护成本,还成功实现了横向扩展。TDengine 出色的查询性能令人惊喜,其卓越的压缩效率也显著节省了存储资源。未来,我们计划在更多应用场景中探索 TDengine 的潜力,并进一步深化与 TDengine 的合作。
TDengine 知识点
安装 TDengine
下载地址:https://docs.taosdata.com/get-started/package/
目前 TDengine 在 Windows 平台上只支持 Windows Server 2016/2019 和 Windows 10/11。这里我们先下载和安装 TDengine-server-3.0.1.7-Windows-x64.exe。安装之后的文件夹如下:
运行 TDengine
TDengine 安装完成后,我们可以在拥有管理员权限的 cmd 窗口执行 sc start taosd 或在 C:\TDengine 目录下,运行 taosd.exe 来启动 TDengine 服务进程。
执行 TDengine 命令行
为了方便检查 TDengine 的运行状态并执行各种即席(Ad Hoc)查询,TDengine 提供了命令行工具 TDengine CLI(简称 taos)。只需在终端输入 taos
,即可进入命令行界面开始操作。
新建数据库(脚本文件)
在 TDengine CLI 中,我们可以使用 source
命令运行脚本文件中的多条 SQL 命令,实现批量执行操作。
# taos> source <filename>;
taos> source test.txt;
test.txt 内容如下:
CREATE DATABASE demo2;
USE demo2;
CREATE TABLE t (ts TIMESTAMP, speed INT);
INSERT INTO t VALUES ('2019-07-15 00:00:00', 10);
INSERT INTO t VALUES ('2019-07-15 01:00:00', 20);
SELECT * FROM t;
taosBenchmark 命令(体验写入速度)
你可以通过 TDengine 自带的工具 taosBenchmark 快速测试其写入速度。启动 TDengine 服务后,在终端运行 taosBenchmark
(前身为 taosdemo)即可体验。
taosBenchmark --help
taosBenchmark
该命令会在数据库 test 下自动创建一个超级表 meters,其下包含 1 万张子表,表名为 d0 到 d9999。每张表包含 1 万条记录,每条记录包含 ts(时间戳)、current(电流)、voltage(电压)、phase(相位)四个字段,时间戳范围从 2017-07-14 10:40:00.000 到 2017-07-14 10:40:09.999。此外,每张表附带两个标签:groupId(取值 1 至 10)和 location(California.Campbell、California.Cupertino、California.LosAngeles、California.MountainView、California.PaloAlto、California.SanDiego、California.SanFrancisco、California.SanJose、California.SantaClara 或 California.Sunnyvale)。
表管理
# 创建表
use testdb;
create table t1 (ts TIMESTAMP,name1 BINARY(100)) ;
# 查看表结构
describe t1;
# 插入数据
insert into t1 values(‘2021-03-10 22:37:36.100’,‘test’);
# 查询表
select * from t1;
# 查看当前所有表
show tables;
TDengine 提供了丰富的应用程序开发接口,支持多种编程语言的连接器,帮助用户快速开发应用。官方连接器涵盖 C/C++、Java、Python、Go、Node.js、C# 和 Rust,可通过原生接口(taosc)或 REST 接口(部分语言暂不支持)连接 TDengine 集群。此外,社区开发者还贡献了多种非官方连接器,如 ADO.NET、Lua 和 PHP 连接器,进一步扩展了生态支持。
taospy 是 TDengine 的官方 Python 连接器,提供了丰富的 API,使 Python 应用能够轻松集成 TDengine。它封装了 TDengine 的原生接口和 REST 接口,分别对应 taospy 包中的 taos 模块 和 taosrest 模块。此外,taospy 提供了符合 Python 数据访问规范(PEP 249)的编程接口,使其与 SQLAlchemy 和 pandas 等第三方工具的集成更加便捷。
taos-ws-py 是另一款 Python 连接器,通过 WebSocket 方式连接 TDengine,可根据需求选择使用。
在连接方式上,使用客户端驱动的原生接口直接与服务端建立的连接称为“原生连接”;通过 taosAdapter 提供的 REST 或 WebSocket 接口与服务端建立的连接,分别称为“REST 连接”或“WebSocket 连接”。
TDengine 典型的操作流程
在第二和第三步中,taosc 启动时并不知道 mnode 的 End Point,会直接向配置的集群对外服务 End Point 发起请求。如果目标 dnode 未配置 mnode,它会在回复中提供 mnode 的 End Point 列表,随后 taosc 会重新向指定的 mnode 发送请求以获取元数据。
在第四和第五步中,如果没有缓存,taosc 无法确定虚拟节点组中的 master 节点,默认假设第一个 vnodeID 为 master 并发出请求。如果目标 vnode 并非 master,它将在回复中提供正确的 master 信息,taosc 随后向指定的 master 节点发起请求。一旦插入成功,taosc 会将 master 节点的信息缓存起来。
上述流程不仅适用于插入数据,也同样适用于查询和计算操作。这些复杂的处理均由 taosc 封装,应用无需感知或进行额外处理。
通过 taosc 的缓存机制,仅在首次操作某表时才需要访问 mnode,从而避免 mnode 成为系统瓶颈。但由于可能存在 schema 变更或 vgroup 调整(如负载均衡),taosc 会定期与 mnode 交互以自动更新缓存。
多表聚合查询
TDengine 为每个数据采集点单独建表,但在实际应用中,往往需要对多个采集点的数据进行聚合分析。为提升聚合操作的效率,TDengine 引入了 超级表(STable) 的概念。超级表代表一类特定类型的数据采集点,包含多个子表,这些子表的模式(schema)完全一致,同时具有各自的静态标签。标签可以有多个,并支持动态增删和修改。
通过设置标签过滤条件,用户可以对超级表下的全部或部分子表进行聚合或统计操作,大幅简化应用开发流程。具体流程如下图所示: