开发者学堂课程【第八届大学生创新创业大赛阿里命题数据库命题解析:基于云原生多模数据库 Lindorm 构建物联网应用赛题解析】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1045/detail/15279
基于云原生多模数据库 Lindorm 构建物联网应用赛题解析
内容介绍:
一、 Lindorm 云原生多模数据库介绍
二、 Lindorm 使用入门
三、 案例介绍
通过这节课,首先可以了解到 Lindorm 一个整体的介绍,然后学习到如何去使用Lindorm 去进行数据的建模和使用。
一、Lindorm 云原生多模数据库介绍
首先 Lindorm 是面向物联网、互联网、车联网等场景来设计和优化的云原生多模超融合数据库,它支持宽表、时序、文本、对象等多种数据的统一的访问和融合处理,在接口上面兼容标准的 SQL 协议,并且兼容各种不同的第三方的协议,比如HBRSE、cassandra、OPENTSDB、SOLR等等,可以无缝集成第三方生态工具,适用于日志、监控、账单、广告、社交、出行、风控等多种场景,Lindorm 也是阿里巴巴核心业务支撑的数据库之一
从产品架构上来看,Lindorm是基于存储计算分离、多模共享融合的一个云原生架构,在底层通过云原生分布式存储系统Lindorm BFS来实现统一的存储管理,并提供冷热分层,还有多副本以及自适应压缩这样的能力,为上层的多模引擎提供统一的存储,在多模引擎方面,通过实现宽表引擎、时序引擎、搜索引擎,还有文件引擎,流引擎等多种不同的引擎来达到统一融合的处理。在上面通过SQL引擎,还有计算引擎提供统一的计算能力,对外暴露SQL的标准访问接口,以及兼容第三方开源的协议。
通过这样一个体系,可以将我们不同模型的数据存储到不同的引擎里面多种不同的模型,通过通过统一的计算来进行数据的融合处理。宽表引擎是负责宽表和对象数据的统一管理和服务,它主要具备全局的二级索引、多维检索、动态链、TDL等能力,一般适用于原数据、订单、账单、画像、日志等等场景。持续引擎主要是负责持续数据的管理和服务,主要面向于工业IOT、监控等领域的测量数据在持续引擎。时序引擎主要是负责时序数据的管理和服务,主要面向于工业I ot、监控等领域的测量数据。针对于时序数据的设计的压缩算法,在压缩率上面可以高达15 : 1,支持海量数据的多维查询和聚合计算,同时也支持时序数据的预降残量和连续查询。
搜索引擎主要是负责多模数据的检索分析的加述,它主要是基于列存和倒排等核心技术,具备全文索引、聚合计算、复杂多维查询等等能力,一般适用于日志、账单、画像等等场景,兼容CQ等标准开源的协议。文件引擎主要是负责文件数据的管理和服务,向上提供宽表持续搜索引擎的这个底层的共项存储的服务化能力。计算引擎主要是与联动的计算引擎的深度融合,基于云原生架构提供的分布式计算的能力,满足用户在数据生产、交互式分析、机器学习和图计算等等场景的一些计算需求,它兼容开源的18个标准协议。
通过下面这个例子,可以来介绍一下在实际的应用场景中的一些应用,在比如这里IoT或者APM这样的场景来看,原数据可以存储在关系型的数据库里,在运行过程中所产生的一些轨迹数据,还有日志数据可以存在宽表型的数据里面,因为它会产生大量的数据,对于运行过程中所产生的有时序特性的数据,可以存储在时序型的数据库里,可以选择InfluxDB。设备关系这样的数据可以存在图形数据库里面,最后如果说我们有数据分析的需求,可以把数据转到ElasticSearch里进行检索分析。
有了Lindorm之后,可以用Lindorm一套的数据库来替代刚才所看到的多套数据库,这样可以降低我们的开发成本,减少运维负担,提高访问效率,同时也是可以做到极致的资源成本的优化。
二、Lindorm 使用入门
主要是从宽表和时序两个引擎去看如何去对于实际的应用场景进行建模以及使用。这个过程中会涉及到一些基本概念的一些介绍,一般来说,对于一款数据库的使用,首先需要知道这款数据库的数据的模型,这样可以基于应用场景去先去进行数据的建模,那在这个建模过程中需要去确定创建数据表,所以有必要先了解一下宽表数据模型的一些基本的概念。
首先是一个table即表名,需要去把数据存到表里面去,那其次是Rowkey一般是代表的是唯一的一行,也叫主键Primary key,在底层存储的时候,数据是按照Rowkey去排序存储,其次,数据存储上面也会有Column Family即列族,一般都是代表一系列的一个集合。这些列一般在集成文件存储上是进行集中存储的,如果在读取一行的内容的时候,如果所读取的这些列都是属于同一个列族,那么在读取效率上面是会有比较高的效率的。
其次是在列组上面会有多个列,那这个列也是具体的存储每一列的数据,在底层是以统一的byte数来去进行存储,那每一列可以有多个版本,每个版本是通过写入数据的一个时间戳去标示的,默认是最新的这个时间戳是默认最新的一个数据,一般常见的查询比如说有图片查询,就是给定一个组件去查询这一行的数据,其次是给定一个范围即主键的开始到结束,同时我们也可以去指定一些过滤条件,去对数据结果去进行过滤,在访问上面可以提供多种语言的访问,一般通过使用SQL去进行访问。
这边有一个SQL访问的一个例子主要展示的建表、写入,还有基本的一些查询。
建表语句指定了三列
create table tb (id varchar,
name varchar, address varchar,
primary key(id, name)) ;
通过primary key指定ID和name为主键,
然后在写入数据的时候,
upsert into tb (id, name, address)
values ('001', 'jack', 'hz');
只需要把我们的值对应这些列,然后就可以写入到这张表里去,
在查询的时候查询引擎会自动匹配条件。
select * from tb where id='001';
通过时序模型的介绍,可以了解到数据模型怎样进行建模,首先了解一下时序数据的特性,以风力发电机举例子,风力发电机作为一个数据产生的来源,有两个传感器,一个是功率传感器,还有一个是风速传感器,传感器会按照时间的推移在固定的时间会产生不同的数据,对于风力发电机的属性上面有各种不同的标签,比如这里有ID标签,ID可以用来标示风力发电机的这个唯一性,然后还有型号和厂商的标示,从风力发电机这个例子上可以看到对于一个持续的数型数据的特性,有几个关键点,第一个是有标签也称为tag,比如风力发电机的ID、型号和厂商,是它的三个tag;其次它有两个传感器叫它们field,叫功率和风速,然后它在某一个具体的时间点会产生的数据点称之为Data Point,对于每个设备的每个传感器在不同的时间所产生的数据,可以把它称之为时间线。
了解这些基本的这些概念之后,来了解一下时序模型的建模具体是什么样子的,在了解了实序数据的特点之后,接下来就需要针对于时序数据进行建模,建完模之后,就可以将产生的时序数据写入到所建模的这张数据表里面去。首先要先确定什么样是一张表,通常认为它是代表一类设备的一个集合,它们会有相同的标签、相同的传感器,我们在建模的时候需要去识别出来哪些数据是属于标签数据,哪些数据是属于个值数据,值数据一般都是代表传感器所产生的数据,标签数据一般都是标示数据产生的数据源。
当时序模型建立好且数据写入到时序数据引擎之后,需要去看需要做什么样的查询操作。首先需要去问一下自己,需要查询哪些数据源,哪些设备的在什么时间段的数据,以及包括这个数据是哪个指标,对这个指标的数据,在这个时间段之内具体要做什么样的操作,一般来说可能需要去求这个时间,在这个时间段内之内的数据的比如说最大最小,或者求平均这样的一些操作。同时,可以在时间线密度去进行一个降采样的操作。什么是降采样?比如原始产生的数据是一秒一个数据点,这个时候可以把一秒给它降采样也就是降精度到一分钟力度,那么这一分钟力度就会有60个时间点。对于60个时间点,可以去做一些降采样之后的一些操作,比如求这60个时间点的最大值,最小值、平均或者是求总和,
同样时序模型也提供了标准的SQL访问的入口,这里总结几条最常用的一些操作,比如说创建时间时序表,
CREATE TABLE SeNSor (
device id VARCHAR TAG,
region VARCHAR TAG,
time TIMESTAMP,
temperature DOUBLE,
humidity DOUBLE,
PRIMARY KEY (device id));
那创建时序表的时候,要特别注意的是,去指定哪些列属于tag将其标识出来,也需要有一个固定的以TIMESTAMP的类型所标注的一个时间列,其他的就把它当做正常的值的一列。同时也可以通过PRIMARY KEY来指定分区key。
写入数据
INSERT INTO sensor (device id, region,
time,temperature,humidity)
VALUES (F07A1260, north-cn,
1619076780000,12.1,45);
是通过标准的INSERT INTO的语句来进行数据写入.
基本查询
SELECT avg(humidity) FROM sensor
WHERE device id=xxx
AND time > t1 AND time<t2;
通常需要去制定时间范围,比如说time > t1,并且time<t2,然后再针对查询数据去进行一些聚合的操作。
时序降采样查询
SELECT avg(f1) FROM sensor
WHERE device id=xxx
AND time > t1 AND time<t2
SAMPLE BY 5m;
引入了一个持续特性的一个SQL语句,这里叫SAMPLE BY,SAMPLE BY后面指定。
降采样的精度,此例是制定以五分钟为降采样之后的一个精度去进行数据的查询聚合,这个地方需要去指定降采样的算值,以平均数,平均值为一个算值去计算。
时序最新值查询,
SELECT latest(f1) FROM sensor
WHERE device id=xxx;
通过latest去查询设备的这个最新值。
三、案例介绍
上面主要是介绍了宽表模型和持续模型的基本的建模和使用,还有概念。更多的建议去官网去查阅,那接下来带来一些案例的分享。通过这些案例可以看到针对不同的平台的数据是怎么样去使用Lindorm去进行开发和存储。
首先第一个是物联网平台,可以看到最左边是针对一些IOT的一些设备,它里面会有一些传感器会产生一系列的数据,比如说它会产生一些设备原数据,那这些原数据可以使用宽表引擎去进行存储,在设备运行中会产生一些数据,可以去选择用Lindorm的时序引擎去进行存储。如果这些传感器会产生视频,图片等这样一些大文件,可以去选择使用Lindorm的文件引擎去进行存储;如果有设备检索的需求的话,可以使用Lindorm的搜索引擎去进行存储,当数据存储到Lindorm的引擎之后,可以去使用第三方的一些分析工具,比如Spark、MaxCompute、Flink这样的工具去进行数据分析。
第二个例子是车联网数据的存储和分析,一般针对这个场景,比如新能源或者是重型车、商用车、企业用车等所产生的一些监控数据,它会及时的上报到Lindorm进行存储,然后数据上报到Lindorm存储之后,会对这些车辆进行监控,还有一些车况的一些分析,或者是驾驶行为以及轨迹的分析,然后针对数据上报到Lindorm存储之后的话,主要是会对这些车辆进行监控,还有一些车况的一些分析,或者是驾驶行为,以及轨迹的一些分析。
云原生应用统一监控的例子,一般来说所采集的数据、应用通过Prometheus来进行监控数据的采集,然后Prometheus通过Remote Write协议写到Lindorm TSDB,通过Lindorm TSDB提供的PromQL兼容的查询能力去对外进行数据查询,然后可以使用Grfana通过PromQL这样一个插件去进行的数据的查询和展示。
最后一个案例是工业边云一体时序存储,在工业最边缘的厂房,它可能会产生边缘的一些数据,通过边缘数据采集器,可以将数据上报到边缘的Lindorm TSDB里,最后通过边缘同步通道,将边上所产生的时序数据同步到云端的时序数据进行统一的存储,然后再通过集中式的分析的一些主键去进行数据的分析。
接下来讲一下在使用购买上面的一些注意事项,首先在这个购买页面,推荐在商品类型可以选择按量付费,这样就是按照时长来去付费的,然后开发设置完了之后,可以把这个车程实力进行释放。在部署方案上面选择单可用区,地域选择一个自己想购买的地域。特别注意这里有个专用网络,如果没有的话点击免费创建。
在这个购买页面的下面,在存储类型上面可以选,选择标准型云存储,在数据引擎上,如果选择使用宽表引擎或者是时序持续引擎,可以将宽表引擎的数量和时序引擎的数量相加,最少的节点数量是两个,对于存储空间以及冷存,可以去按照自己的实际使用情况进行购买。
点击购买之后,就会显示开通完成
开通完成之后,在实例列表的页面里面会显示正在创建中,大概等个十几分钟实例就会创建好。
然后如果要去进行连接访问,可以去点一下这个数据库连接的特别页,选在切换到自己的这个所选择的引擎上面,针对每一个引擎去单独去进行开通,如果需要在本地去访问,建议选择开通外网访问地址,然后选择Lindorm-cli这样一个访问工具下载之后可以去进行使用。
点击开通外网之后这个就可以看到红框标识出来的一个例子,然后通过刚才下载的Lindorm-cli这样一个访问工具去连接使用。
是连接、使用的例子
连接:
/lindorm-cli -url
jdbc:lindorm:table:url=http://ld-uf6jq50i1a411shd1-proxy-
lindorm-pub.lindormrdsaliyuncs.com:30060 username root -password root
使用:
create table tb(id varchar, name varchar, address varchar, primary key(idname));
upsert into tb(id, name, address) walues ('ee1', 'jack', 'hz');
select * from tb;
如果是持续引擎的话,操作方法也是类似的。
连接:
/lindorm-cli -url
idbc:lindorm:tsdb:url=http://ld-uf6ia50i1a411shd1-proxy-
tsdb-pub.lindorm.rds.aliyuncs.com:8242
使用:
CREATE TABLE Sensor(
device id VARCHAR TAG. region YARCHAR TAG. time TIMESTAMP
temperature DOUBLE humidity BIGINT.
PRIMARY KEY(device_id));
insert into sensor(device_id,regiontime,temperaturehumidity)
values (F0741260 north-cn"2021-24-22 15:33:00 12.1.45)
('F07A1260’ north-cn’"2021-04-22 15:33:10' 13.2.47),(F07A1260." north-cn"2021-04-2215:33:2010.6.46)
(F07A1261."south-cn""2021-04-22 15:33:00' 18.1,44)
(F07A1261"south-cn’"2021-04-22 15:33:10' 19.7.44):
select device id,regiontimetemperaturehumidity from sensor where device id ='F07A1268’and tine pe'2821-04-22 15:33:80’and timecs2021-84-22 15:33:20'
select device id,region,time,max(temperature) as max temperature from sensar where device_id ='F07A1260' ind time >="2021-04-22 15:33:00’and time <=2021-64-22 15:33:20 sanole by 20:
最后如果使用 SQL 进行访问,可以参考官网上所推出的使用文档去连接使用