服务名称:持久化服务-IoTDB版
模块名称:persist-iotdb
持久化服务,是Fox-Edge中的系统级服务,它作用是负责将获得的南向设备数据,持久性的保存在MySQL、Redis、IoTDB之中,防止采样数据的丢失。
其他各服务获得设备的采样数据之后,会通过Redis消息队列,把数据推送给该服务,请求入库保存。
它为设备服务、控制器服务提供保存数据的服务,这样设备服务、控制器服务就可以在内存中高速运行,不需要关注数据的保存。
它是一个关键性的基础服务,被定义为系统级别。
persist-iotdb 和 persist-service的功能类似,安装的时候二者选其一。
某些国企项目,想要时序数据库保存大量的历史采样数据。
persist-service的历史数据,是保存在MySQL的tb_device_history表中,MYSQL作为一种通用数据库,它在存储数据的时候,性能是非常有限的,特别是在小型设备之中, 它能够保存几百万条,性能就会明显的下滑。
有的国企用户就希望使用国产的时序数据库IoTDB来保存这部分的采样数据。
持久化服务的IoTDB版,它跟persist-service的最大区别,就是它的历史数据,是保存在 IoTDB中的,而persist-service是保存咋MySQL中的。
IoTDB是由清华大学贡献给阿帕奇基金会的时序数据库,它的开发和维护团队是国内团队。 国企、政府的客户,普遍有信创的要求,所以有些国企集成商指明要使用这种国产数据库,作为准入措施。
在Fox-Edge之中安装持久化服务之后,会有默认的系统参数persist-iotdb / serverConfig ,作为该服务的工作参数。
该参数主要是制定定期清理源源不断产生的用户操作数据和设备历史数据的计划。
{
"operateRecord": {
"period": 3600,
"maxCount": 10000
},
"deviceHistory": {
"host": "localhost",
"port": 6667,
"username": "root",
"password": "root",
"period": 3600,
"lifeCycle": 86400
}
}
{
"operateRecord": {-------------------定期清理历史记录,防止数据库表过渡膨胀
"period": 3600,-----------------3600秒清理一次
"maxCount": 10000---------------最大保留10000条记录
},
"deviceHistory": {-------------------定期清理历史记录,防止数据库表过渡膨胀
"host": "localhost",------------IoTDB的地址
"port": 6667,-------------------IoTDB的端口号
"username": "root",-------------IoTDB的账号
"password": "root",-------------IoTDB的密码
"period": 3600,-----------------3600秒清理一次
"lifeCycle": 86400--------------最大保留最近24*3600秒的数据
}
}
持久化服务在redis上订阅了topic_persist_request_public的topic消息,设备服务、控制器服务会将它们需要保存的数据,
发送到这个topic上,那么持久化服务数据会对来自这个接口的消息进行数据的保存。
数据结构为TaskRespondVO格式,该格式包括
1、设备的通信状态,保存在redis中
2、设备的状态数据,保存在redis中
3、设备的记录数据,保存在mysql中
4、用户的操作记录,保存在mysql中
5、设备的历史数据,保存在iotdb中
操作结果数据:record,根据该标识,会记录到mysql的tb_operate_record表中
设备记录数据:data/value/record,会记录到mysql的tb_device_record表中
设备状态数据:data/value/status,会记录到redis的fox.edge.entity.ObjectEntity和fox.edge.entity.DeviceValueEntity中
历史记录数据:data/value/status中的数字类数据,会记录到iotdb的tb_history表中
MySQL是一种关系数据库,关系数据库是表单式的数据结构。而IoTDB是一种时序数据库,时序数据库的结构跟关系数据库的差异很大。
它的数据模型:【设备】-【采样对象】-【时间:数据】
简单理解,它就是把一个个的设备,分为对应的一个个文件,然后,在文件里面存储多个传感器(比如温度)的数据,每个数据它称为时序。 在这个一个时序里,保存了连续性的【时间:数据】。
这种充分面向IoT设备-传感器的业务模型,并在每个传感器按时间保存一批连续性的数据。 这种高度明确的业务特征,使得可以进行针对性的数据压缩和高效的数据处理。
但是,这个优势是通过高度定制的代价换来的,也就是它不像MySQL一样具有通用性。
通过上面对IoTDB的背景信息了解,persist-iotdb版本有如下限制
1、persist-iotdb只负责把数据写入IoTDB之中,并进行周期性删除过期数据。
2、fox-edge不提供界面管理功能,使用者需要自己实现符合自己需要的界面管理功能。
3、persist-iotdb只负责数据的写入,使用者对数据的查询,需要使用IoTDB提供的组件包iotdb-session的SessionPool 直接访问IoTDB,进行自己的二次开发工作。
4、IoTDB在灵狐的实际测试中发现,对内存的需求比较高(比如它至少需要占用2G内存),用户在硬件规格选型阶段,要为它提供足够的内存空间。
以每个设备作为一个独立的"设备表",它的表名称为【root.tb_device_history.device_xxx】,其中xxx是Fox-Edge中的设备对象的Long型ID
例如:有个设备,名称为“CE+T UPS设备-8”,ID是1193,那么这个设备的数据表名称为
root.tb_device_history.device_1193
设备下的每一个对象称为一个时序,也可以认为是设备表的字段,它的时序名称为【root.tb_device_history.device_xxx.oid_yyy】, 其中xxx是Fox-Edge中的设备对象的Long型ID,而yyy是采样对象的类型表tb_device_mapper中的Long型ID
例如:有个设备,名称为“CE+T UPS设备-8”,ID是1193
该设备类型下面有个采样数据,名称为“逆变器14输出电流”,在tb_device_mapper中表中的ID是348,那么该对象的名称
root.tb_device_history.device_1193.oid_348
IoTDB提供了SQL风格的查询接口,下列常用语句范例
范例: select oid_443 from root.tb_device_history.device_1193;
范例: delete from root.tb_device_history.device_1193.* where time <= 1715394387789;