在工业互联网和物联网的大数据应用场景中,实时数据的写入和查询性能至关重要。如何快速获取最新设备状态并实时处理数据,直接影响到业务的高效运转。本文将深入分析 TDengine 和 InfluxDB 在缓存机制上的差异,帮助读者更好地理解这两款主流时序数据库在性能优化方面的优劣。
TDengine 的读缓存机制
在物联网(IoT)和工业互联网(IIoT)的应用中,实时数据的获取与处理至关重要。相比于历史数据,当前值通常具有更高的优先级和应用价值。因为这些系统大多数依赖实时监控来驱动决策和行动。例如,在智能制造领域,设备的实时状态数据直接影响生产效率和产品质量,任何延迟的决策都可能导致设备故障、生产停滞甚至安全事故。而在智能交通或车联网中,实时数据决定了交通管理和驾驶行为的调整,直接关系到交通流畅性和安全性。因此,获取和分析当前值比仅仅依赖历史数据更具战略意义,它能够更准确地反映出系统的即时需求与状态,帮助实现快速响应和决策优化。
一些架构师尝试通过在时序数据库之外部署 Redis 来实现数据的实时获取,但这种做法往往显著增加了系统的复杂性,同时对工业企业有限的 IT 资源带来额外负担。毕竟,大多数企业并没有专门的团队来支持这些复杂组件的部署与维护。因此,对于这些企业来说,数据平台必须具备内建的实时分析能力,而不是依赖外部工具来弥补这一需求。TDengine 就很好地解决了这一问题,它不仅具备高效的时序数据存储能力,还原生支持实时数据分析,帮助企业简化架构,降低运维成本,并确保数据能够及时转化为可操作的洞察。
TDengine 通过时间驱动的缓存管理策略,将最新的数据优先保存在缓存中。这意味着,最新数据在查询时能更快地被读取,而不必频繁访问硬盘。当缓存容量达到预设阈值后,系统会将最早的数据批量写入硬盘,以此实现高效的缓存管理。这种设计不仅满足了实时数据的高效查询需求,还降低了写入操作对硬盘的压力,延长了硬件寿命。
而在读取数据时,TDengine 的用户通过设置cachemodel参数,可以选择不同的缓存模式。通过该机制,用户可以选择缓存最新一行数据、每列最近非 NULL 值,或同时缓存行和列的数据,这一设计使得 TDengine 能够根据业务需求为用户提供精准的优化。这在物联网场景中尤为关键,让快速访问设备当前状态成为可能。
InfluxDB 的缓存机制
在数据读取方面,InfluxDB 并没有设计专门的读缓存。这意味着每次查询都需要从存储引擎中读取数据,不像 TDengine 可以直接从读缓存中获取最新数据。在实时性要求高的场景中,InfluxDB 由于缺乏读缓存机制,可能会出现查询延迟。为弥补这一缺陷,InfluxDB 的用户往往需要借助外部缓存系统(如 Redis)来提升查询性能,但这同时增加了系统的复杂性和维护成本。
实时数据查询的缓存实践
为了更直观地验证 TDengine 缓存功能对实时数据查询性能的提升,我们以下面的智能电表应用为例,展示 LAST 缓存的实际效果。
首先,使用taosBenchmark工具生成测试所需的时序数据。运行以下命令,该工具会在 TDengine 中创建一个名为power的电表数据库,生成 10 亿条时序数据。数据的时间戳从 2020 年 9 月 13 日 20:26:40(+08:00)开始,超级表为meters,包含 10000 个设备(子表),每个设备记录 10000 条数据,采集频率为每 10 秒一条:
taosBenchmark -d power -Q --start-timestamp=1600000000000 --tables=10000 --records=10000 --time-step=10000 -y
生成数据后,查询任意一个电表的最新电流值和时间戳数据,可以执行以下 SQL 语句:
taos> select last(ts,current) from meters;
查询结果如下:
last(ts) | last(current) |
=================================================2020-09-15 00:13:10.000 | 1.1294620 |
Query OK, 1 row(s) in set (0.353815s)
使用last_row函数进行类似查询,也可以得到以下结果:
taos> select last_row(ts,current) from meters;
结果为:
last_row(ts) | last_row(current) |
=================================================2020-09-15 00:13:10.000 | 1.1294620 |
Query OK, 1 row(s) in set (0.344070s)
为了进一步利用缓存提升查询性能,执行以下命令启用读缓存并指定缓存模式为both,即缓存行和列的最新数据:
taos> alter database power cachemodel 'both';
接下来,通过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)
在启用缓存后,再次查询电表的最新实时数据,第一次查询会做缓存计算,后续查询时延显著降低:
taos> select last(ts,current) from meters;
结果:
last(ts) | last(current) |
=================================================2020-09-15 00:13:10.000 | 1.1294620 |
Query OK, 1 row(s) in set (0.044021s)
再运行last_row查询,结果同样在较短时延内返回:
taos> select last_row(ts,current) from meters;
查询结果:
last_row(ts) | last_row(current) |
=================================================2020-09-15 00:13:10.000 | 1.1294620 |
Query OK, 1 row(s) in set (0.046682s)
从测试结果可以看出,在启用缓存后,查询时延从最初的 353/344 毫秒大幅缩短至 44 毫秒,性能提升约 8 倍。这一例子充分展示了 TDengine 缓存机制对实时数据查询效率的显著改善。
结语
通过上文,我们可以对 TDengine 与 InfluxDB 这两大数据库进行一个对比分析的总结,帮助大家更直观地了解它们各自的优势和适用场景:
- 实时数据查询性能:TDengine 通过读缓存机制,能够快速获取最新数据,显著提升查询性能。而 InfluxDB 缺乏专门的读缓存,每次查询都需要从存储引擎读取数据,可能导致查询延迟。
- 系统复杂性和运营成本:TDengine 的读缓存机制内置于数据库中,无需额外部署缓存系统,降低了系统复杂性和运营成本。相比之下,使用 InfluxDB 的用户可能需要引入外部缓存系统(如 Redis)来提升查询性能,增加了系统的复杂性和维护成本。
- 缓存策略灵活性:TDengine 允许用户根据业务需求,灵活配置缓存策略,如选择缓存最新一行数据或每列最近的非 NULL 值。而 InfluxDB 在这方面的配置选项相对有限。
在工业互联网和物联网大数据应用场景中,TDengine 通过精心设计的缓存机制,实现了数据的实时高效写入和快速查询,降低了系统复杂性和运营成本。相比之下,InfluxDB 缺乏专门的读缓存机制,可能在查询最新数据时表现出一定的延迟。因此,对于需要高实时性数据查询的应用场景,TDengine 的缓存策略更具优势。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。