三、生产环境优化方案
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,同程旅行的监控系统在性能和成本上都得到了显著优化,为业务的稳定运行提供了可靠的保障。