TDengine 简介
TDengine 是一款集群开源、云原生的时序数据库,为物联网、工业互联网等场景优化设计,能将物联网设备产生的时序数据进行汇聚、存储、分析和分发。
InfluxDB 简介
InfluxDB 是一款开源时序数据库,支持纳秒级时间戳和高频数据写入,并集成数据采集工具与可视化工具,广泛应用于物联网、监控系统和实时分析场景。
综合对比
TDengine 功能
1. 写入数据
完全兼容 SQL,允许用户使用标准的 SQL 语法进行数据写入
支持无模式写入
2. 查询数据
提供标准 SQL 查询语法
针对时序数据特点新增语法和功能,如降采样、插值、时间加权平均等
支持用户自定义函数(UDF)
3. 流式计算
提供实时处理写入数据流的能力
支持连续查询
支持事件驱动的流式计算
4. 数据订阅
可以通过 SQL 控制订阅的数据内容,
使用和 Kafka 相同的 API 来订阅一张表、一组表、全部列或部分列、整个数据库的数据
5. 集群功能
通过增加节点线性提升系统处理能力,实现水平扩展
通过多副本技术提供高可用性
6. 集成工具
能够和 Grafana、Google Data Studio、Power BI、Tableau 以及国产 BI 工具集成,并提供图形化管理页面
提供交互式命令行程序
7. 语言连接器
提供多种语言的连接器,包括 C/C++、Java、Go、Python、C# 等。
提供 RESTful 接口
InfluxDB 功能
1. 写入与存储
写入优化:通过 TSM 引擎优化,每秒可处理数百万数据点,适用于物联网、工业传感器等高频写入场景
压缩存储:采用 TSM 格式实现高效数据压缩,降低存储空间占用。
2. 查询与分析
多语言查询支持:支持 InfluxQL 语法,兼容传统 SQL 习惯,同时提供脚本式语言 Flux,支持复杂分析
查询扩展功能:支持滑动窗口计算、窗口函数等功能,适用于实时指标监控场景
3. 可视化与监控
Grafana 集成:原生支持,快速创建仪表盘。
内置 UI:InfluxDB 2.x 提供数据探索和可视化界面
告警功能:通过 Flux 或 API 设置阈值告警
4. 生态集成
开发者友好接口:内置 HTTP API,提供便捷的 SDK 集成方案
Telegraf:轻量级数据采集代理
Chronograf:官方可视化工具,2.x 中整合到 Web UI
Kapacitor:流式处理与告警引擎,2.x 由 Flux 替代
5. 运维管理
数据保留策略:支持自定义数据生命周期策略,自动清理过期数据
权限控制:提供用户分级授权机制,支持数据库访问权限的精细化控制
6. 分布式架构
分布式集群:多节点部署,保障分布式架构高扩展、高可用
数据分片、复制:支持数据分片和复制,保障系统稳定性,提升系统容错
7. 安全和管理
用户管理:支持多用户、多权限管理
HTTPS 支持:HTTPS 保障数据传输安全
数据加密:支持数据加密存储和传输
TDengine 数据建模概念
采集量:通过各种传感器、设备或其他类型的采集点所获取的物理量
标签:附着在传感器、设备或其他类型采集点上的静态属性,这些属性不会随时间发生变化
数据采集点:在一定的预设时间周期内或受到特定事件触发时,负责采集物理量的硬件或软件设备
表:TDengine 采取了“一个数据采集点一张表”的设计策略,即要求为每个数据采集点单独建立一张表
超级表:能将某一特定类型的数据采集点聚集在一起,形成一张逻辑上的统一表
子表:数据采集点在逻辑上的一种抽象表示,它是隶属于某张超级表的具体表
虚拟表:一种不存储实际数据而可以用于分析计算的表,数据来源为其它真实存储数据的子表、普通表,通过将各个原始表的不同列的数据按照时间戳排序、对齐、合并的方式来生成虚拟表
库:用于管理一组表的集合
时间戳:每一条上报的时序数据自带的时间戳
InfluxDB 数据建模概念
Database: 数据库名,在 InfluxDB 中可以创建多个数据库
时间戳 Time:每条数据记录的时间,也是数据库自动生成的主索引,默认为当前系统的时间戳(纳秒)
字段 Field:包含数据的实际值,可以是各种数据类型,字段在查询时可以进行数学运算
标签 Tag:用于索引和过滤数据
Point:表里面的一行数据,由时间戳(timestamp)、标签(tag)、字段(field)和组成
Measurement: 存储具有相似特征或属于同一类别的数据点集合,包含了列 Timestamp 时间戳,Field 字段和Tag 标签
Field Set:每组 field key 和 field value 的集合
Tag Set: 不同的每组 tag key 和 tag value 的集合
Retention Policy:定义了数据在数据库中的保存期限。当数据超过了指定的时间限制,它们将自动被删除
Series:共同 Retention Policy,Measurement 和 Tag set 的集合
TDengine 数据模型
在工业物联网领域,结构化数据采集是常态。为了降低用户的使用门槛,TDengine 沿用传统关系型数据库模型进行数据管理。同时,考虑到时序数据的独特属性,TDengine 采用 “一个数据采集点一张表” 的设计方案,即每个数据采集点都对应一张独立的数据表。
这一设计虽能对单个数据采集点实现高效管理,但随着设备数量的爆发式增长,表数量也呈指数级上升,给表的维护管理和跨表聚合操作带来困难。为解决该问题,TDengine 引入超级表概念。超级表结构包含至少一个时间戳列、多个采集量列以及标签列,其中,普通表代表具体数据采集点,超级表则作为具有相同属性的数据采集点集合,有效简化了表管理和聚合查询流程。
然而,实际应用场景更为复杂,一台设备往往搭载多种传感器,且各传感器数据采集频率差异显著,难以用单张表完整描述设备数据。若需整合多传感器数据进行分析,只能依赖多级关联查询,不仅影响使用便捷性,还会降低系统性能。针对这一问题,TDengine 推出虚拟表机制,涵盖虚拟超级表、虚拟子表和虚拟普通表类型。虚拟表仅支持查询操作,无法写入或删除数据,但其在查询功能上与真实表保持一致。
InfluxDB 数据模型
数据库服务器包含逻辑数据库,逻辑数据库包含表,表包含列。V3 与之前的 InfluxDB 版本相比,在 V2 版本中,用户可以将数据库视为存储桶(bucket),在 V1 版本中,则可以将其视为 db/retention_policy。
表相当于一个测量值(measurement),其列可以是 tag(字符串字典)、int64、float64、uint64、bool 或 string 类型,最后,每个表都有一个时间列,该列的精度为纳秒级时间戳。
在 InfluxDB 3 中,每个表都有一个主键(标签和时间的有序集合),用于存储其数据。所有创建的 Parquet 文件都使用主键进行排序。当创建表时(无论是通过显式调用还是首次将数据写入表),系统都会按照标签到达的顺序将主键设置为标签的主键。这是不可变的。表的标签列定义也是不可变的。
标签应包含唯一的标识信息,例如 sensor_id、building_id 或 trace_id。所有其他数据应保存在字段中。用户将能够为任何列(无论是字段还是标签)添加后 N 个值和不同值查找功能。
TDengine 应用场景
智慧城市:存储和管理城市交通、照明、环境监测(PM2.5、PM10)、给排水、燃气监测等数据
智慧工厂:存储生产设备的工业传感器数据(如电流、电压、设备状态)
智慧水务:在水环境治理系统中存储液位、电流、硫化氢、雨量等数据
地震监测与预警:存储地震波形数据,实现实时波形展示
能源电力:管理风机/电表等上报的数据,实现了设备监测与预测
车联网:处理车辆电池、自动驾驶传感器数据,方便分析与维护
InfluxDB 应用场景
监控运维:在企业服务器集群中,InfluxDB 能快速采集 CPU 负载、内存占用等性能指标,记录网络流量变化情况,保存应用程序响应时间等数据。这些数据为管理员和开发人员提供了实时系统状态视图,便于及时发现异常波动,快速定位故障点,提升系统运维效率
实时数据分析:对于海量实时数据的分析处理需求,InfluxDB 支持数据持续高速写入,配合查询机制可快速完成时序数据可视化图表生成、异常数据自动检测、实时阈值报警等操作
日志数据管理:InfluxDB 将日志数据按照时间序列有序存储,尤其适用于分布式系统和微服务架构下海量日志的管理。通过时间维度的有序组织,开发人员能更便捷地回溯、查询和分析日志信息,实现系统运行问题诊断与优化