热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

15倍提升40倍存储优化,TDengine在领益智造的实践

作者:张红朋小T导读:广东领益智造股份有限公司是全球领先的智能制造平台企业,致力于以技术先进、质量可靠为核心竞争力,为客户提

作者:张红朋


小T导读:广东领益智造股份有限公司是全球领先的智能制造平台企业,致力于以技术先进、质量可靠为核心竞争力,为客户提供“一站式”精密智造解决方案,实现精密、美观、高品质、低成本于一体的终端产品。业务涵盖消费电子、医疗器械、汽车零部件等多个行业,凭借先进的研发与制造能力,领益智造与世界知名企业建立了稳固的战略合作关系,综合实力位居全球同行业前三强。


https://github.com/taosdata/TDengine

在对生产设备的AOI全检数据进行质量分析时,我们对关系型数据库做了很多预处理运算,但是在计算正态分布、盒须图、尺寸分析及原始数据查询上遇到了致命的性能问题。此前我们选择的数据库服务器已达到较高的硬件配置(1.5T的内存、96逻辑核的CPU、全闪盘的专业存储),再想要通过提高服务器配置来实现响应速度的提升是非常困难的。即使数据库对查询做了相应的索引,选择一周的数据进行查询时,系统的响应时间仍然在20秒以上。

为了解决当下的问题,我们找了很多方案进行测试。首先使用Hadoop生成10亿的数据量进行查询的模拟测试,发现实时查询时的查询效率还没有关系型数据库好,因此排除了Hadoop替代方案。接着对杉岩的对像存储方案进行测试,因其对象存储的缘故,采用此方案的话才购买不久的服务器资源就无法使用了,同时还需要再投入软硬件费用,成本较高。

正当我们准备验证ClickHouse方案时,却在查询资料时无意中发现了TDengine,查看官方的性能报告后,我们决定对其进行测试。我们下载了2020年的TDengine社区版进行测试,发现在写入、查询时的效率很惊艳,随即开始展开其与业务匹配度的评估,确认了在计算正态分布、盒须图、尺寸分析时的匹配度均很高,而这些问题恰好又是我们现在所急需解决的。

最终我们决定使用关系型数据库和时序数据库同时保存两份数据,以此来满足不同的业务场景。


一、经验分享

结合数据特点和使用场景,我们开始构建超级表,以其中一张表为例,数据模型创建如下:

create table t_qualityproductdetail (ftime TIMESTAMP,fqualityproductid BINARY(32),fpromachineid BIGINT,fjobnumber BINARY(50),fsn BINARY(250),value FLOAT,standard FLOAT,max FLOAT,min FLOAT,createon TIMESTAMP,fisok INT) TAGS (fproductid BIGINT,fprocessesid BIGINT,faiid BIGINT,fmachineid BIGINT,fresult INT,fcount INT)

在引入TDengine时首先面临的就是时间戳的问题。因为我们每一个产品在同一个时间点会有多个数据产生,且这些数据是在同一台机器上产生的,按照官方文档,在一个超级表中一台机器一个子表的方式会造成“只能存储最后一条数据”的问题,经分析后最终我们决定把表拆到每个检测点的粒度,以此方式解决了此问题。

但由此也带来了一个新的问题,那就是表数量超限。在2.2以前的版本上,官方建议超级表的数量不应超过4万个,而我们的产品、生产机台号、检测机台号外加检测点的集合,按计算会远大于4万个,我们也很担心在上线后会对性能造成较大影响,但所幸新的2.2版本没有这一限制了。

通过与官方的沟通,我们在使用过程中接触到了更多TDengine的特性,将其应用到业务中支持更多的时序数据场景,目前TDengine已经被应用在中间表预处理、良率计算、通过序列号查询产品实例的测点明细等业务中,其中在良率计算上还用到了一些小技巧,在此给大家做一下经验分享。

在良率计算逻辑调整上,关系型数据库中是通过子查询的关联来进行每台机器的良率计算,判断良品是通过一个Fresult进行判断,结果为1(良品)、2(不良品)、3(重测),计算时采用以下方式:

select FProcessesID,FConmpyID,FMachineID,FProductID,FProMachineID,cast(FTime as date) FTime,FCount,count(0) FTotalCount,sum(case FRESULT when 1 then 1 else 0 end) FOKCount from [T_QualityProduct] t0 WITH (nolock) where FTime >=@currdate and FTime <@currenddate group by FProcessesID,FConmpyID,FMachineID,FProductID,FProMachineID,cast(FTime as date),FCount

而TDengine不支持case when的运算,在处理时需要计算两次,先是通过以下方式来计算总数:

select FProMachineID,FCount,count(*) FTotalCount from [T_QualityProduct] where FTime >=@currdate and FTime <@currenddate group by FProcessesID,FConmpyID,FMachineID,FProductID,FProMachineID,FCount interval(1d)

然后再通过以下方式计算良品数量:

select FProMachineID,FCount,count(*) FOKCount from [T_QualityProduct] where FTime >=@currdate and FTime <@currenddate and FRESULT =1 group by FProcessesID,FConmpyID,FMachineID,FProductID,FProMachineID,FCount interval(1d)

算出结果后通过程序代码把上述多条件分组汇总的数据合并到一起。

以上这种计算方式有两个缺点,一是需要查询两次,效率不高;二是程序代码中需要做多条件的匹配汇总,代码改造工作量较大,效率低。经反复沟通后,最终我们决定增加一个fisok的Int类型的字段,良品用1,其余用0来展示,经此改造后,代码和执行效率有了质的提升。可以直接使用以下的代码来实现查询:

select FCount, count(*) FTotalCount,sum(fisok) FOKCount,sum(fisok)/count(*) yeild from [T_QualityProduct] where FTime >=@currdate and FTime <@currenddate group by FProcessesID,FConmpyID,FMachineID,FProductID,FProMachineID,FCount interval(1d)

最终我们使用此方式成功计算出了良率,且性能远高于关系型数据库,程序代码也不用改动。



二、效果展示

在TDengine成功上线接入后,我们将每日良率、线别机台良率、尺寸良率分析、正态分布、361分析、盒须图、原始数据查看等业务都移到了TDengine中,而TDengine在实际业务中也展现出了如测试时所表现的高效性能。


1、存储容量对比

1)某关系型数据库的数据空间和索引空间大小,QualityProductDetail和QualityProduct两张表分别求和。

2)TDengine通过在CentOS执行du -sh /var/lib/taos查看文件夹大小。


2、查询效率对比


  • 通过正态分布语句进行查询对比

1)5天查询条件:FTime between &#39;2021-06-21 00:00:00.000000&#39; and &#39;2021-06-25 23:59:59.999999&#39; and FAIID=1693 and FProcessesID=1 and value<999 and FCount=1

2)3月查询条件:FTime between &#39;2021-06-01 20:00:00.000000&#39; and &#39;2021-09-01 19:59:59.999999&#39; and FAIID=1693 and FProcessesID=1 and value<999 and FCount=1


  • 查询效率对比详细测试数据

1)5天数据

某关系型数据库——查询结果量414,995条,平均耗时328.13秒

TDengine——查询结果量413,180条,平均耗时4.61秒

2)3个月数据

某关系型数据库——查询结果量1,949,501条,平均耗时340.29秒

TDengine——查询结果量1,848,385条,平均耗时20.80秒

通过以上的对比测试,我们发现在同等条件下,查询最近5天的数据,某关系型数据库平均耗时328.13秒,而用TDengine则平均耗时4.61秒,用时为原来的70分之一,查询效率提升了70倍,把数据拉长到3个月,效率也有15倍的提升。在我们正常的业务场景下,80%的情况会查询最近7天的数据,70倍的查询效率提升也如实映射为正常业务环境下的表现。

我们使用原来的关系型数据库时,会建立大量的索引来提升查询速度,但发现进行原始数据查询计算时效率还是太低,响应时间以十秒为单位,故而采用了预处理的方案,把每日的良率提前按产品、机台进行混部,这样在查询时就可以有较快的查询速度,但同时也牺牲了空间和实时性。通过以上对比可以看出,在建好索引和中间表的情况下,同样的数据量级,某关系型数据库的空间使用是TDengine的40倍。



三、写在最后

伴随物联网技术终端和应用的跨越式发展,其背后巨大的市场空间和经济效益日益显现,作为一个大的技术趋势被科技企业广泛关注。在此背景下,TDengine作为一款专为物联网大数据场景而生的时序数据库,它所展现出的高效性能和成本管控能力都非常惊艳,成为科技企业抓住物联网机遇的一个有力抓手。

目前我们已着手把稼动率的项目迁移到TDengine上,同时集团在2021年底把物联部门提升为一级部门,后续将会有更多的设备联机数据需要存储和分析。



✨想了解更多TDengine的具体细节,欢迎大家在GitHub上查看相关源代码。✨


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • oracle avg row len,Oracle 估算数据库大小的方法
    一.说明一网友问我将一个查询的结果集存放到临时表里,如果估算临时表的大小,当时想的方法是通过统计block来计算。后来想,此方法的操作性也 ... [详细]
author-avatar
翔念式的天空_549
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有