TDengine 快速上手:安装部署与基础 SQL 实践(二)
三、生产环境优化方案
3.1 性能调优策略
在生产环境中,TDengine 的性能优化是确保系统高效稳定运行的关键。以下是一些有效的性能调优策略。
连接池是提升数据库连接管理效率的重要工具,它允许应用程序重复使用现有的数据库连接,而不是每次都重新建立连接,从而减少了连接创建和销毁的开销,提高了系统的并发处理能力。在 TDengine 中,我们可以使用 Druid 或 HikariCP 等连接池来优化连接管理。以 Druid 连接池为例,首先需要在项目的依赖管理文件(如 Maven 的 pom.xml)中添加 Druid 的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
然后,在项目的配置文件(如 application.properties)中配置 Druid 连接池的参数:
# 数据源配置
spring.datasource.driver-class-name=com.taosdata.jdbc.TSDBDriver
spring.datasource.url=jdbc:TAOS://127.0.0.1:6030/test
spring.datasource.username=root
spring.datasource.password=taosdata
# Druid连接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=5
# 获取连接的最大等待时间,单位毫秒
spring.datasource.druid.max-wait=60000
# 验证连接的SQL语句
spring.datasource.druid.validation-query=select server_status();
# 验证连接的超时时间,单位毫秒
spring.datasource.druid.validation-query-timeout=5000
# 从连接池获取连接时是否验证连接
spring.datasource.druid.test-on-borrow=false
# 归还连接到连接池时是否验证连接
spring.datasource.druid.test-on-return=false
# 空闲时是否验证连接
spring.datasource.druid.test-while-idle=true
# 空闲连接的检测周期,单位毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 连接的最小空闲时间,单位毫秒
spring.datasource.druid.min-evictable-idle-time-millis=600000
# 连接的最大空闲时间,单位毫秒
spring.datasource.druid.max-evictable-idle-time-millis=900000
通过合理配置这些参数,可以使 Druid 连接池更好地适应应用程序的需求,提高数据库连接的使用效率和系统的并发性能。
TDengine 提供了强大的缓存机制,通过设置CACHEMODEL参数,我们可以灵活选择适合的缓存模式,包括缓存最新一行数据、每列最近的非 NULL 值,或同时缓存行和列的数据。这种灵活性使 TDengine 能根据具体业务需求提供精准优化,在物联网场景下尤为突出,助力用户快速访问设备的最新状态。在高频查询场景中,开启缓存可以显著提升查询性能。例如,我们可以使用以下命令将数据库的缓存模式设置为同时缓存行和列的数据:
ALTER DATABASE power CACHEMODEL 'both';
设置完成后,TDengine 会将高频访问的数据缓存到内存中,当再次查询这些数据时,可以直接从缓存中获取,大大缩短了查询时间。通过show create database power\G命令可以确认数据库的缓存设置:
taos> show create database power\G
***************************1.row ***************************
Database: power
Create Database: CREATE DATABASE `power` BUFFER 256 CACHESIZE 1 CACHEMODEL 'both' COMP 2 DURATION 14400m WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 STT_TRIGGER 2 KEEP 5256000m,5256000m,5256000m PAGES 256 PAGESIZE 4 PRECISION'ms' REPLICA 1 WAL_LEVEL 1 VGROUPS 10 SINGLE_STABLE 0 TABLE_PREFIX 0 TABLE_SUFFIX 0 TSDB_PAGESIZE 4 WAL_RETENTION_PERIOD 3600 WAL_RETENTION_SIZE 0 KEEP_TIME_OFFSET 0
Query OK,1 row(s) in set (0.000282s)
在写入数据时,批量写入可以显著提高写入效率,减少与数据库的交互次数。TDengine 支持在一条INSERT INTO语句中插入多条数据,例如:
INSERT INTO d1001 VALUES(now, 221.3)(now, 222.1);
为了更直观地验证批量写入的性能优势,我们可以使用taosBenchmark工具进行测试。taosBenchmark是 TDengine 官方提供的一款性能测试工具,它可以模拟由大量设备产生的大量数据,还可以灵活地控制数据库、超级表、标签列的数量和类型,数据列的数量和类型,子表的数量,每张子表的数据量,插入数据的时间间隔,taosBenchmark的工作线程数量,是否以及如何插入乱序数据等。
假设我们要测试批量写入 1 万条数据的性能,可以使用以下命令:
taosBenchmark -d power -t 1 -n 10000 -I multi
其中,-d参数指定数据库名称,-t参数指定超级表下的子表数量,-n参数指定每个子表要插入的数据记录数,-I参数指定写入方式为批量写入(multi)。通过这样的测试,我们可以观察到批量写入在处理大量数据时的高效性,能够轻松实现万级 TPS 的写入性能。
3.2 常见问题排查
在 TDengine 的使用过程中,可能会遇到一些常见问题,及时排查和解决这些问题对于系统的稳定运行至关重要。
当客户端无法连接到 TDengine 服务器时,首先要检查taos.cfg配置文件中的firstEp配置。firstEp参数用于指定第一个数据节点的 Endpoint,格式为 FQDN:port。如果firstEp配置错误,客户端将无法正确连接到服务器。例如,如果firstEp配置为localhost:6030,而实际的服务器地址是192.168.1.101:6030,则需要将firstEp修改为正确的地址:
firstEp = 192.168.1.101:6030
修改完成后,需要重启 TDengine 服务使配置生效。此外,还需要检查客户端的网络配置、防火墙设置以及服务器的 FQDN 解析是否正确。如果是云服务器,还要确保安全组规则允许客户端访问服务器的 6030 端口。
在某些情况下,可能会出现数据丢失的问题。这通常与数据库的KEEP参数设置有关。KEEP参数用于指定数据的保留期限,如果KEEP设置的时间过短,数据可能会被提前删除。例如,如果我们设置KEEP 30,表示数据只保留 30 天,超过 30 天的数据将被自动删除。因此,在创建数据库时,需要根据实际的数据生命周期来合理设置KEEP参数。例如,如果我们需要长期保存数据,可以设置KEEP 365,表示数据将保留 365 天。
CREATE DATABASE power KEEP 365 DURATION 10;
另外,数据丢失也可能与数据写入过程中的错误有关,比如写入失败但未正确处理错误信息。在写入数据时,要确保应用程序能够正确捕获和处理写入错误,以保证数据的完整性。
如果发现 TDengine 的性能下降,可以使用show vnodes命令来监控节点负载情况。show vnodes命令可以显示集群中各个虚拟节点(vnode)的状态信息,包括节点的负载、数据量等。通过分析这些信息,可以判断是否存在节点负载过高的情况。例如,如果某个 vnode 的负载过高,可能是由于该节点上的数据量过大或者写入 / 查询请求过于集中导致的。此时,可以考虑对数据进行重新分布,或者优化查询语句,避免对单个节点造成过大压力。
taos> show vnodes;
vgId | vnode | fqdn | port | status | role | load | ntables | rows |
==================================================================================
0 | 0 | dnode1 | 6030 | ready | DN | 10.23 | 100 | 10000 |
0 | 1 | dnode2 | 6030 | ready | DN | 10.18 | 100 | 10000 |
0 | 2 | dnode3 | 6030 | ready | DN | 10.31 | 100 | 10000 |
Query OK, 3 row(s) in set (0.001234s)
从上述输出中,可以看到每个 vnode 的负载情况(load字段),如果某个 vnode 的load值明显高于其他节点,就需要进一步分析原因并采取相应的优化措施。
四、典型应用场景
4.1 物联网场景
在物联网领域,设备数量呈爆发式增长,数据量庞大且增长迅速,对数据存储和处理的性能要求极高。TDengine 凭借其独特的设计和优化,能够轻松存储百万级设备数据,并实现毫秒级响应,为物联网应用提供了强大的数据支持。
以某车企为例,其业务中涉及大量车辆的 GPS 轨迹数据采集和分析。随着车辆数量的增加和业务的拓展,数据量急剧增长,每天产生的 GPS 轨迹数据高达 40 亿条。传统的数据存储方案在面对如此庞大的数据量时,不仅存储成本高昂,而且查询效率低下,无法满足实时分析和决策的需求。
在采用 TDengine 之后,该车企的数据存储成本大幅降低。TDengine 的高压缩比使得数据存储空间大大减少,相比传统方案,存储成本降低了 60%。同时,TDengine 的高效查询性能能够实现毫秒级响应,无论是查询单个车辆的实时位置,还是对大量车辆的轨迹数据进行分析,都能快速返回结果,为车辆调度、智能驾驶等应用提供了有力支持。通过使用 TDengine,该车企能够更好地管理和利用车辆轨迹数据,提升业务效率和用户体验。
4.2 监控系统
在监控系统中,需要管理海量的监控指标数据,并且对这些数据进行实时查询和分析。TDengine 能够支持亿级指标管理,并且提供了丰富的聚合函数,覆盖了 90% 以上的查询需求,为监控系统的高效运行提供了保障。
同程旅行的基础监控系统 “夜鹰监控” 便是一个典型的案例。该系统需要处理百万级别 endpoint、亿级 metric 的数据,每秒有 200 万并发写入以及 2 万并发查询。原有的存储组件基于 RRD 存储,存在数据丢失、无法展示长时间原始数据等问题。为了解决这些问题,同程旅行引入了 TDengine。
接入 TDengine 后,同程旅行的监控系统机器成本下降了 50%。TDengine 的数据写入性能强大,原本需要 10 多台高配机器才能完成的数据写入任务,现在只需要 7 台机器即可完成,并且 CPU 消耗在 10% 左右、磁盘 IO 消耗在 1% 左右。同时,TDengine 的数据读取接入过程也很顺利,结合其自带的强大聚合函数功能,能够轻松实现各种复杂的查询和分析需求。通过使用 TDengine,同程旅行的监控系统在性能和成本上都得到了显著优化,为业务的稳定运行提供了可靠的保障。
相关文章:
TDengine 快速上手:安装部署与基础 SQL 实践(二)
三、生产环境优化方案 3.1 性能调优策略 在生产环境中,TDengine 的性能优化是确保系统高效稳定运行的关键。以下是一些有效的性能调优策略。 连接池是提升数据库连接管理效率的重要工具,它允许应用程序重复使用现有的数据库连接,而不是每次…...
金融级密码管理器——密码泄露监控与自动熔断
目录 金融级密码管理器 —— 密码泄露监控与自动熔断一、模块概述与设计背景1.1 背景与挑战1.2 设计目标二、系统架构设计2.1 系统架构图(Mermaid示意图)三、关键技术与安全算法3.1 密码泄露监控3.2 自动熔断机制3.3 安全日志记录3.4 数据可视化与状态统计四、GUI与Dash仪表盘…...
mysql 主从搭建步骤
主库: 开启log-bin参数,log-bin 参数修改需要重启服务器 --You can change the server_id value dynamically by issuing a statement like this:SET GLOBAL server_id 2;--to enable binary logging using a log file name prefix of mysql-bin, and c…...
Redis 02
今天是2025/04/01 20:13 day 16 总路线请移步主页Java大纲相关文章 今天进行Redis 3,4,5 个模块的归纳 首先是Redis的相关内容概括的思维导图 3. 持久化机制(深度解析) 3.1 RDB(快照) 核心机制: 触发条件ÿ…...
unity UI管理器
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events;// UI界面基类 public abstract class UIBase : MonoBehaviour {[Header("UI Settings")]public bool keepInStack true; // 是否保留在界面栈中public …...
PyTorch深度学习框架60天进阶学习计划-第29天:自监督学习-问题解答(一)
PyTorch深度学习框架60天进阶学习计划-第29天:自监督学习-问题解答(一) 问题: 关于自监督的目标检测模型,怎么联动yolo。 一、 如何与YOLOv7联动? 步骤概述 确定自监督模块的接入位置 在YOLOv7的主干网络…...
GIT 撤销上次推送
注意:在执行下述操作之前先备份现有工作进度,如果不慎未保存,在代码编辑器中正在修改的文件下,使用CtrlZ 撤销试试 撤销推送的方法 情况 1:您刚刚推送到远程仓库 如果您的推送操作刚刚完成,并且没有其他…...
STRUCTBERT:将语言结构融入预训练以提升深度语言理解
【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...
【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破
构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…...
单例模式(懒汉模式/饿汉模式)
相关概念参考:【C】C 单例模式总结(5种单例实现方法)_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…...
16-CSS3新增选择器
知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义,使文档变得更加简洁? 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…...
C语言pthread库的线程休眠和唤醒的案例
一、代码如下 #include<stdio.h> #include<pthread.h> // 定义独占锁 pthread_mutex_t mutex; // 定义条件信号对象 pthread_cond_t condition; // 初始化函数 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享锁初…...
Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇
前言 随着 Spring Boot 3.x 的发布,其对 Java 17 的支持和 模块化架构 的深化,Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化 一、Redis 配置前缀的模块化演进:从 spring.redis 到 spring.data.redis 1.1 Spring Boot 2.x&…...
SQL Server:用户权限
目录 创建 & 删除1. 创建用户命令整理创建 admin2 用户创建 admin_super 用户 2. 删除用户命令删除 admin2 用户删除 admin_super 用户 3. 创建时权限的区别admin2 用户权限admin_super 用户权限 查看方法一:使用对象资源管理器(图形化界面ÿ…...
Windows .gitignore文件不生效的情况排查
概述 今天下班在家里捣腾自己的代码,在配置.gitignore文件忽略部分文件的时候,发现死活不生效 问题根源 经过一通分析和排查才发现,是.gitignore文件的编码错了,刚开始还没注意到,因为是在Windows下开发,…...
cJSON 处理 JSON(轻量级 C 语言库)(二)
第二部分:cJSON 处理 JSON(轻量级 C 语言库) 📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示…...
服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍
NTFS文件系统下格式化在理论上不会对数据造成太大影响,但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程: 1、将故障服务器连接到一台备份…...
《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...
华为云对象存储服务(OBS)
华为云对象存储服务(OBS) 前言 华为云为开发者提供了丰富的 Java SDK,借助这些 SDK 能够方便地与华为云的各类服务进行交互。下面以 华为云对象存储服务(OBS) 的 Java SDK 为例,介绍其使用步骤。 华为云…...
【3】数据结构的双向链表章
目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成:数据域(data)、指针域(pre)、指针域(next)。其中, da…...
分布式环境下的主从数据同步
目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...
蓝桥杯杯赛-日期模拟
知识点 处理日期 1. 按天枚举日期:逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年:正确判断闰年条件。闰年定义为:年份 满足以下任意一个条件:(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…...
【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器
文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表,它是动态检索的部分。使用视图的原因:避免重复的SQL语句;使用表的部分而…...
【TS学习】(15)分布式条件特性
在 TypeScript 中,分布式条件类型(Distributive Conditional Types) 是一种特殊的行为,发生在条件类型作用于裸类型参数(Naked Type Parameter) 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...
Android 小组件
小部件的布局文件支持如下布局: FrameLayout LinearLayout RelativeLayout GridLayout 以及如下控件 AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 应该不止这些有空…...
搭建开源笔记平台:outline
折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。 其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完…...
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...
电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...
presto行转列
presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...
MySQL 5.7 Online DDL 技术深度解析
14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息,请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...
