当前位置: 首页 > news >正文

保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?

在时序数据库(Time Series Database)场景下,乱序数据的定义为:“时间戳(timestamp)不按照递增顺序到达数据库的数据。”虽然它的定义很简单,但时序数据库需要有相应的处理逻辑来保证数据存储时的顺序性,这势必会增加数据库架构的复杂性,从而影响数据库的性能表现。

已知完全乱序的数据处理是业界的难题,因此 TDengine 需要重点解决的问题应该是——从实际的业务场景出发,如何对偶发乱序数据的进行高效处理(比如设备损坏断电,网络异常,数据补录等问题)。

TDengine 的数据流向是:硬盘(WAL)→ 内存(Vnode Buffer)→ 硬盘(Data File)。

在 WAL 中,我们记录的是数据到达数据库的顺序,但是数据入库后,是一定要保证时间戳的有序的。因此,乱序数据的处理发生在写入 WAL 后的两个阶段:

基于以上逻辑,我们对乱序数据分为两类:

一. 内存乱序数据:在同一张表的范畴内,指时间戳与内存数据的时间范围相交的数据。


二. 硬盘乱序数据:在同一张表的范畴内,指时间戳与硬盘数据的时间范围相交的数据。

对于类型一的乱序数据,TDengine 会在内存中通过为每张表建立一个跳表结构做好排序,从而解决问题。

场景: 创建某表后,我们写入了从 1970 年到 2023 年的一小批数据(由于数据量较少不足以触发落盘)。当我们再写入一条 1998 年时间戳的乱序数据时,会由跳表进行排序,排序后数据在内存中以“1970-1998-2023”的顺序有序存在。该排序操作的成本由写入操作承担,但由于内存中保留的只是极少数数据,因此影响极小。

当来到落盘阶段时(落盘的细节可参考:文章:与 TDengine 性能直接相关——3.0 的落盘机制优化及使用原则),这三条有序的数据,又都有可能成为乱序数据的存在——即类型二:

首先,我们交代一下硬盘上数据文件的设计背景:由于 TDengine 通过建库参数 duration(days)做数据分区,假设某库 duration 设置为 10 日,那么自打 1970 年 1 月 1 日 0 时起,每隔 10 天就会划分一个数据文件组。写入的数据时间戳归属于哪个时间范围,便会写入哪个数据文件组中——即每个数据文件组中都包含了固定时间范围内的数据。而这些数据以数据块的形式存在,每个数据块所包含的时间范围视落盘时实际情况而定。

落盘时,数据会各自找到自己所属的数据文件组,根据该数据文件组中已有的数据块的时间范围计算,来判断数据的乱序与否。由此,会衍生出各种不同的情况。我们选出属于 2023、1998、1970 年份的三条数据,分别举例三种情况:

  1. "2023-01-01 xxxxxxx" 这条数据落盘时,并没有和这个表的任何数据块的产生时间交集——也就是非乱序的正常数据
     
  2. “1998-01-01 xxxxxxxx”:这条数据落盘时虽然和该表的整体时间范围(1970--2023)产生交集,但是局部时间范围内没有和该表任何数据块产生交集。这种乱序通常发生于历史数据的数据补录。比如:被采集的设备断电很久后恢复使用。因此这条数据虽然看似乱序,但实际上和正常数据差别不大
     
  3. “1970-01-01 xxxxxxxx” ,这条数据在落盘时和该表数据块的时间范围产生了交集:早在 2.0 当中,如果落盘时的数据和已有数据块时间戳相交的时候,乱序数据会形成一个子块追加在数据文件中,查询时需要把子块的数据读到内存中再做排序,当子块比较多的时候就会影响查询性能——经过重新设计后,在 3.0 当中乱序数据和原有数据将会合并重写为新的数据块,以追加的方式写入数据文件中并且重写索引,而旧的数据块则被视为碎片文件。这样一来,处理数据的成本就被转嫁给了落盘操作,因此对后续的查询基本没有影响

综上,在乱序数据写入硬盘的时候,由于数据块和索引文件均是新生成的,因此它对于后续的查询是比较友好的。考虑到乱序数据一定是业务上的偶发场景,因此这样处理基本不会造成性能负担。即便是产生了少部分由于乱序带来的碎片数据、无效数据块也都可以由企业版功能 compact 清除或者重组。

从很多角度来说,TDengine 3.0 都已经达成了长足的优化。因此随着 2.0 时代逐步进入尾声,我们也希望大家可以尽早从 2.0 切换到 3.0 之上:如何把数据从 TDengine 2.x 迁移到 3.x ?。

相关文章:

保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?

在时序数据库(Time Series Database)场景下,乱序数据的定义为:“时间戳(timestamp)不按照递增顺序到达数据库的数据。”虽然它的定义很简单,但时序数据库需要有相应的处理逻辑来保证数据存储时的…...

状态机实现N位按键消抖

状态机实现N位按键消抖 1、原理 利用状态机实现按键的消抖,具体的原理可参考 (50条消息) 基于FPGA的按键消抖_fpga 按键消抖_辣子鸡味的橘子的博客-CSDN博客 状态机简介: 状态机分类可以主要分为两类:moore和mealy 根据三段式状态机最后…...

uniapp自定义消息语音

需求是后端推送的消息APP要响自定义语音,利用官方插件,总结下整体流程 uniapp后台配置 因为2.0只支持uniapp自己的后台发送消息,所以要自己的后台发送消息只能用1.0 插件地址和代码 插件地址: link let isIos (plus.os.name "iOS&qu…...

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…...

共筑开源新长城 龙蜥社区走进开放原子校源行-清华大学站

6 月 28 日,以“聚缘于校,开源共行”为主题的 2023 年开放原子校源行活动在清华大学成功举行。本次活动由开放原子开源基金会和清华大学共同主办,来自各行业的 22 位大咖共聚校园共话开源。龙蜥社区技术专家边子政受邀进行技术分享&#xff0…...

Jgit 工具类 (代码检出、删除分支(本地、远程)、新建分支、切换分支、代码提交)

https://blog.csdn.net/qq_37203082/article/details/120327084 Jgit 工具类 (代码检出、删除分支&#xff08;本地、远程&#xff09;、新建分支、切换分支、代码提交)_jgit删除远程分支_CJ点的博客-CSDN博客 <!--JAVA操作GIT--><dependency><groupId>org.…...

什么是redux?如何在react 项目中使用redux?

redux 概念 redux是一种用于管理JavaScript应用程序的状态管理库。它可以与React、Augular、Vue等前端框架结合使用&#xff0c;但也可以纯在JavaScript应用程序中独立使用。redux遵循单项数据流的原则&#xff0c;通过一个全局的状态树来管理应用程序的状态&#xff0c;从而使…...

mysql的json处理

写在前面 需要注意&#xff0c;5.7以上版本才支持&#xff0c;但如果是生产环境需要使用的话&#xff0c;尽量使用8.0版本&#xff0c;因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL的json处理。在正式开始让我们先…...

前端学习——Vue (Day8)

Vue3 create-vue搭建Vue3项目 注意要使用nodejs16.0版本以上&#xff0c;windows升级node可以西安使用where node查看本地node位置&#xff0c;然后到官网下载msi文件&#xff0c;在本地路径下安装即可 安装完可以使用node -v检查版本信息 项目目录和关键文件 组合式API - s…...

Windows环境下安装及部署Nginx

一、安装Nginx教程 1、官网下载地址&#xff1a;https://nginx.org/en/download.html 2、下载教程&#xff1a;选择Stable version版本下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;双击nginx.exe&#xff0c;若双击…...

使用AOP切面对返回的数据进行脱敏的问题

1.注解类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** Author: xiaoxin* Date: 2023/7/21 17:15*/ Retention(RetentionPolicy.RUNTIME) Targe…...

TDengine时区设置

一般来说&#xff0c;时序数据就是带有时间序列属性的数据。在处理时序数据时&#xff0c;TDengine有着自己独特的方式。但是如果没有正确理解TDengine在写入和查询上的行为&#xff0c;极可能会因为配置了错误的时区&#xff08;timezone&#xff09;&#xff0c;而导致写入和…...

站外引流效果差?一文带你搞懂解海外主流社交媒体算法!

在流量成本越来越高的当下&#xff0c;无论是平台卖家还是独立站卖家都在努力拓展流量渠道。站外引流是推动业务增长的关键策略&#xff0c;很多卖家会把重点放在内容营销上&#xff0c;但其实除了做好内容之前&#xff0c;了解社交媒体的算法才能让营销效果最大化。 01.Faceb…...

css 动画之旋转视差

序&#xff1a;网上看到的一个例子&#xff0c;做一下 效果图&#xff1a; 代码&#xff1a; <style>.content{width: 300px;height: 300px;margin: 139px auto;display: grid;grid-template-columns: repeat(3,1fr);grid-template-rows: repeat(3,1fr);grid-template:…...

maven项目、springboot项目复制文件进来后没反应、不编译解决方法

问题如下 把文件复制进springboot项目后&#xff0c;没反应&#xff0c;不编译。 解决 在maven工具框中选择compile工具&#xff0c;运行即可。...

android jetpack App Startup 应用启动时初始化组件(java)

有什么用&#xff1f; 应用启动时初始化组件。 怎么用 添加依赖 dependencies {implementation "androidx.startup:startup-runtime:1.1.1" }创建类&#xff0c;继承Initializer。 public class AppInit implements Initializer<String> {NonNullOverride…...

【设计模式|行为型】命令模式(Command Pattern)

说明 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象&#xff0c;这些对象之间彼此独立&#xff…...

SqlServer 批量删除表

SqlServer 批量删除表 直接上SQL脚本吧 SELECT row_number()over(order by Name) as FID,Name into #temp FROM SysObjects Where XTypeU --类型&#xff0c;U为实体表 and name like TMP% --表名过滤&#xff08;自定义就好&#xff09; ORDER BY Namedeclare count int 0…...

[Linux]线程基本知识

概念 进程 一个正在执行的程序&#xff0c;它是资源分配的最小单位 进程中的事情需要按照一定的顺序逐个进行 进程出现了很多弊端: 一是由于进程是资源拥有者&#xff0c;创建、撤消与切换存在较大的时空开销&#xff0c;因此需要引入轻型进程&#xff1b; 二是由于对称多…...

STM32 串口基础知识学习

串行/并行通信 串行通信&#xff1a;数据逐位按顺序依次传输。 并行通信&#xff1a;数据各位通过多条线同时传输。 对比 传输速率&#xff1a;串行通信较低&#xff0c;并行通信较高。抗干扰能力&#xff1a;串行通信较强&#xff0c;并行通信较弱。通信距离&#xff1a;串…...

Origin绘图进阶:如何在现有图形上叠加散点图与等高线(附MATLAB对比)

Origin数据可视化进阶&#xff1a;多层图表叠加与等高线绘制实战 科研图表的美观性与信息密度往往决定了研究成果的呈现效果。作为一款专业的数据分析与可视化工具&#xff0c;Origin在复杂图表叠加方面展现出独特优势&#xff0c;尤其适合需要同时展示散点分布与等高线趋势的科…...

Chrome密码一键提取:3分钟找回所有浏览器保存的密码

Chrome密码一键提取&#xff1a;3分钟找回所有浏览器保存的密码 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经因为忘记某个重要网站的登录密码而感到焦虑&#xff…...

Git Diff View:三分钟学会实用的代码差异对比组件

Git Diff View&#xff1a;三分钟学会实用的代码差异对比组件 【免费下载链接】git-diff-view A Diff View component for React / Vue, just like Github 项目地址: https://gitcode.com/gh_mirrors/gi/git-diff-view 你是否曾经在代码审查中为理解复杂的Git差异而头疼…...

8人SolidWorks研发共享一台服务器——性能算力共享智能按需分配

8人SolidWorks研发团队可借助云飞云智能共享云桌面&#xff0c;通过以下方式实现一台服务器的性能算力共享与智能按需分配。一、核心硬件配置CPU&#xff1a;选择多核高主频处理器&#xff0c;如Intel Core i9 14900K&#xff08;24核32线程&#xff09;或AMD锐龙9 9950X&#…...

影刀RPA实战:用Python字符串处理提升自动化效率(附5个常用脚本)

影刀RPA实战&#xff1a;5个Python字符串处理脚本解决自动化难题 在影刀RPA的自动化流程中&#xff0c;字符串处理就像流水线上的精密工具&#xff0c;直接决定了数据处理的准确性和效率。当我们需要从混乱的日志中提取关键信息、清洗客户提交的表格数据或转换不同系统的文本格…...

革新性英雄联盟智能辅助解决方案:一站式游戏体验提升工具

革新性英雄联盟智能辅助解决方案&#xff1a;一站式游戏体验提升工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英…...

告别重复劳动:用快马ai生成高效openclaw脚本提升安卓测试效率

告别重复劳动&#xff1a;用快马AI生成高效OpenClaw脚本提升安卓测试效率 在安卓自动化测试中&#xff0c;编写重复性的设备操作脚本往往是最耗时耗力的环节。每次测试新版本&#xff0c;我们都需要重复编写类似的点击、滑动、输入等操作代码&#xff0c;不仅效率低下&#xf…...

Z-Image-Turbo_Sugar脸部Lora赋能网络安全:生成模拟人脸进行隐私保护测试

Z-Image-Turbo_Sugar脸部Lora赋能网络安全&#xff1a;生成模拟人脸进行隐私保护测试 1. 引言&#xff1a;当网络安全遇上AI造脸 你有没有想过&#xff0c;那些用来保护我们手机、门禁的人脸识别系统&#xff0c;到底安不安全&#xff1f;安全研究员们每天都在琢磨这个问题。…...

好写作AI:利用多轮人机交互迭代实现深度降AIGC的方法论

改一遍不够&#xff1f;那就改三遍——但每遍都要改对地方很多同学用AI辅助写论文&#xff0c;流程是这样的&#xff1a;用AI生成一段文字 → 觉得“AI味儿”有点重 → 手动改几个词 → 提交。然后被检测系统打回来。于是困惑&#xff1a;我都改了&#xff0c;怎么还是不行&…...

AI驱动3D骨骼绑定:从3天到3分钟的自动化革命

AI驱动3D骨骼绑定&#xff1a;从3天到3分钟的自动化革命 【免费下载链接】UniRig One Model to Rig Them All: Diverse Skeleton Rigging with UniRig 项目地址: https://gitcode.com/gh_mirrors/un/UniRig 3D骨骼绑定是动画制作流程中的关键环节&#xff0c;传统手工绑…...