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

关于数据库:何时删怎么删5分钟吃透TDengine过期数据自动清除机制

在之前的一期内容里,咱们讲到了如何利用正当的配置vnode实现TDengine的数据分片(这几个神秘参数,教你TDengine集群的正确应用形式),本期咱们来持续讲讲TDengine如何从工夫维度去对数据进行分区治理。

在之前的一期内容里,咱们讲到了如何利用正当的配置vnode实现TDengine的数据分片(这几个神秘参数,教你TDengine集群的正确应用形式),本期咱们来持续讲讲TDengine如何从工夫维度去对数据进行分区治理。

首先,先看看官网的相干形容:

“TDengine除vnode分片之外,还对时序数据依照时间段进行分区。每个数据文件只蕴含一个时间段的时序数据,时间段的长度由DB的配置参数days决定。这种按时间段分区的办法还便于高效实现数据的保留策略,只有数据文件超过规定的天数(系统配置参数keep),将被主动删除。而且不同的时间段能够寄存于不同的门路和存储介质,以便于大数据的冷热治理,实现多级存储。

总的来说,TDengine是通过vnode以及工夫两个维度,对大数据进行切分,便于并行高效的治理,实现程度扩大。”

能够看出,在这个过程中keep参数在施展着非常重要的作用。然而同样,keep参数也算是比拟典型的,容易令使用者蛊惑的参数了。

官网文档对于keep的形容是这样的:“数据库中数据保留的天数,单位为天,默认值:3650”,和他一起搭配应用的还有一个days参数:“一个数据文件存储数据的时间跨度,单位为天,默认值:10”。

从使用者的角度,对于这句话的了解就是数据保留keep的天数后就不应该能够查问到数据了。然而,在实际操作的时候,常常能够看到曾经超出工夫范畴的数据仍然呈现在了查问后果当中。

why?

首先,咱们来简略理解一下TDengine的存储逻辑:数据写入数据库后,会先保留在内存中的缓冲区(buffer pool)当中,当达到阈值后(缓冲区1/3,或者敞开数据库服务)内存中数据就会落盘到该表所属的vnode的目录上面(默认/var/lib/taos/vnode/vnodeX/tsdb/data)。其中vnodeX中的X能够通过show vgroups命令看到。

示范如下:

测试的时候,只有随便插入一条数据,而后做一下服务重启:systemctl restart taosd,刚刚写入内存的数据当初就会落到硬盘上。

注:重启服务是一个很实用的测试操作,能够触发内存中的数据落盘——目前,只有数据落盘时才会触发主动删除机制(后续在初始化时也会减少主动删除触发)。如果该数据库前面不再有数据落盘,那么数据文件即便过期了也是不会被删除的。

当初,你就能够找到你的数据文件了,下图能够看到,在重启之前这个目录下还没有任何文件。但在重启之后,就看到了三个以1880为编号的一组文件。

从狭义上来说,这三个文件都属于数据文件,前面提到的数据文件都是指他们三个造成的文件组。

接下来,咱们回到理论的场景中。

想测试数据存储策略的同学对上面这个场景肯定不生疏:建库的时候,咱们指定keep为10,days为10。如果数据文件是1月1日生成,然而到了1月19日的时候,1月1日插入的数据却还是能够被查问到。于是,你从taos shell里退出来一看——果然,1月1日生成的数据文件竟然还没有被删除。

奇怪——难道是keep参数没有失效?

想搞懂这个问题的答案,咱们还须要晓得的是days参数的设计:咱们所说的days定义——“数据文件保留的数据时间跨度”,它是以零碎工夫断定的,逻辑是:数据文件第一次生成的日期为起始日期,与零碎工夫做计算(注:该计算只以天然日为切分,不以24小时计算)。一旦文件生成超过days天数,在下次数据落盘的时候就会生成新的数据文件。

事实上,当你发现旧数据仍然能够查问的时候,99.9%的状况都不是keep不失效。最基本的起因其实是TDengine要等到数据文件外面的所有数据过期后才会删除它们。还是下面的场景(keep 10 days 10):1月1日产生的数据文件中是可能存在1月10日的数据的,所以在1月19日的时候,这部分数据还没有到10天,所以在设计上是不容许删除的。因而,就拖带着1-9日间的数据也没有被删除掉。

以上,就是文章题目的答案。

能够看出,因为数据文件是以days为单位存储在一起的,所以days越小,主动删除就会越精准。那为什么咱们不罗唆把days设置小一点呢?其实这样是没问题的。然而在性能上,days越小意味着意味着数据文件的数目越多,从而导致太多文件频繁开关读取减少开销。所以,默认值取days为10就是一个折中的抉择。

当初,咱们来到了新的问题:

1.TDengine是在什么状况下才会删除过期文件呢?

2.咱们要通过什么形式来疾速判断主动删除机制是否在失常工作呢?

咱们能够把这两个问题交融在一个场景下进行答复:

问题一:答案只有接着上文的场景持续推动就能够失去(keep 10 days 10):工夫来到1月21日时,第3批数据文件生成,此时第1批数据文件的最初1天的数据终于也超过了keep值。这个时候,keep才会正式失效并把第一组数据文件从存储中删除。当初回到TDengine外面,你就查不到这部分数据了。

问题二:答案是只有数一数vnode上面的数据文件组数就能够了:比方在下面的状况下(keep 10 days 10),vnode目录上面的数据文件数最多也就只有两组:1-10日 11-20日(工夫范畴),当存储21-30日的数据文件生成时,1-10日的数据文件曾经被删掉了,所以最多只能保留两个,计算形式为keep/days+1。在这种状况下,只有vnode下的数据文件数小于等于keep/days+1,就能够认为主动删除机制在失常工作。

然而在keep不能被days整除的状况下,还会呈现上面的状况:

咱们假如keep=3 days=2。在这个配置下,第一批数据文件中存储的工夫是1-2日,第二个数据文件为3-4日。能够看到,当第一个文件中的第2日数据要在第5(2+3)日完结后才会过期,所以到6日开始时,12日的数据文件才会被删掉。这样一来,在5日和6日之间的时间段内,就会呈现12日,34日,5日三个文件共存的景象。

以上就是官网文档上所说的:“给定days与keep两个参数,一个典型工作状态的vnode中总的数据文件数为:向上取整(keep/days)+1个”的真正意思。

所以,只有你的vnode目录下的文件数目合乎下面的两种场景的后果,那么就没必要放心主动删除机制没有失常工作。

看到这里的读者,当初你理解了TDengine的主动删除机制了吗?如果还没有,那肯定是我的尽职了。


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
author-avatar
永不放弃2702935973
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有