智能存储解决方案:探索 TDengine 的多级存储功能
在当今数据驱动的时代,如何高效地存储和管理海量数据已成为企业面临的一大挑战。为了应对这一需求,TDengine Enterprise 不仅支持使用对象存储(S3),还早已引入了独特的多级存储功能。这一功能不仅能够降低存储成本,还能显著提升数据写入性能,并简化系统维护流程。
多级存储的设计理念是将数据根据热度进行分级管理。热度较高的数据被存储在高速介质上,以便快速访问和处理;而时间久远、热度较低的数据则存放在低成本的存储介质上,从而实现经济性的最大化。这种策略的实施,不仅为企业节省了存储费用,更使得数据的写入和查询变得更加高效。
在江河信息水利物联感知服务平台的升级中,TDengine 多级存储功能就发挥了重要作用。借助这一功能,江河信息将原有的 10 多台 NVME 存储服务器精简为仅 3 台高效云盘与机械硬盘的服务器,这一转变不仅大幅节省了硬件成本开销,更有效降低了运维的工作量,提升了整体资源的利用效率。
本文将深入探讨 TDengine 的多级存储功能,介绍其配置方式、负载均衡策略以及如何实现高效的数据管理。通过对这一功能的全面解析,我们希望帮助更多用户充分利用 TDengine 的优势,优化数据存储策略,提升整体系统性能。
TDengine 多级存储好在哪?
降低存储成本是 TDengine 多级存储功能的一个显著优势。通过将数据按照热度进行分级存储,企业能够有效地将大量极冷数据存放在更为廉价的存储介质上。这一策略的实施,不仅显著减少了存储费用,还为企业提供了更高的经济效益。随着数据量的不断增加,传统的存储方式往往导致成本急剧上升,给企业的运营带来了压力。而多级存储的设计理念则在根本上解决了这一问题,让企业在实现数据存储的同时,可以灵活应对未来的各种挑战。
与此同时,提升写入性能也是 TDengine多级存储功能的一大亮点。每级存储支持多个挂载点,这意味着在进行数据写入时,可以实现更高的并发处理能力。得益于这一设计,WAL(预写日志)可以支持 0 级的多挂载点并行写入,从而极大地提升了写入性能。
在实际应用场景中,我们测得 TDengine 能够支持持续写入每秒超过 3 亿个测点,这对于数据密集型应用尤为重要,确保了系统能够高效处理实时数据。此外,TDengine 在机械硬盘上的表现也相当出色,磁盘 IO 吞吐量实测可达 2GB/s,这不仅为大规模数据的实时处理奠定了坚实的基础,也使得企业在面对海量数据时能够游刃有余。
除了成本和性能的提升,方便维护也是多级存储功能的一大优势。一旦各级存储的挂载点配置完成,后续的系统数据迁移等工作便无需人工干预。这种自动化的管理方式大大降低了运维人员的工作负担,提升了系统的可靠性。而且,存储扩容变得更加灵活和方便,企业可以根据实际需求随时调整存储策略,灵活应对业务变化。
最后,TDengine 的多级存储功能在 SQL 查询方面也展现出其透明性。无论用户查询的数据是否跨越不同的存储级别,一条 SQL 语句都可以轻松返回所有相关数据。这种设计不仅简化了用户的操作流程,还提高了查询的效率。用户无需关注数据存储的具体位置,只需专注于数据的分析和应用,真正实现了简单高效的数据管理。这种用户友好的设计理念,使得 TDengine 不仅适合技术专家,也能满足各种层次用户的需求。
多级存储的负载均衡与挂载点选择策略
在多级存储中,负载均衡是提升写入性能的关键因素。每个 dnode 仅有一个主挂载点,这一主挂载点负责存储系统中最重要的元数据,并且各个 vnode 的主目录也均位于该主挂载点上。这种设计虽然保证了数据的集中管理,但同时也限制了该 dnode 的写入性能,因为其 IO 吞吐能力受限于单个磁盘。
从 TDengine 3.1.0.0 版本开始,系统引入了对多个 0 级挂载点的支持。当一个 dnode 配置了多个 0 级挂载点时,所有 vnode 的主目录将被均衡分布到这些挂载点上,由此实现了写入负荷的共享。这一优化策略不仅提高了整体系统的写入能力,还使得系统在网络 I/O 和其他处理资源不成为瓶颈的情况下,能够实现线性增长的写入性能。测试结果表明,随着 0 级挂载点数量的增加,整个系统的写入能力也成倍提升,极大地增强了数据处理的效率。
除了负载均衡,多级存储还对同级挂载点的选择策略进行了优化。通常情况下,TDengine 会采用 round robin 策略从同级挂载点中选择一个用于生成新的数据文件。然而,在实际环境中,各磁盘的容量可能存在差异,或者虽然容量相同,但写入的数据量却不同,这会导致每个磁盘的可用空间不均衡,在实际进行选择时有可能会选择到一个剩余空间已经很小的磁盘。
为了解决这一问题,从 TDengine 3.1.1.0 版本开始,我们引入了新的配置项 minDiskFreeSize。当某个磁盘的可用空间小于等于该阈值时,该磁盘将不再被选中用于生成新的数据文件。该配置项的单位为字节,并建议其值大于 2GB(即会跳过可用空间小于 2GB 的挂载点)。这样的设计确保了在进行数据写入时,能够有效避免选择到已接近满载的磁盘,从而提升了存储的整体效率。
进一步地,从 3.3.2.0 版本开始,TDengine 引入了新的配置项 disable_create_new_file,用于控制某个挂载点上是否可以生成新文件。其缺省值为 false,即默认情况下,每个挂载点都可以生成新文件。这一策略为运维人员提供了更大的灵活性,使他们能够根据实际需求对挂载点进行管理,从而优化系统的存储性能。
通过这些负载均衡和挂载点选择策略的优化,TDengine 多级负载功能得到了显著提升,不仅提高了数据写入的效率,还确保了存储资源的合理利用,为用户在海量数据处理时提供了强有力的支持。
配置方式
TDengine 的多级存储功能支持最多 3 级,每级可配置多达 128 个挂载点。典型的配置方案包括:
-
0 级:配置多个挂载点,每个挂载点对应一块 SAS 硬盘;
-
1 级:配置多个挂载点,每个挂载点可以对应单块或多块 SATA 硬盘;
-
2 级:可配置为 S3 存储或其他廉价的网络存储。
在 TDengine 中,多级存储的配置方式如下(在配置文件 /etc/taos/taos.cfg 中):
dataDir [path] <level> <primary>
其中,各参数的含义如下:
-
path:挂载点的文件夹路径。
-
level:介质存储等级,取值为 0、1 或 2。
-
0 级用于存储最新的数据;
-
1 级用于存储次新的数据;
-
2 级用于存储最旧的数据。
-
-
如果省略该参数,默认为 0。各级存储之间的数据流向为:0 级存储 → 1 级存储 → 2 级存储。需要注意的是,同一存储等级可以挂载多个硬盘,而同一存储等级上的数据文件将分布在该存储等级的所有硬盘上。数据在不同级别存储介质之间的移动是由系统自动完成的,用户无需干预。
-
primary:标识是否为主挂载点,取值为 0(否)或 1(是)。如果省略该参数,默认为 1。在配置中,只允许存在一个主挂载点(即
level=0,primary=1)。以下是一个示例配置方式:
dataDir /mnt/data1 0 1
dataDir /mnt/data2 0 0
dataDir /mnt/data3 1 0
dataDir /mnt/data4 1 0
dataDir /mnt/data5 2 0
dataDir /mnt/data6 2 0
需要注意的是:
-
多级存储不允许跨级配置。合法的配置方案包括:仅 0 级;仅 0 级 + 1 级;以及 0 级 + 1 级 + 2 级。禁止只配置
level=0和level=2,而不配置level=1。 -
禁止手动移除使用中的挂载盘,并且挂载盘目前不支持非本地的网络盘。
结语
综上所述,TDengine 的多级存储功能为企业提供了一种灵活、高效的数据管理解决方案。通过合理配置不同级别的存储介质,企业能够在降低存储成本的同时,提升数据写入性能和维护效率。此外,TDengine 还支持对象存储 S3,使得企业可以利用云存储的高可扩展性和低成本优势,进一步优化其数据存储策略。结合这两大特性,TDengine 不仅强化了其作为企业级数据库的竞争力,也为用户在应对海量数据挑战时提供了强有力的支持,帮助他们实现数字化转型的目标。
相关文章:
智能存储解决方案:探索 TDengine 的多级存储功能
在当今数据驱动的时代,如何高效地存储和管理海量数据已成为企业面临的一大挑战。为了应对这一需求,TDengine Enterprise 不仅支持使用对象存储(S3),还早已引入了独特的多级存储功能。这一功能不仅能够降低存储成本&…...
Vue 3 中Pinia状态管理库的使用方法总结
Pinia 是 Vue 3 的状态管理库,旨在替代 Vuex,提供更简洁和更灵活的 API。以下是如何在 Vue 3 项目中使用 Pinia 的详细步骤。 1. 安装 Pinia 首先,你需要在你的 Vue 3 项目中安装 Pinia。你可以使用 npm 或 yarn 进行安装: npm…...
劫持微信聊天记录并分析还原 —— 访问数据库并查看聊天记录(五)
本工具设计的初衷是用来获取微信账号的相关信息并解析PC版微信的数据库。程序以 Python 语言开发,可读取、解密、还原微信数据库并帮助用户查看聊天记录,还可以将其聊天记录导出为csv、html等格式用于AI训练,自动回复或备份等等作用。下面我们…...
vue3+vite 前端打包不缓存配置
最近遇到前端部署后浏览器得清缓存才能出现最新页面效果得问题 所以…按以下方式配置完打包就没啥问题了,原理很简单就是加个时间戳 /* eslint-disable no-undef */ import {defineConfig, loadEnv} from vite import path from path import createVitePlugins from…...
Dinky控制台:利用SSE技术实现实时日志监控与操作
1、前置知识 1.1 Dinky介绍 实时即未来,Dinky 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 Dinky 是一个开箱即用、易扩展,以 Apache Flink 为基础,连接 OLAP 和数据湖等众多框架的一站式实时计算平台,致力于流批一体和湖仓一体的探索与实践。 致力于简化Flink任务开…...
cannot locate symbol _ZTVNSt6__ndk119basic_ostringstreamIcNS_
编译正常,运行报错:cannot locate symbol _ZTVNSt6__ndk119basic_ostringstreamIcNS_ 简单记录: 1、编译ffmpeg so库,编译正常; 2、AndroidStudio建立项目,引用so库,编译正常,运行…...
SwiftUI开发教程系列 - 第4章:数据与状态管理
在 SwiftUI 中,数据与视图的绑定可以自动响应数据变化,实时更新 UI。SwiftUI 提供了多种数据管理方式,包括 @State、@Binding、@ObservedObject 和 @EnvironmentObject 等属性包装器。本章将逐一介绍这些属性包装器的用途及其最佳实践。 4.1 使用 @State 进行本地状态管理 …...
API接口:助力汽车管理与安全应用
随着汽车行业的飞速发展,越来越多的汽车管理技术被应用到交通安全和智慧交通系统中。在这一过程中,API接口起到了至关重要的作用。通过API接口,我们可以实现诸如车主身份验核、车辆信息查询等功能,从而为汽车智慧交通发展与安全应…...
聊一聊在字节跳动做项目质量改进的经验
引言 那一年,我刚毕业一年多,在第一家公司依然到了成长瓶颈期,一是不愿意频繁出差(做乙方的无奈);二是疲于每天重复的手工测试(团队缺乏技术氛围),技术上难有突破的机会…...
CSS基础概念:什么是 CSS ? CSS 的组成
什么是 CSS? CSS(层叠样式表,Cascading Style Sheets)是一种用于控制网页外观的样式表语言。通过定义样式规则,CSS 可以指定 HTML 页面中各个元素的显示方式,包括颜色、布局、字体、间距等。 与 HTML 专注…...
鸿蒙next版开发:ArkTS组件自定义事件分发详解
在HarmonyOS 5.0中,ArkTS提供了灵活的自定义事件分发机制,允许开发者对组件的事件进行细粒度的控制。自定义事件分发对于实现复杂的用户界面交互和提升用户体验至关重要。本文将详细解读如何在ArkTS中实现自定义事件分发,并提供示例代码进行说…...
计算机图形学论文 | 多边形中的点可见性快速算法
🦌🦌🦌读论文 🐨🐨摘要 针对点的可见性计算这一计算几何中的基础问题,提出一种支持任意查询点的可见多边形快速计算的基于多边形Voronoi图的点可见性算法。以与Voronoi骨架路径对应的Voronoi通道概念&…...
程序员输入问题
题目描述 程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“”,以表示“”与它之前的字符…...
雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本)
雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本) 文 件: 雨晨 23H2 Windows 11 企业版 适度 22631.4445 install.wim 提 取 码: ZZLR 大 小: 2824999564 字节 修改时间: 2024年11月9日, 星期六, 05:33:05 MD5 : 9C88…...
如何评估焊机测试负载均衡性能
评估焊机测试负载均衡性能的方法有很多,以下是一些建议: 1. 确定测试目标:首先,需要明确评估焊机测试负载均衡性能的目标。这可能包括提高生产效率、降低能耗、减少设备故障率等。明确目标有助于选择合适的评估方法和指标。 2. …...
【卷积基础】CNN中一些常见卷积(1*1卷积、膨胀卷积、组卷积、深度可分离卷积)
文章目录 逐通道卷积(Pointwise Convolution,1x1 卷积)主要作用逐通道卷积的操作过程优势代码示例典型应用 膨胀卷积(Dilated Convolution)主要作用工作原理膨胀率 (dilation rate) 的定义代码实例膨胀卷积的优点 组卷…...
组合(DFS)
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入:n 1, k 1…...
linux盘扩容缩容
这里写目录标题 文件格式介绍问题:当根盘满了过后怎么办?解决方式: Xfs文件格式缩容扩容1. 备份2. 卸载home3. 缩容home(home盘为xfs文件格式)4. 扩容 /5. 恢复home备份 Ext4文件格式缩容扩容1. 备份(可选&…...
mysql中REPLACE语句使用说明
在 MySQL 中,REPLACE语句用于插入或更新数据。当插入的数据与表中的唯一索引或主键冲突时,它会先删除冲突的行,然后再插入新的数据。这是一种很方便的操作方式,可以简化在需要更新或插入数据时的代码逻辑。 它的语法结构与INSERT语…...
分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片
前言 鉴于网上大多数在线转换工具要么需要收费,要么免费后但转换质量极差的情况,本人开发并提供了PDF转图片,WORD转PDF,WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号:STAR001&a…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
