目录
一、TSDB基本知识
二、物联网平台数据流通架构
三、TSDB数据结构
1、TSDB数据包的组成
2、TSDB的另外两个相关概念
四、阿里云物联网平台实例内TSDB功能介绍
1、数据写入
(1)需要添加的依赖
(2)写入数据代码
2、数据查询
(1)需要添加的依赖
(2)时间点查询
(4)时间戳与北京时间转换在线工具
3、数据管理
一、TSDB基本知识
时间序列数据库 (Time Series Database , 简称 TSDB) 是一种高性能、低成本、稳定可靠的在线时间序列数据库,具备百万级/秒的写入速度,具有高压缩比低成本存储、预降采样、插值、多维聚合计算、可视化查询结果等功能。因此TSDB广泛应用于物联网(IoT)设备监控系统。
TSDB与其他数据库最为明显的区别就是,其数据是按数据所绑定的时间戳顺序进行存储的。注意,数据绑定的这个时间是那条数据在设备端发生的时间,而不是网络发送或接收的时间,这个时间做为一个属性是随着数据参与了数据流转的所有过程。
打个比方,国家某个部委发了一个文件,文件内一定会写明文件发布的日期,这个日期是文件的附属内容。当这个文件从部委下发到厅局,由厅局再下发市局,市局再下发县局,县局再下发到所属各个单位。文件下发转发的所有过程,文件发布的时间都会随着文件而一起流通。那么接收文件的单位,一般不会按接收到文件的时间,而是按文件内注明的发布时间来进行存档。
二、物联网平台数据流通架构
设备将原始数据通过 MQTT 协议发送到物联网平台,经由物联网平台将数据转发到消息服务系统,继而通过流计算系统对这些数据进行实时计算处理后写入到 TSDB 中存储,或者经由物联网平台直接将原始数据写入 TSDB 中存储。前端的监控系统和大数据处理系统会利用 TSDB 的数据查询和计算分析能力进行业务监控和分析结果的实时展现。
下图为架构示意图,图中监控展现为手机等移动设备或者PC机,MQTT物联网设备接入就是物联网平台,从图中可以发现,在实际应用中,只是把被监控的设备通过网关接入了物联网平台,而没有把监控端也接入物联网平台。这样设计的原因主要有两点:第一,物联网平台的设备数是有限的,而监控展现端数量可能会很大,如果把监控端也接入物联网平台,那一定会严重占用物联网平台资源。第二,物联网平台只是一个信息流通的枢纽,主要功能是负责数据的接收和转发,其存储的功能一般不会很强大,存储数据的时间一般不会很长,所以物联网平台把设备的数据流转到TSDB,再由用户访问TSDB会更合理。
三、TSDB数据结构
TSDB数据库内存放的是一条条TSDB数据包,下边介绍一下TSDB数据包的具体内容和组成结构。
1、TSDB数据包的组成
一条TSDB数据其包含以下四部分内容:
-
度量(Metric):监测数据的指标,例如风力和温度。
-
标签(Tag):度量(Metric)虽然指明了要监测的指标项,但没有指明要针对什么对象的该指标项进行监测。标签(Tag)就是用于表明指标项监测针对的具体对象,属于指定度量下的数据子类别。
一个标签(Tag)由一个标签键(TagKey)和一个对应的标签值(TagValue)组成。
注意:当标签键和标签值都相同才算同一个标签;标签键相同,标签值不同,则不是同一个标签。另外还需要注意一个Metric可以有多个Tag。
-
值(Value):度量对应的值,例如 15 级(风力)和 20 ℃(温度)。注意,Value值有数值型和字符型两种。
-
时间戳(Timestamp):数据(度量值)产生的时间点。
2、TSDB的另外两个相关概念
-
数据点 (Data Point):针对监测对象的某项指标(由度量和标签定义)按特定时间间隔(连续的时间戳)采集的每个度量值就是一个数据点。“一个度量 + N 个标签(N >= 1)+ 一个时间戳 + 一个值”定义一个数据点。一个数据点就是这个Metric在tsdb存储的一条具体记录。
-
时间序列(Time Series):针对某个监测对象的某项指标(由度量和标签定义)的描述。“一个度量 + N 个标签KV组合(N >= 1)”定义为一个时间序列,某个时间序列上产生的数据值的增加,不会导致时间序列的增加。这句话的意思就是,对于同一个Metric,对于不同的Tags组合,都有不同的时间序列,时间序列数目等于Tags组数目。所以在Tags组数量确定的情况下,时间序列数也是确定的,只是随着Metric存入的增多,这个时间序列下的数据点会增加。
以下图为例,介绍一下tsdb数据包和两个相关概念。
这个数据包的Metric是“Temprature”,表明是记录温度这个度量值的。
Tags里边包含三个Tag键名:Floor、Room、、和Device ID,图中给出的相应键值为33、3302和7649501,表明记录的是第33楼、3302房间设备id是7649501这个设备采集的温度值。
记录温度这个物理量的Value有一个,是数值型的摄氏度。
表中给出了标签为Floor=33、Room=3302、Device ID=7649501这个Metric的一个时间序列的温度数据,这个时间序列内包含5个数据点,也就是存入了5条温度记录,每条记录都有相应的Timestamp值和Value值。
四、阿里云物联网平台实例内TSDB功能介绍
1、数据写入
TSDB 支持通过 HTTP 协议和 TSDB Java Client 两种方式进行数据写入。下边介绍一下使用TSDB Java Client进行写入的实例。
(1)需要添加的依赖
implementation 'com.aliyun:hitsdb-client:0.2.7'
(2)写入数据代码
时间戳:1662794493715
要写入的数据:tb=3810
要写入的Metric:”TB”
要写入的tag:键名”deviceName”,键值 “20210181”
注意:代码中的实例的connectString为tsdb数据库接入地址, port为端口号,username为用户名, password为登录密码。这些信息可从开发配置/时序存储配置查询。
//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";
final TSDBConfig config = TSDBConfig.address(connectString, port)
.basicAuth(username, password)
// 网络连接池大小,默认为64。
.httpConnectionPool(128)
// HTTP 等待时间,单位为秒,默认为90秒。
.httpConnectTimeout(90)
// IO 线程数,默认为1。
.ioThreadCount(1)
.config();
TSDB tsdbClient = TSDBClientFactory.connect(config);
long timestamp = 1662794493715;
int tb=3810;
Point point = Point.metric("TB")
.tag("deviceName", "20210181")
.timestamp(timestamp).value(tb)
.build();
tsdbClient.put(point);
2、数据查询
TSDB 支持通过 HTTP 协议、TSDB Java Client两种方式进行数据的查询操作。
TSDB Java Client查询方式如下:
(1)需要添加的依赖
implementation 'com.aliyun:hitsdb-client:0.2.7'
(2)时间点查询
查询从现在开始过去最近时间点的一条数据。
实现代码如下所示:
//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";
final TSDBConfig config = TSDBConfig.address(connectString, port)
.basicAuth(username, password)
// 网络连接池大小,默认为64。
.httpConnectionPool(128)
// HTTP 等待时间,单位为秒,默认为90秒。
.httpConnectTimeout(90)
// IO 线程数,默认为1。
.ioThreadCount(1)
.config();
TSDB tsdbClient = TSDBClientFactory.connect(config);
long now = System.currentTimeMillis();
Map tags = new HashMap();
tags.put("deviceName","20210181");
String metric = "TB";
LastPointQuery query = LastPointQuery.builder()
.timestamp(now)
.backScan(0)
.msResolution(true)
.sub(LastPointSubQuery.builder(metric, tags).build()).build();
List lastDataValues = tsdbClient.queryLast(query);
System.out.println(lastDataValues);
代码执行结果如下所示,其中tsuid是这条数据点的id号。
[LastDPValue [metric=TB, timestamp=1662794691216, value=3810.0, tags={deviceName=20210181}, tsuid=0E00000000000F000002000000000010]]
(3)时间段查询
查询限定时间段内的所有数据。
以下是实现代码,注意时间戳单位为毫秒:
//tsdb地址
String connectString="ts-2ze************07.hitsdb.rds.aliyuncs.com";
//端口号
String port=32**;
//用户名
String username="iotuser";
//密码
String password="************";
final TSDBConfig config = TSDBConfig.address(connectString, port)
.basicAuth(username, password)
// 网络连接池大小,默认为64。
.httpConnectionPool(128)
// HTTP 等待时间,单位为秒,默认为90秒。
.httpConnectTimeout(90)
// IO 线程数,默认为1。
.ioThreadCount(1)
.config();
TSDB tsdbClient = TSDBClientFactory.connect(config);
long now = System.currentTimeMillis();
Query query = Query.timeRange(now - 24*3600 * 1000, now)
.sub(SubQuery.metric("TB").aggregator(Aggregator.NONE).tag("deviceName", "20210181").build()).build();
List result = tsdbClient.query(query);
System.out.println(result);
代码执行的结果如下所示,注意,因为是时间段查询,所以结果和时间点查询格式不一样。”dps”就是Data Point缩写的复数形式,其内容就是多个时间点的数据。
[{"aggregateTags":[],"dps":{1662794395193:3810.0,1662794493715:3810.0,1662794591911:3810.0,1662794691216:3810.0},"metric":"TB","orderDps":[{"timestamp":1662794395193,"value":3810.0},{"timestamp":1662794493715,"value":3810.0},{"timestamp":1662794591911,"value":3810.0},{"timestamp":1662794691216,"value":3810.0}],"sdps":{},"tags":{"deviceName":"20210181"}}]
(4)时间戳与北京时间转换在线工具
因为TSDB存储要用到时间戳,时间戳和北京时间可以进行转换,本人经常用到的在线转换工具链接:时间戳(Unix timestamp)转换工具 – 在线工具 (tool.lu)
转换结果如图所示。
3、数据管理
-
数据时效设置
可以通过控制台或者 API 设置数据的有效期。数据时效开启并设置完成后,系统对于定义的过期数据将立即标记失效,并在特定时间进行自动化清理。控制台设置时效如图所受。
-
数据清理
实例内tsdb可以通过 API 进行更灵活的数据清理。
本文章来源于互联网,如有侵权,请联系删除!原文地址:物联网平台搭建的全过程介绍(六)——物联网TSDB之基本知识及读写代码介绍
##注:本教程不涉及硬件方面,所有的硬件发送数据都是模拟的。最终完成的目标是,在阿里云接收到硬件的数据,然后转发到自建服务器,然后存储并大屏展示,其中还包含远程控制硬件设备。(后面可能还有其他需求,还没有想好。) 一、创建物联网平台实例 物联网平台在连接少量设…