一、IoTDB 1.0新架构介绍
时序数据库IoTDB的新架构旨在实现两个主要目标:在资源充足的场景下提供无上限的服务潜力,以及在资源有限的场景下提供最佳选择。新架构的系统目标包括:
- 支持多模式:同时支持单机模式和分布式模式。
- 大容量:可管理上亿设备和测点,数据量无上限。
- 高可用性:能够容忍部分节点失效,实现系统高可用。
- 高扩展性:随时进行集群扩容,平滑过渡到更大规模的集群。
- 高性能:写入吞吐达到数千万点每秒。
- 可观测性:对系统集群的核心性能进行监控。
IoTDB集群包括两个角色:
- ConfigNode:管理集群节点和分区表信息,负责任务调度和负载均衡。
- DataNode:负责数据存储和查询,管理时间序列数据和元数据,MPP计算引擎运行在DataNode之上。
架构还包括与Spark、Flink、RocketMQ等大数据生态的对接接口。
部署模式包括:
- 单机模式:适用于对扩展性和高可用性要求不高,但对性能要求非常高的用户。
- 分布式模式:包括高可用、高性能和强一致性模式,适用于有高度扩展性和高可用需求的用户。
二、时间序列数据文件存储格式TsFile
TsFile是IoTDB自研的文件数据结构,磁盘占用空间相比InfluxDB可降低85%。
TsFile的数据存储结构
- ChunkGroup:代表设备一段时间的数据存储块。
- Chunk:代表物理量一段时间的数据,分为TSChunk(时间和值都在同一个Chunk中)、TimeChunk(时间和值分开存储)。
- Page:代表物理量一段时间的数据,多个Page可以组合成一个Chunk。
索引结构
- 序列内索引:分为Page级、Chunk级和文件级,用于快速过滤数据块,减少查询时的IO和物化。
- 序列间索引:在TsFile尾部,分为设备层、测点层,用于快速定位具体需要查询的序列。
数据类型和压缩方式
TsFile支持多种数据类型和编码压缩方式,包括INT32、INT64、FLOAT、DOUBLE等,以及TS_2DIFF、SPRINTZ等新的编码算法。二次压缩默认使用LZ4算法,还支持GZIP、ZSTD等算法。
死区处理算法SDT
通过丢掉一些不重要的、重复的点,实现极致压缩。
加载外部TsFile功能
在资源受限的场景下,可以通过TsFile的API直接写入数据,再通过SQL命令加载到IoTDB集群中。
三、IoTDB存储引擎架构IoTLSM
IoTLSM存储引擎架构包括写前日志WAL、顺乱序数据判断机制、内存缓冲区、顺序空间和乱序空间等部分。
分离存储流程
- 顺序数据:直接写到数据空间内。
- 乱序数据:写到乱序数据空间,后台进行合并。
合并机制
- 空间内合并:减少查询IO,提升索引速度,优化文件系统。
- 跨空间合并:将乱序空间内的磁盘文件合并到顺序空间内,提升乱序数据查询效率。
内存数据管理
使用内存对象池Array Pool管理内存存储单元,减少内存对象的初始化和垃圾回收过程,支持数据类型动态调整。