新闻中心
PRESS CENTER随着大数据时代的来临,各种类型的数据处理和存储需求应运而生,其中一个关键技术就是数据库。数据库主要分为关系型数据库和非关系型数据库,大家所熟悉的数据库中,Oracle、MySQL和Microsoft SQL Server都属于关系型 ,可以被应用于绝大多数场景。但是在物联网(IoT)领域中,就需要用到非关系型数据库中的时序数据库,全称时间序列数据库。与传统的关系型数据库相比,时序数据库在设计和优化上都有其独特之处,其中的典型当属InfluxDB时序数据库。
首先,从数据模型上来看,MySQL数据模型基于关系代数和关系理论,以表格的形式组织数据,并通过SQL语言进行数据操作。而时序数据库则专注于处理时间序列数据,其数据模型往往针对时间序列的特性进行设计,如时间戳、数据点等。这种数据模型更适合处理具有时间序列特性的数据,能够提供更为高效的数据存储和查询性能。
其次,从查询性能上来看,MySQL的查询性能虽然经过优化,但在处理大规模时间序列数据时,其性能可能会受到一定的限制。而时序数据库则通过针对时间序列数据的特性进行优化,如采用列式存储、分区技术等,使得其查询性能在处理大规模时间序列数据时更为出色。
此外,从扩展性上来看,MySQL作为一种传统的关系型数据库,其扩展性相对有限,特别是在处理大规模并发读写时,其性能可能会受到较大的影响。而时序数据库则通过分布式架构设计,能够更好地支持大规模并发读写,具有更好的扩展性。
influxDB和关系数据库(如:MySQL)区别:
influxDB | 传统数据库概念 | |
database | 数据库 | |
measurement | 数据库中的表 | |
points | time | 每行记录都有一列time,主索引,记录时间戳,单位纳秒 |
fields | 普通列,key-value结构,value数据支持多种数据类型(float、integer、string、boolean) | |
tags | 索引列,key-value结构,value数据类型只支持string | |
Retention policy | 数据保留策略,可以定义数据保留的时长,每个数据库可以有多个数据保留策略,但只能有一个默认策略 |
了解了它两的区别后,让我们一起来看看在物联网应用中边缘计算网关是如何与时序数据库做对接的吧!
想要对接时序数据库influxDB,首先需要在EG8200边缘计算网关插入SD卡,会自动安装influxDB数据库,并自动存储在SD卡内。如果未插入SD卡,则无法创建本地influxDB数据库,读写时序数据库
节点自然也就无法使用。但是可以和远端的influxDB数据库通信,例如局域网内有influxDB数据库。
Tips:
在插入新数据时,tags、fields和time之间用空格分隔;
fields和tags的key严格区分大小写
1.读时序数据库influxDB
msg.query #查询语句,如果配置页面没有设定查询语句,必须使用该属性携带查询语句
msg.payload #查询结果
创建保留策略:CREATE RETENTION POLICY "<policy_name>" ON "<database_name>" DURATION <duration> REPLICATION <replication_factor> [SHARD DURATION <shard_duration>]
<policy_name>
:保留策略的名称
<database_name>
:要应用保留策略的数据库名称
<duration>
:数据的保留期限,例如1d
表示一天
<replication_factor>
:数据的复制因子,指定数据在集群中的副本数量
<shard_duration>
:可选,如果要自定义分片持续时间,则可以指定分片的持续时间
例如:CREATE RETENTION POLICY "2_hours" ON "mydb" DURATION 2h REPLICATION 1 DEFAULT
修改保留策略:ALTER RETENTION POLICY "<policy_name>" ON "<database_name>" DURATION <duration> REPLICATION <replication_factor> [SHARD DURATION <shard_duration>]
例如:ALTER RETENTION POLICY "2_hours" ON "mydb" DURATION 4h DEFAULT
删除保留策略:DROP RETENTION POLICY "<policy_name>" ON "<database_name>"
例如:DROP RETENTION POLICY "2_hours" ON "mydb"
查看保留策略:SHOW RETENTION POLICY ON "<database_name>"
例如:SHOW RETENTION POLICIES ON "mydb"
创建数据库:create database myTestDB
删除数据库:drop database myTestDB
查看所有的表:show measurements
创建表:influxDB中没有显式的新建表的语句,写入数据即建立新表,详见写时序数据库
删除表:drop measurements tableTset
查看某个表的数据:select * from tableTset
查看所有的tag:show tag keys from tableTset
查看所有的field:show field keys from tableTset
条件查询:select * from tableTset WHERE model = 'IOTRouter'
时间查询:select * from tableTset WHERE time > now() - 5m
2.写时序数据库influxDB
msg.payload #如果数据类型是string|number|boolean,则msg.payload将作为单独的值写入指定的measurement中,此时没有fields和tags #如果是一个包含了多个属性的对象,那么将按fields写入到measurement中 #如果是一个包含了2个对象的数组,那么第一个对象作为fields写入,第二个对象作为tags写入 #如果是一个包含了多个数组的数组,那么将写入多条数据 msg.measurement #如果未在节点中配置measurement,那么需在发送的数据中携带msg.measurement属性来指定measurement
#无输出口
版本:本地influxDB版本1.6,请选择1.x HOST:127.0.0.1 Port:8086 Database:自定义 用户名:默认为空 密码:默认为空 Measurement:自定义
msg.payload
数据类型是string|number|booleanmsg.payload
数据类型是string,存储的内容为"myvalue"
,多次点击注入将数据写入数据库。然后查询数据库,观察数据存储情况:只有time和value两个字段
msg.payload
是一个包含了多个属性的对象msg.payload
是一个包含了多个属性的对象{"T":32,"H":54}
,T是温度,H是湿度。点击注入一次将数据写入数据库。然后查询数据库,观察数据存储情况:每条数据多了T和H两个KEY,之前已经存在的数据没有值。新增的T和H都属于fields,不建议使用索引。
msg.payload
是一个包含了2个对象的数组msg.payload
是一个包含了2个对象的数组[{"T":32,"H":54},{"model":"IOTRouter"}]
,第一个对象是fields,第二个对象是tags。点击注入一次将数据写入数据库。然后查询数据库,观察数据存储情况。
msg.payload
是一个包含了多个数组的数组msg.payload
是一个包含了多个数组的数组[[{"T":32,"H":54},{"model":"EG8000"}],[{"T":32,"H":54},{"model":"EG8100"}],[{"T":32,"H":54},{"model":"EG8200"}]]
,简单理解为一次注入多个示例3,即一次性写入多条数据。点击注入一次将数据写入数据库。然后查询数据库,观察数据存储情况。
本文摘自《EG系列边缘计算网关-节点介绍-存储节点》,详情请参看原文。