| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> Skywalking IoTDB存储插件设计说明 -> 正文阅读 |
|
[嵌入式]Skywalking IoTDB存储插件设计说明 |
该项目来自于开源软件供应链点亮计划 - 暑期2021的Apache IoTDB - Apache Skywalking适配器项目。目前已提交至Skywalking社区(IoTDB storage plugin #7766),正在接受社区评审。 实现思路项目目标是为Skywalking开发一个使用IoTDB进行相关数据读写的适配器。可以参考Skywalking目前已有的采用InfluxDB、H2和Elasticsearch的适配器。Skywalking给出了存储拓展的开发指南,参考链接。此外,需要使用Skywalking和InfluxDB的调试过程,以便充分了解Skywalking的接口和使用方式。 IoTDB建议使用其提供的原生客户端封装: Session或Session Pool与IoTDB服务端进行交互。 开发平台:Win10,IoTDB版本:0.12.2 相关概念Skywalking的存储模型Skywalking 8.0+的存储模型大致分为4类:Record,Metrics,NoneStream,ManagementData。它们都实现了StorageData接口。StorageData接口必须实现id()方法,下面分别介绍4类存储模型:
部分参考《Apache Skywalking实战》第9章:SkyWalking OAP Server存储模型 IoTDB的数据模型参考IoTDB官方数据模型介绍。简单来说,可以用树结构来认识IoTDB的数据模型。如果按照层级划分,从高到低依次为:Storage Group -> (LayerName) -> Device -> Timeseries。从最上层到其下某一层称为一条路径(Path),最上层是Storage Group,倒数第二层是Device,倒数第一层是Timeseries,中间可以有很多层,每一层姑且称之为LayerName。 值得注意的是,每个Storage Group需要一个线程,所以Storage Group过多会导致存储性能下降。此外,LayerName的值存储在内存中,而Timeseries的值及其下的数据存储在硬盘中。 Skywalking的IoTDB-adapter存储方案概念划分Skywalking的每个存储模型可以认为是一个Model,Model中包含了多个Column,每个Column中具备ColumnName和ColumnType属性,分别表示Column的名字和类型,每个ColumnName下存储多个数据类型为ColumnType的数据Value。从关系型数据库的角度来看的话,Model即是关系表,Column即是关系表中的字段。 方案一:类似关系型数据库的存储方案(无法实现)将Skywalking的所有存储模型都写入IoTDB的一个存储组中,例如root.skywalking存储组。Model对应Device,Column对应Timeseries。即Skywalking的“Database -> Model -> Column”对应到IoTDB的“Storage Group -> Device -> Timeseries”。该方案的IoTDB存储路径只有4层:root.skywalking.ModelName.ColumnName。该方案的优点是逻辑清晰,实现难度较低,但由于数据都存储在硬盘上,查询效率相对较差。
方案二:引入索引的存储方案由于IoTDB的每个LayerName存储于内存中,可以将其认为是一种索引,可以充分利用LayerName的这个特性提高IoTDB的查询性能。 依然将Skywalking的所有存储模型都写入IoTDB的一个存储组中,例如root.skywalking存储组。Model对应一个LayerName,需要索引的Column也对应于LayerName,不过LayerName并不存储ColumnName,而是存储对应的Value,相当于需要索引的一个Column的不同Value存储在同一分支下的同一层。不需要索引的Column依然对应Timeseries,即路径的最后一层。最终将导致同一个Model的数据分散到多个Device中。 由于该方案丢失了需要索引的ColumnName,所以需要通过硬编码记录需要索引的ColumnName及ColumnType。此外为了避免存储的混乱,还需要保证一个Model下多个索引Column的顺序。计划通过硬编码存储Model需要索引的Column的存储顺序。 该方案的IoTDB存储路径长度是不定的,索引的Column越多,路径的长度越长。例如: 当前有model1(column11, column12),model2(column21, column22, column23),model3(column31),下划线说明该字段需要索引。
插入:
查询:
该方案的优点是实现了索引功能,类似InfluxDB的tag,但逻辑较复杂,实现难度较大。另一方面还需进一步确定哪些Column需要作为索引列,这一点可以参考Elasticsearch(StorageEsInstaller),InfluxDB(TableMetaInfo),MySQL(MySQLTableInstaller)的实现,以及ModelColumn的isStorageOnly属性。 该方案将部分数据通过LayerName存储在内存中,在海量数据的情况下可能会导致内存开销较大。此外,由于同一个Model的数据被分散到了多个Device中,所以查询往往需要跨多个Device进行查询。但在这一方面,IoTDB对于跨Device的聚合查询、排序查询、分页查询的支持还不够完善,在一些情况下需要使用暴力法将所有符合条件的数据都查出来,然后再自行实现聚合、排序、分页的功能。具体描述可参考下文在IoTDB社区提交的Issue和Discussion。
已确定采用索引的字段
此外,可以将time_bucket转换为IoTDB自带的时间戳timestamp后进行存储,而无需另行存储time_bucket 方案的性能测试参考来自开源软件供应链点亮计划 - 暑期2021的兼容InfluxDB协议或客户端项目的设计文档,可以看到,使用索引的情况和不使用索引的情况在查询时间上有数倍的差距。 Skywalking-IoTDB适配器的设置参数
遇到的问题及解决方案
总结当前的存储方案还存在使用暴力法进行查询的情况,即使通过Skywalking社区的审查,性能也是不足的,具有数据传输开销大、系统处理资源占用大的问题。暂时还没有好的方法可以解决,要等后续IoTDB针对这类场景增加不同语义的关键字或者完善现有的查询语义才行。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:40:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |