极简的时序数据处理平台

极简的时序数据处理平台

时序数据库(Time Series Database, TSDB)是一个专门为时序数据优化设计的数据库,用于以高效的方式存储和分析时序数据。但是时序数据处理需要的不仅仅是存储和分析。在典型的时序数据处理平台中,TSDB 总是与流处理、缓存、数据订阅和其他工具集成在一起。这使得系统设计复杂且难以维护。此外,它还需要消耗更多的计算和存储资源。

为了降低系统设计复杂度和运行成本,TDengine 充分利用时间序列数据的特点,构建了自己的缓存、流计算和数据订阅功能。它不仅提供了一种高效的时间序列数据存储和分析方式,还为时间序列数据处理提供了一种极简的解决方案(Simplified Solution for Time Series Data),是一个极简的时序数据处理平台。

流计算

为了更快地分析业务运行数据或在更短的时间内检测异常,一个合格的时序数据处理系统必须在数据点到达系统后立即进行实时分析计算。流计算非常适合时间序列数据的处理。流计算可以是时间驱动的,以固定的时间间隔产生新的计算结果(称为连续查询),也可以是事件驱动的,每当新数据点到达时立即产生新的计算结果。

大部分 TSDB,包括 TDengine 都为连续查询提供了解决方案。连续查询特别适用于降采样、提前预计算特定类型的查询和其他一些情况。但连续查询还是有很多限制,例如标量函数中的预处理和转换、会话窗口以及其他需要低延迟的情况。因此整个系统仍然需要事件驱动的流计算,大家普遍将 Spark、Flink 或其他工具集成到时间序列数据处理系统中,这使得系统设计变得复杂。

在 TDengine 全新的流计算引擎中,SQL(支持用户自定义函数)会被自动地转化成流计算操作的 pipeline。数据在写入时会自动触发配置好的计算,结果按需输出:实时、周期或水印(watermark)指定。这使得 TDengine 成为支持时间驱动和事件驱动流计算的时间序列数据库。

TDengine 流计算在处理高吞吐量事件时的延迟在毫秒级别,这在实时警报、数据转换、预处理等方面为用户提供了很大帮助。使用 TDengine,还可以对多个数据流进行实时聚合计算,获得对业务的实时洞察,用户可以方便地进行实时分析并构建实时仪表板。此外,TDengine 可以通过指定水印(watermark) 根据需要自动从存储引擎中检索数据等方法来处理乱序的数据。

极简的时序数据处理平台-stream-processing-TDengine Database

所有这些亮眼的功能都非常直观且易于使用,只需一条简单的 SQL 命令。有关更多详细信息,请查看流计算

缓存

在 IoT 或 IIoT 情况下,系统需要快速将最新数据返回给应用程序。例如,车队管理系统总是想知道每辆卡车的当前 GPS 位置。对于智能工厂,系统总是需要知道每个阀门的当前状态和每个仪表的当前读数。

为了解决这个问题,在大多数系统设计中,当一个数据点到达系统时,它被写入一个时间序列数据库。同时,它也被写入 Redis。应用程序从 Redis 中检索最新的数据点,而不是从 TSDB 中获取。这种设计是可行的,但增加了系统的复杂性和操作成本。

在 TDengine 的设计中,每个节点都分配了一个固定大小的内存来缓存数据点。TDengine 以 FIFO 策略而不是 LRU 策略管理其缓存,因为对于时序数据的应用而言,虽然老数据也可能需要被读出来进行分析,但新数据比老数据更为重要。TDengine 缓存最新数据这个设计,提供了在毫秒内读出最新数据的能力。有了这个能力,TDengine 可以通过正确配置用作简单的缓存系统,而无需再部署一个独立的缓存系统。TDengine 提供了一个 SQL 函数 last_row 来获取最新的数据点,十分简单明了。

TDengine 的内置缓存简化了系统架构,最大限度地降低了运营成本。更多详细信息,请查看缓存

数据订阅

消息队列在许多系统架构中起着重要的作用,传入的数据点首先被写入消息队列,然后被系统中的其他组件消耗。

在 TDengine 的设计中,传入的数据点总是首先以添加模式写入预写日志(WAL)。在 TDengine 的早期版本中,一旦内存中的相应数据被持久化到数据库中,该 WAL 文件通常会被删除。WAL 文件用于在系统崩溃时恢复数据。

WAL 文件里保存的数据是按照数据到达的顺序来保存的,为了支持数据订阅,TDengine 从 3.0 开始,不会自动删除 WAL 文件,而是将其保留指定的时间段,WAL 文件可以成为持久消息队列并被其他应用程序使用。

在 TDengine 的设计中,订阅的主题可以是数据库、超级表、一组表或单个表。实际上,主题是用 SQL 语句定义的。一旦主题有了新的数据点,它就会被推送给消费者。如果数据库有多个虚拟节点(分片),消费者组中的多个消费者可以使用同一个主题来提高数据消费的吞吐量。

与流行的 Kafka 相比,TDengine 的数据订阅功能有一个很大的优势,支持数据过滤。应用程序可以订阅仅满足特定过滤条件的数据点。如果一个数据点不满足过滤条件,它根本不会被传递给应用程序。此外,应用程序可以订阅一个特定列或一组列,而非所有列,这样更灵活、更高效。而且订阅的 API 与 Kafka 类似,无学习成本。

通过使用 TDengine 内建的数据订阅功能,时间序列数据处理不再需要 Kafka 或其他消息队列工具,从而降低了系统复杂性和运行成本。

极简的时序数据处理平台-data-subscription-TDengine Database

更多详细信息,请查看数据订阅开发者指南

总结

极简的时序数据处理平台-classical-data-platform-TDengine Database

在时序数据处理平台的通用设计中,采集的数据往往先写入消息队列,然后通过消费,写入数据库(如 HBase、MongoDB 或 MySQL)做持久化存储,同时往往写入 Redis 将最新数据缓存起来,还将数据送入 Spark 或 Flink 等流式计算工具做实时分析,流式计算的结果往往也会写入数据库做存储。应用需要与 Redis、Database 以及 Spark 这些工具集成。T

Dengine 通过内置缓存、流处理和数据订阅功能,为时间序列数据处理提供了一个极简的解决方案。时间序列数据处理不再需要 Kafka、Redis、Spark、Flink 或其他类似工具。

两者逻辑结构对比图如下:

极简的时序数据处理平台 - TDengine Database 时序数据库
极简的时序数据处理平台-tdengine-data-platform-TDengine Database

TDengine 的极简方案大大降低了系统设计的复杂性和运营成本。由于边缘计算的资源非常有限,这种设计在边缘端将带来了巨大的优势。TDengine 不只是一个时序数据库(Time-Series Database),还是一个极简的时序数据处理平台。