1. 技术特点

数据模型 -> 一个设备一张表

超级表 -> 加速聚合与筛选

MQTT

发布订阅模式

超轻量:1字节报头,2字节心跳

消息QoS支持,可靠传输保证

云平台

  1. 操作型数据库与分析型数据库
    1. 数据时间范围差别
    2. 数据计算差别 汇总数据
    3. 数据时间表示差别
    4. 查询数据总量与查询频度
    5. 数据更新差别
    6. 数据冗余差别
    7. 针对方面 面向应用 面向主题
  2. 物联网大数据的十大特性:

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以内可以返回结果。