1. 技术特点
数据模型 -> 一个设备一张表
超级表 -> 加速聚合与筛选
MQTT
发布订阅模式
超轻量:1字节报头,2字节心跳
消息QoS支持,可靠传输保证
云平台
- 操作型数据库与分析型数据库
- 数据时间范围差别
- 数据计算差别 汇总数据
- 数据时间表示差别
- 查询数据总量与查询频度
- 数据更新差别
- 数据冗余差别
- 针对方面 面向应用 面向主题
- 物联网大数据的十大特性:
1)时序;2)结构化;3)采集点数据源唯一性;4)数据较少更新/删除;
5)数据多按日期删除;6)写操作为主,读操作为辅;7)数据流量平稳;
8)数据包含统计/聚合等实时计算操作;9)数据多按指定时间段和区域查找;10)数据量较大。
集群
主从选举
虚拟节点记录一个持久化的版本号,任何数据更新操作都会导致版本号单调递增。
虚拟节点启动时,角色 master、 slave)是不定的,数据是处于未同步状态( unsynced),它需
要与虚拟节点组内其他节点建立连接,并互相交换基本信息(包括版本号、角色等信息)。
如果只有一个副本,该副本永远就是主副本( master
- 所有副本都在线时,版本最高的被选为主副本( master)
- 在线的虚拟节点数过半,而且有虚拟节点是从副本( slave),该虚拟节点自动成为 master
- 对于2和3,如果多个虚拟节点满足成为mate的要求,那么虚拟节点组的节点列表里,最前面的选为
master
健壮性设计
TDegnine重要目标就是在出错的情况下也要保证数据存储的可靠性。
每个物理节点周期性地向管理节点发送心跳信息,网络割裂可能导致部分物理节点跟管理节点失去
联系。管理节点将不再发送心跳信号物理节点标记为 offline,任何存储在 offline的物理节点上的数
据将不再有效。
- 物理节点 offline可能会导致虚拟节点组副本系数低于指定值,管理节点不间断地检测需要复制的虚
拟节点组,一旦发现就启动复制操作
- 从某个虛拟节点存储的数据块有可能被损坏,损坏可能是由存储设错误、网络错误或者软件bug造
成。数据管理模块对文件内容每个数据块进行校验和(checksum)检查。
- 当査询模块驱动数据管理模块获取文件内容的时候,它会检验从数据块校验和是否匹配,如果不匹
配,客户端可以选择从其他虚拟节点进行查询。
心跳负责维持管理状态,客户端需要查询/写入时则从管理节点获取虚拟节点的路由信息,然后找到对应的数据节点获得服务。不同节点之间的数据采用主从复制模式,通讯则采用TCP/UDP混合模式。
TDengine的数据分片是基于虚拟节点(Vnode)的,每个表只进入一个虚拟节点,每个虚拟节点则包含多个表。新建虚拟节点时,系统会自动选择负载较低的物理机器创建节点。每个虚拟节点大约维持在一万表左右以实现最佳性能。管理节点则根据各虚拟节点的负载状况进行实时打分,并根据打分情况实施负载均衡。
64kb 100条
last_row函数直接从内存中取数据
TDengine之所以能够实现极高的性能,是因为产品充分利用了物联网大数据的十大特性:
1)时序;2)结构化;3)采集点数据源唯一性;
4)数据较少更新/删除;5)数据多按日期删除;
6)写操作为主,读操作为辅;7)数据流量平稳;
8)数据包含统计/聚合等实时计算操作;
9)数据多按指定时间段和区域查找;
10)数据量较大。
TDengine从设计之初就针对上述特性专门优化,为物联网场景量身定制。
另一方面,TDengine的代码库完全自主编写,不包含任何第三方库,因而可以在优化层面做到极致。
物联网传感器采集的数据都是符合时间顺序的,针对这一特性,TDengine创新地改变了数据模型,引入“一个采集点一张表”的模式和分块连续存储,从而简化了单点的数据添加操作,加快了数据的插入和查询速度。
在写入流程方面,TDengine将每个传感器当作一个消息队列,在内存中先进先出,保证新采集的数据都在内存中。
数据库则按时间段分区,可以快速定位读取历史数据。这样的模型还利于多级存储,通过时间段区分数据热度来降低存储成本。
每个虚拟节点大约维持在一万表左右以实现最佳性能
为了便于查询和乱序数据的处理,内存中建立了一个 SkipList 作为内存索引。内存中还维护了已经写入数据的最新时间和最老时间等信息。内存中一条数据的行存储格式如下图所示。
BRIN 索引是块级索引,有别于B-TREE等索引,BRIN记录并不是以行号为单位记录索引明细,而是记录每个数据块或者每段连续的数据块的统计信息。因此BRIN索引空间占用特别的小,对数据写入、更新、删除的影响也很小。
时序数据在内存中以 SkipList 方式进行索引的,在硬盘中是以 Block Range INdex(BRIN)方式进行索引的。
如果一张表落盘的记录条数没有达到系统配置参数minRows(每块最小记录条数),将被先存储到last文件,等下次落盘时,新落盘的记录将与last文件的记录进行合并,再写入数据文件。
B-Tree覆盖索引 查询语句必须只引用存储在该索引中的列,才能使用覆盖索引,即只需要扫描索引,不需要去扫描表中数据就可以得到相应的结果。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),
是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议,该协议构建于TCP/IP协议上。
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,
有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
- 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
这就是为什么在介绍里说它非常适合”在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
- 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
Testament:遗嘱机制,功能类似于Last Will。
QoS:发布消息的服务质量,即:保证消息传递的次数
Ø00:最多一次,即:<=1 Ø01:至少一次,即:>=1 Ø10:一次,即:=1
高效写入
语法解析在客户端完成 table meta(在客户端缓存) 服务端接到后通过虚拟节点协调后放入对应WAL和skiplist
小于14k的包udp 大于14k的包tcp 异常重试机制
分组发送最大可能提高吞吐量
两级压缩方式
第一级减少信息量
整型数据:数据重编码
时间数据:差值增长技术
浮点数:基准数差值技术
第二级
整体压缩: 减少单体之间的信息重复和重叠
顺丰科技
顺丰科技大数据集群每天需要采集海量监控数据,以确保集群稳定运行。之前虽然采用了OpenTSDB+HBase作为大数据监控平台全量监控数据的存储方案,但有不少痛点,必须对全量监控数据存储方案进行改造。通过对IoTDB、Druid、ClickHouse、TDengine等时序数据存储方案的调研,最终我们选择了TDengine。大数据监控平台采用TDengine后,在稳定性、写入性能、查询性能等方面都有较大的提升,并且存储成本降低为原有方案的1/10。
中移物联网OneNET
5600->875
在迁移到TDengine之后,性能表现非常不错:写入峰值1.2-1.3w/s ;存储大约只有MySQL的 1/7,查询性能也很突出,单设备单日查询在0.1s以内可以返回结果。