IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,iotdb时序库虽然有官方文档的支持,以及一套SQL方案,但基于语言特性或者我们开发习惯,我们往往需要单独写一套方案来做接入支持。
这里介绍了一套完整的Springboot(Spring Cloud)应用接入iotdb的方案支持,能够想关系型数据库一样,将对象作为一个时序模板,管理时序库数据。当然不尽完美,但应对简单的增删查改,基本满足使用要求。下面直接介绍开源内容。
线上效果说明:当前 单设备 时序元数据量(可以简单理解为表对象的行数据)达到了千万级,亿级测点累计,近七千设备量,总数据量近1TB,查询耗时依旧是毫秒响应返回。
github地址:
GitHub - endcy/fcwenergy-iotdb-mybatis: IoTDB结合Mybatis使用示例
架构说明
- 使用iotdb官方包的iotdb-session完成数据的新增,因为使用sql插入,性能太差了,使用官方session包实测每秒基础服单机配置可插入近五万条时序模板数据(开发机配置i5/16G/SSD);
- 数据查询参考官方sql方式,支持面向对象方式的传入查询条件
- 数据update即使用原有时序时间戳,修改实体数据后重新插入,覆盖原有时序;
- 使用官方支持的delete删除数据;
- 自定义注解类型处理器,实现ORM的优势。
工程特性
- IoTDB接入Mybatis,定义时序对象、ORM配置后即可使用,低学习成本,易用易拓展;
- 不需要过于复杂的JDBC/ORM-XML的编码即可执行自定义数据对象的读写操作;
- 支持官方工具包JDBC操作,补充ORM难于实现的更新操作,支持高效api批量插入;
- 动态管理设备时序属性,无需先新增属性再执行入库操作,直接操作数据;
- 方便工程拓展,使用装饰器实现需要的其他备选库持久化操作,如MYSQL等;
- 针对不便处理的时序路径、数据类型等,使用工程自定义的执行器完成相关逻辑;
- 注解简化处理字符串参数类型查询匹配
- iotdb异步数据备份,历史数据DTS服务
- 接口集成测试,方便快速测试
工程结构
- iotdb-mybatis-core 核心工程模块,包含session的时序插入和mybatis集成的查询DML操作
- common-domain 领域模型,包含时序数据实体及其他公共参数相关实体
- iotdb-history-dts 历史数据DTS服务
- application-demo 示例应用工程,包含时序数据实体查询新增触发等操作,集成测试接口验证等
部署准备
- iotdb部署
- 支持docker或jar运行部署
- 推荐官方文档集群部署方案
- 加入iotdb-mybatis-coreiotdb-mybatis-core工程
- 工程作为module嵌入到目标应用工程
- 根据#开发流程自定义需要的时序数据逻辑
测试验证(示例)
-
完善数据库连接和应用配置,运行Application
-
接口http://localhost:8060/logKw/random/add?equipmentId=1001 新增时序实体数据
-
接口http://localhost:8060/logKw/list/days?equipmentId=1001&days=7 查询数据
-
接口http://localhost:8060/logKw/dts/logKw?equipmentId=1001&days=7 dts历史数据同步
配置信息
- 配置中增加多数据源依赖
- #iotdb配置,根据配置和实际部署,自定义参数
- spring.datasource.iotdb.username = 用户名
- spring.datasource.iotdb.password = 密码
- spring.datasource.iotdb.host = ip
- spring.datasource.iotdb.port = 6667(或设定的端口)
- spring.datasource.iotdb.driver-class-name = org.apache.iotdb.jdbc.IoTDBDriver
- spring.datasource.iotdb.jdbc-url = jdbc:iotdb://{spring.datasource.iotdb.host}:{spring.datasource.iotdb.port}/
- spring.datasource.iotdb.initial-size = 5
- spring.datasource.iotdb.min-idle = 10
- spring.datasource.iotdb.max-active = 50
- spring.datasource.iotdb.max-wait = 60000
- spring.datasource.iotdb.remove-abandoned = true
- spring.datasource.iotdb.remove-abandoned-timeout = 30
- spring.datasource.iotdb.time-between-eviction-runs-millis = 60000
- spring.datasource.iotdb.min-evictable-idle-time-millis = 300000
- spring.datasource.iotdb.test-while-idle = false
- spring.datasource.iotdb.test-on-borrow = false
- spring.datasource.iotdb.test-on-return = false
- spring.datasource.iotdb.druid.pool-prepared-statements = true
- #iotdb配置,根据配置和实际部署,自定义参数
开发流程
copy工程后注意变更点
按需在[iotdb-mybatis-core]模块中的Modules包中新增所需时序数据实体操作;
-
- 新增枚举类型DataCategoryEnum,定义数据在iotdb中的设备时序前缀(库);
-
- 定义持久化信息实体,在需要入库的属性上加上@DataField注解;
- 标识时序属性和数据类型
- 实体必须包含createTime/createDate/acquisitionTime属性之一,用于框架记录时序时间
- 定义持久化信息实体,在需要入库的属性上加上@DataField注解;
-
- 定义ORM相关Mapper类和xml文件,用于对象关系映射查询操作
- Mapper类需继承IotDbBaseMapper<T, Q>
- 最少包含queryPage、queryCount、queryCountList、delete基础方法实现
-
- 定义业务调用接口和Service实现类
- Service实现类需继承AbstractIotDbUpdateService
- 按需实现insert、queryAll、update、delete、insertBatch及自定义业务方法
功能拓展说明
当然,基于此方案结合半ORM框架,理论上能够实现非常多的功能支持,本文暂不提供其他内容说明及高级应用示例,请接和IOTDB官方文档sql部分,自行实现。
工程开源参考: