云原生、分布式时序数据库

云原生、分布式时序数据库

原生数据库(Cloud Native Database)是指充分利用云计算平台以及分布式系统的优势而设计的数据库。云原生数据库提供了按照实际使用资源量来计费的能力,以降低运营成本。此外,它提供了快速开发原型、研发、测试以及部署新应用的能力,可以大大缩短新应用从设计开发到进入市场的时间。

作为一个云原生,而不只是能在云上运行的时序数据库(Time Series Database),TDengine 具备云原生数据库的几大特点:水平扩展性(Scalability)、弹性(Elasticity)、韧性(Resiliency)、可观测性(Observability)以及运维自动化(Automation)。

在我们讨论这些特性之前,可以先简单了解一下 TDengine 的分布式设计。

分布式设计

TDengine TSDB 从研发的第一天起,就按照分布式高可靠架构进行设计,是支持水平扩展的——任何单台或多台服务器发生硬件故障或软件错误都不影响系统的可用性和可靠性。同时,通过节点虚拟化并辅以负载均衡技术,TDengine TSDB 能最高效率地利用异构集群中的计算和存储资源,降低硬件投资。

一个完整的 TDengine TSDB 系统运行在一到多个物理节点(一台服务器、虚拟机或容器)上。逻辑上,它包含数据节点(dnode)、TDengine TSDB 应用驱动(taosc)以及应用(app)。系统中存在一到多个数据节点,这些数据节点组成一个集群(cluster)。应用通过 taosc 的 API 与 TDengine TSDB 集群进行互动。下面对每个逻辑单元进行简要介绍。

云原生、分布式时序数据库 - TDengine Database 时序数据库

物理节点(pnode): pnode 是一独立运行、拥有自己的计算、存储和网络能力的计算机,可以是安装有 OS 的物理机、虚拟机或 Docker 容器。物理节点由其配置的 FQDN(Fully Qualified Domain Name)来标识。TDengine TSDB 完全依赖 FQDN 来进行网络通讯。

数据节点(dnode): dnode 是 TDengine TSDB 服务器侧执行代码 taosd 在物理节点上的一个运行实例,一个工作的系统必须有至少一个数据节点。每个 dnode 包含零到多个逻辑的虚拟节点(vnode),但管理节点、弹性计算节点和流计算节点各有 0 个或 1 个逻辑实例。dnode 在集群中的唯一标识由其 endpoint(EP)决定——由物理节点的 FQDN 和配置的网络端口组合而成。通过配置不同的端口,一个物理节点可以运行多个实例,即拥有多个 dnode。

虚拟节点(vnode): 为更好地支持数据分片、负载均衡,防止数据过热或倾斜,TDengine TSDB 引入了 vnode(虚拟节点)的概念。每个 vnode 都是一个相对独立的工作单元,拥有独立的运行线程、内存空间和持久化存储路径,是时序数据存储的基本单元。一个 vnode 包含一定数量的表(数据采集点)的数据,包括时序数据和元数据。一个 vnode 就是一个分片(shard)。当在集群中创建一个新的数据库时,系统会自动为该数据库创建相应的 vnode。一个 dnode 上能够创建的 vnode 数量取决于该物理节点的硬件资源,如 CPU、内存和存储容量等。

管理节点(mnode): mnode 是集群中的核心逻辑单元,负责监控和维护所有 dnode 的运行状态,并在节点之间实现负载均衡。同时,管理节点也负责元数据(包括用户、数据库、超级表等)的存储和管理,因此也称为 MetaNode。为了提高集群的高可用性和可靠性,TDengine TSDB 集群允许有多个(最多不超过 3 个)mnode,这些 mnode 自动组成一个虚拟的 mnode 组,采用 Raft 一致性协议来确保数据的一致性和操作的可靠性。

计算节点(qnode): qnode 是集群中负责执行查询计算任务的虚拟逻辑单元。为了提高查询性能和并行处理能力,集群中可以配置多个 qnode,这些 qnode 在整个集群范围内共享使用。qnode 并不与特定的数据库绑定,一个 qnode 可以同时处理来自多个数据库的查询任务。当执行查询时,调度器会根据执行计划分配一个或多个 qnode 来共同完成任务。通过引入独立的 qnode,TDengine TSDB 实现了存储和计算的分离。

流计算节点(snode): snode 是集群中专门负责处理流计算任务的虚拟逻辑单元。集群中可以配置多个 snode,在整个集群范围内共享使用。snode 并不与特定的流绑定,一个 snode 可以同时处理多个流的计算任务。当需要执行流计算任务时,mnode 会调度可用的 snode 来完成。通过将流计算任务集中在 snode 中处理,TDengine TSDB 实现了流计算与批量计算的分离,从而提高了系统对实时数据的处理能力。

虚拟节点组(VGroup): vgroup 是由不同 dnode 上的 vnode 组成的一个逻辑单元,这些 vnode 之间采用 Raft 一致性协议确保数据一致。在 vgroup 中,写操作只能在 leader vnode 上执行,数据以异步复制的方式同步到其他 follower vnode,从而在多个物理节点上保留数据副本。vgroup 中的 vnode 数量决定了数据的副本数。利用 TDengine TSDB 的多副本特性,企业可以摒弃昂贵的硬盘阵列等传统存储设备,依然实现数据的高可靠性。

taosc: taosc 是 TDengine TSDB 给应用提供的驱动程序,负责处理应用与集群之间的接口交互,提供 C/C++ 语言原生接口,内嵌于 JDBC、C#、Python、Go、Node.js 等多种编程语言的连接库中。taosc 负责获取并缓存元数据,将写入、查询等请求转发到正确的 dnode,并在将结果返回给应用程序之前,执行最后一级的聚合、排序、过滤等操作。应用都是通过 taosc 而不是直接连接集群中的数据节点来与整个集群交互的。

分析节点(anode)与 TDgpt: anode 是 TDengine TSDB 集群中负责执行 AI 分析任务的节点,由时序数据分析智能体 TDgpt 驱动运行。TDgpt 是与 TDengine TSDB 主进程 taosd 适配的外置式分析智能体,内置了经典的统计分析模型库(Statsmodels、Pycularity 等),内嵌了 PyTorch/Keras 等机器学习与深度学习框架,同时通过适配方式直接调用涛思数据自研的时序数据基础大模型 TDtsfm。TDgpt 由若干个无状态的 anode 构成,可以按需在集群中部署,也可以根据分析模型的特点将 anode 部署在合适的硬件环境中——例如带有 GPU 的计算节点。查询过程中,vnode 会将涉及时序数据高级分析的部分直接转发到 anode,分析完成后将结果组装并嵌入查询执行流程。通过 SQL 语句即可调用异常检测(ANOMALY_WINDOW)、时序预测(FORECAST)、缺失数据补全等 AI 分析能力,无需应用代码做任何调整。TDgpt 还是一个开放的系统,用户可以根据业务需要添加自定义的分析算法,添加完成后仅通过修改 SQL 中的算法参数即可无缝使用。

水平扩展性(Scalability)

TDengine 是通过数据采集点以及时间两个维度,对大数据进行切分,实现水平扩展的,它既支持分片,也支持分区。

云原生、分布式时序数据库 - TDengine Database 时序数据库

分片: 在 TDengine TSDB 的设计与实现里,一个集群有多个数据节点,每个数据节点可以有一个或多个虚拟节点(vnode),每个虚拟节点里存储了一定数量的数据采集点的数据,而一个数据采集点的时序数据和元数据永远只存放在一个 vnode 里。这样如果有很多数据采集点,通过一致性 Hash,这些数据采集点的数据将会分布在多个 vnode 上,分布在多个节点里。

分区: 除将数据分片之外,TDengine TSDB 还将一个 vnode 里存储的时序数据按照时间段进行切分。每个时间段的数据都一定保存在一起,不同时间段的数据不会有交集,时间段可以是一天、几天、一周,由用户自己定义。按照时间段切分时序数据有很多好处:查询数据时,根据时间段可以直接定位要查找的文件,从而加快查询速度;可以高效地实现数据保留策略,超过最长保留时间的数据,直接删除一个时间段对应的文件即可;而且按照时间段切分数据,还可以方便实现多级存储,冷热数据放在不同存储介质上,进一步降低存储成本。

高基数: 在 TDengine TSDB 的设计中,每个数据采集点的元数据没有存放在中心点,而是分布在各个 vnode 里。当应用要将数据插入到一张表或对一张表做查询操作时,基于表名的 hash 值,插入或查询请求将被直接发送到对应的 vnode,由于没有中心点,不会有任何瓶颈。对于多个点的聚合计算,查询的请求将被同时发往相关的 vnode,每个 vnode 都会执行对应的聚合操作,然后将结果返回给 taosc 或 qnode,做进一步的聚合。

TDengine TSDB 具有超强的水平扩展能力,为获得更多的数据处理能力,只需要加入更多的数据节点即可。通过测试,我们可以验证,在 10 亿时间线、100 个数据节点的情况下,整个 TDengine 性能还能得到很好的保证。时序数据处理里的”高基数”问题完全得到了解决。

弹性(Elasticity)

在 IoT 或 IIoT 情况下,系统需要快速将最新数据返回给应用程序。作为一个云原生数据库,TDengine 不仅提供 scale up 的能力,也提供 scale down 的能力,从而让系统具有弹性。

为支持存储的弹性,如果插入的延时已经超过一定阈值或者性能不够,TDengine TSDB 会将一个 vnode 拆分成两个,从而分配更多的系统资源给数据写入操作。另一方面,在能够保证延时与性能的情况下,TDengine TSDB 也可以把多个 vnode 合并成一个,以节省系统资源。

为支持计算的弹性,TDengine TSDB 引入了计算节点 qnode。对于简单的查询,比如获得某张表的原始数据或卷曲数据(rollup data),对应的 vnode 将完成所有的操作,无需 qnode 的参与。但对于一个需要排序、分组或其他需要计算资源的操作,查询的执行过程中,一个或多个 qnode 将被调用。在具体的部署中,qnode 可以运行在容器里,它的启停完全由 mnode 根据系统负载情况决定。

同时,流计算节点 snode 的引入进一步增强了弹性。snode 专门负责处理流计算任务,与批量查询计算分离,集群中可以配置多个 snode,mnode 会根据系统负载调度可用的 snode 来完成实时计算任务。如果没有可用的 snode,流计算任务将在 vnode 中执行,确保功能不受影响。

通过引入 qnode、snode 和 anode,TDengine TSDB 成为一个理想的时序数据分析平台——从常规查询、实时流计算到 AI 驱动的异常检测与预测分析,计算资源可以独立弹性伸缩。在云计算的环境里,计算资源是近似无限的,但又可以弹性地伸缩。

云原生、分布式时序数据库 - TDengine Database 时序数据库

韧性(Resilience)

TDengine TSDB 的韧性是通过其高可靠与高可用设计来实现的。

对于数据库,存储的高可靠是最高优先级的。TDengine TSDB 采用 Database 实现中传统的方法 WAL(Write Ahead Log)来保证即使系统宕机,数据仍然可以恢复而不会丢失,从而实现数据的高可靠。在设计中,新写入的数据总是先写入 WAL,然后写入内存,转发给其他节点,再给应用发回确认。

云原生、分布式时序数据库 - TDengine Database 时序数据库

TDengine TSDB 通过多副本以及 RAFT 一致性协议,保证 vnode 和 mnode 的高可用性。对于元数据,TDengine TSDB 采取的是强一致性;而对于时序数据,TDengine TSDB 采取的是异步复制方式,在保证数据可靠性的同时确保时序数据的写入效率。

在不同数据节点上的 vnode 可以形成一个虚拟节点组(VGroup)。虚拟节点组里,数据是通过 RAFT 协议来保证数据一致的,一般虚拟节点组有 3 个虚拟节点。数据写入操作总是在 Leader 节点上进行,但是查询可以在 Leader 和 Follower 节点上同时进行,以提升查询能力。当 Leader 节点失败,系统将自动选择新的 Leader,只要虚拟节点组里超过半数以上的节点仍然工作,那么这个虚拟节点组就可以继续提供数据写入和查询操作,从而保证系统的高可用。

对于 mnode,为保证其高可用,整个集群会部署最多 3 个 mnode,这些 mnode 形成一个虚拟节点组,它们之间的数据一致性通过 RAFT 来实现,而且是强一致。只要超过半数的 mnode 工作,mnode 就可对外服务。

可观测性(Observability)

TDengine TSDB 采集了各种指标来监测系统是否运行正常,这些指标包括 CPU、内存、磁盘、流量、请求次数、延时等。它提供了 Grafana 的看板 TDinsight,以实现这些指标的可视化与报警。关于更多 TDinsight 的信息,请看文档。

云原生时序数据库-TDengine Database TDinsight-1-cluster-status

TDengine TSDB 还提供了一个模块 taosKeeper,它能够将采集的指标发送到其他监测工具,比如 Prometheus,这样便于将 TDengine 的监测集成到已有的可观测系统。

此外,TDengine TSDB 提供了可视化管理工具 taosExplorer,用户可以通过浏览器直观地查看数据库、超级表、子表等信息,执行 SQL 查询,管理数据写入任务,以及查看集群的运行状态,让系统的可观测性进一步提升。

运维自动化(Automation)

TDengine TSDB 可以用二进制包或 Docker 镜像进行安装。TDengine TSDB 集群可以在 Kubernetes 环境通过 kubectl 命令或 Helm Chart 来部署。数据节点的增加或删除可以通过执行一条 SQL 命令(CREATE DNODE)完成。TDengine TSDB 集群的管理完全可以通过脚本自动化进行,让运营和维护变得简单。关于 Kubernetes 部署,请参考相关文档。

TDengine TSDB 集群可以容纳单个、多个甚至几千个数据节点。应用只需要向集群中任何一个数据节点发起连接即可。taosc 会自动完成 mnode 发现、元数据缓存、请求路由等操作,应用层完全无感知。当集群拓扑发生变化时——比如节点扩容、负载均衡触发 vnode 迁移——taosc 会自动更新缓存,确保请求始终被路由到正确的节点。

总结

通过分布式设计、分区分片、存储和计算分离、流计算与批量计算分离、AI 分析与数据库内核的深度集成,以及 RAFT 一致性协议等手段,TDengine TSDB 这个时序数据处理平台具备水平扩展性、弹性与韧性。通过内置的 TDgpt 时序分析智能体,AI 能力直接融入查询执行流程,用一条 SQL 即可完成异常检测、时序预测和数据补全。通过支持容器、Kubernetes 部署、全面的指标监测和自动化脚本,TDengine TSDB 可以方便地运行在私有云、公有云或混合云上,从而充分利用云平台的优势。因此 TDengine TSDB 是一个云原生时序数据库(Cloud Native Time-Series Database),而不只是一个能在云上运行的数据库。