IOTDB数据库学习记录
前言
从今天开始,我来全面的学习一下IOTDB的知识,关于这个数据库没有什么概念,完全是从小白起步,因为最近做的项目是个工业互联网数据采集的项目,数据的上送频率非常快,mysql不足以支撑这样的写入频率。
开始
搜了很多资料,最有用有价值的就是官网文档,所以一下学习围绕官方文档展开,文档地址:https://iotdb.apache.org/zh/,我用的是1.3.2版本的。
Apache IoTDB 是一款低成本、高性能的物联网原生时序数据库。
IoTDB 套件由若干个组件构成,共同形成“数据收集-数据写入-数据存储-数据查询-数据可视化-数据分析”等一系列功能。
支持高并发连接,单台服务器可支持数万次并发连接/秒。
某车企业务体量庞大,需处理车辆多、数据量大,亿级数据测点,每秒超千万条新增数据点,毫秒级采集频率,对数据库的实时写入、存储与处理能力均要求较高。
Apache IoTDB 始于清华大学软件学院。
通常来说,我们把每个采集点位叫做一个测点( 也叫物理量、时间序列、时间线、信号量、指标、测量值等),每个测点都在随时间的推移不断收集到新的数据信息,从而构成了一条时间序列。用表格的方式,每个时间序列就是一个由时间、值两列形成的表格;用图形化的方式,每个时间序列就是一个随时间推移形成的走势图,也可以形象的称之为设备的“心电图”。
时序数据中主要涉及的概念由下至上可分为:数据点、测点、设备。

数据模型
用角色或者功能,来定义每层的作用。

数据库
用户可以将任意前缀路径设置成数据库。
注意 1:不允许将一个完整路径(如上例的root.ln.wf01.wt01.status) 设置成 database。
注意 2:一个时间序列其前缀必须属于某个 database。在创建时间序列之前,用户必须设定该序列属于哪个database。只有设置了 database 的时间序列才可以被持久化在磁盘上。
注意 3:被设置为数据库的路径总字符数不能超过64,包括路径开头的root.这5个字符。
一个前缀路径一旦被设定成 database 后就不可以再更改这个 database 的设定。
无模式写入:可以在未定义元数据时, 通过 insert 语句直接写入数据,数据库中将自动识别并注册所需的元数据,实现自动建模。
设备
一个物理设备,也称实体(Entity),是在实际场景中拥有物理量的设备或装置。在 IoTDB 当中,所有的物理量都有其对应的归属实体。实体无需手动创建,默认为倒数第二层。实体是管理的一组时间序列的组合,可以是一个物理设备、测量装置、传感器集合等。
物理量
物理量,也称工况或字段(field),是在实际场景中检测装置所记录的测量信息,且可以按一定规律变换成为电信号或其他所需形式的信息输出并发送给 IoTDB。在 IoTDB 当中,存储的所有数据及路径,都是以物理量为单位进行组织。
时间序列
时间戳 (Timestamp)
时间戳是一个数据到来的时间点,其中包括绝对时间戳和相对时间戳。
绝对时间戳
IOTDB 中绝对时间戳分为二种,一种为 LONG 类型,一种为 DATETIME 类型(包含 DATETIME-INPUT, DATETIME-DISPLAY 两个小类)。
在用户在输入时间戳时,可以使用 LONG 类型的时间戳或 DATETIME-INPUT 类型的时间戳,其中 DATETIME-INPUT 类型的时间戳支持格式如表所示:
相对时间是指与服务器时间now()和DATETIME类型时间相差一定时间间隔的时间。
形式化定义为。
数据点(Data Point)
一个“时间戳-值”对。
时间序列(Timeseries)
一个物理实体的某个物理量在时间轴上的记录,是数据点的序列。
对齐时间序列(Aligned Timeseries)
在实际应用中,存在某些实体的多个物理量同时采样,形成一组时间列相同的时间序列,这样的一组时间序列在Apache IoTDB中可以建模为对齐时间序列。
在插入数据时,一组对齐序列的时间戳列在内存和磁盘中仅需存储一次,而不是每个时间序列存储一次。
对齐的一组时间序列最好同时创建。
不可以在对齐序列所属的实体下创建非对齐的序列,不可以在非对齐序列所属的实体下创建对齐序列。
查询数据时,可以对于每一条时间序列单独查询。
插入数据时,对齐的时间序列中某列的某些行允许有空值。

路径(Path)
路径(path)是指符合以下约束的表达式:
我们称一个路径中由 ‘.’ 分割的部分叫做路径结点名(nodeName)。例如:root.a.b.c为一个层级为 4 的路径。
下面是对路径结点名(nodeName)的约束:
root 作为一个保留字符,它只允许出现在下文提到的时间序列的开头,若其他层级出现 root,则无法解析,提示报错。
除了时间序列的开头的层级(root)外,其他的层级支持的字符如下:
[ 0-9 a-z A-Z _ ] (字母,数字,下划线)
[‘\u2E80’…‘\u9FFF’] (UNICODE 中文字符)
特别地,如果系统在 Windows 系统上部署,那么 database 路径结点名是大小写不敏感的。例如,同时创建root.ln 和 root.LN 是不被允许的。
如果需要在路径结点名中用特殊字符,可以用反引号引用路径结点名。
路径模式(Path Pattern)
为了使得在表达多个时间序列的时候更加方便快捷,IoTDB 为用户提供带通配符*或**的路径。用户可以利用两种通配符构造出期望的路径模式。通配符可以出现在路径中的任何层。
基础数据类型
IoTDB 支持以下六种数据类型:
BOOLEAN(布尔值)
INT32(整型)
INT64(长整型)
FLOAT(单精度浮点数)
DOUBLE(双精度浮点数)
TEXT(长字符串)
浮点数精度配置
对于 FLOAT 与 DOUBLE 类型的序列,如果编码方式采用 RLE或 TS_2DIFF,可以在创建序列时通过 MAX_POINT_NUMBER 属性指定浮点数的小数点后位数。
数据类型兼容性
当写入数据的类型与序列注册的数据类型不一致时,
如果序列数据类型不兼容写入数据类型,系统会给出错误提示。
如果序列数据类型兼容写入数据类型,系统会进行数据类型的自动转换,将写入的数据类型更正为注册序列的类型。

编码方式
基本编码方式
为了提高数据的存储效率,需要在数据写入的过程中对数据进行编码,从而减少磁盘空间的使用量。在写数据以及读数据的过程中都能够减少 I/O 操作的数据量从而提高性能。IoTDB 支持多种针对不同类型的数据的编码方法:
PLAIN 编码(PLAIN)
PLAIN 编码,默认的编码方式,即不编码,支持多种数据类型,压缩和解压缩的时间效率较高,但空间存储效率较低。
集群相关概念
下图展示了一个常见的 IoTDB 3C3D1A(3 个 ConfigNode、3 个 DataNode 和 1 个 AINode)的集群部署模式:

负载均衡
本文档介绍 IoTDB 中的分区策略和负载均衡策略。根据时序数据的特性,IoTDB 按序列和时间维度对其进行分区。结合序列分区与时间分区创建一个分区,作为划分的基本单元。为了提高吞吐量并降低管理成本,这些分区被均匀分配到分片(Region)中,分片是复制的基本单元。分片的副本决定了数据的存储位置,主副本负责主要负载的管理。在此过程中,副本放置算法决定哪些节点将持有分片副本,而主副本选择算法则指定哪个副本将成为主副本。

上强度了。
作者:wangyanfei2021