InfluxDB文件结构解析
-
- InfluxDB文件目录结构
- Time-Structured Merge Tree(TSM) File
- Time Series Log(TSL)文件结构
- Time Series Index(TSI)文件结构
- Write Ahead Log(WAL)文件结构
- Series Segment文件结构
- Series Index文件结构
InfluxDB文件目录结构
InfluxDB文件目录结构如上图所示,从图中我们可以看出InfluxDB主目录下有3个子目录:data,wal,meta:
- data:存放时序数据以及其索引文件
- wal: 存放插入数据时产生的write ahead log(wal)
-
meta:存放元数据
下面我们对重要的文件进行进一步的解析。
Time-Structured Merge Tree(TSM) File
TSM文件按列存储时序数据,其文件结构如上所示。该文件主要分为两个三个部分:
- DataBlock : 按列式存储同一个Key = SeriesKey + 单个FieldKey所对应的FieldValue值,以按列的方式进行存储可以获得高效的压缩,节省大量的磁盘空间。
- CheckSum: 该DataBlock的校验码
- FieldValueType: 表示该DataBlock存储的FieldValue类型,InfluxDB中存在5中FieldValueType: Float, Integer, Unsigned, Boolean, String
- TimestampSize: 表示TimeStamps block的长度,使用可变长编码
- Timestamps: 将时间按列使用delta-delta编码压缩
- Values: 将FieldValue值按列进行压缩,不同类型的FieldValue使用不同的压缩算法,具体参见:InlfuxDB FieldValue压缩算法
- IndexBlock: 保存对应DataBlock的相关索引信息
- KeySize: Key的长度
- Key: Key = SeriesKey + 单个FieldKey,例插入一条记录insert cpu,brand=dell,country=china price=100,sale=true,则这条记录有两个Key,分别为cpu,brand=dell,country=china#!~#price和cpu,brand=dell,country=china #!~#sale, #!~#为SeriesKey和FieldKey之间的分隔符
- Type: FieldValue类型
- IndexEntryCount: 用于统计该IndexBlock中IndexEntry的数量
- IndexEntry: DataBlock索引项
- MinTime: 对应的DataBlock中最早数据的时间
- MaxTime: 对应的DataBlock中最晚数据的时间
- DataBlockOffset: 对应的DataBlock在该文件的偏移量
- DataBlockSize: 对应的DataBlock的长度
- Footer: 第一个IndexBlock在文件中的偏移量,通过Footer能够快速查找到IndexBlock的起始位置,再通过IndexBlock能查到对应的DataBlock
Time Series Log(TSL)文件结构
当有新的SeriesKey写入时,首先会将该SeriesKey写入到TSL文件,TSL文件结构如上图所示:
- LogEntry:
- Flag: LogEntry标志,目前有5种标志:
- SeriesInsertFlag: 表示该SeriesKey插入
- SeriesTombstoneFlag: 表示该Series删除
- MeasurementTombstoneFlag: 表示该Measuremen删除
- TagKeyTombstoneFlag: 表示该TagKey删除
- TagValueTombstoneFlag: 表示该TagValue删除
- SeriesID: 采用可变长编码,当Flag为SeriesInsertFlag和SeriesTombstoneFlag时,SeriesID为非0正数,其他情况均为0
- MeasurementSize: 表示Measurement项的长度
- Measurement: Measurement名称,当Flag为SeriesInsertFlag和SeriesTombstoneFlag时,MeasurementSize为0,该项为空
- TagKeySize: 表示TagKey项的长度
- TagKey:当Flag为TagKeyTombstoneFlag和TagValueTombstoneFlag时,TagKeySize不为0,TagKey保存对应值,其他情况TagKeySize均为0,TagKey为空
- TagValueSize:表示TagValue项的长度
- TagValue: 当Flag为TagValueTombstoneFlag时,TagValueSize非0,TagValue保存对应值,其他情况TagValueSize均为0,TagValue为空
- Checksum: 4-byte定长BigEndian编码校验和
- Flag: LogEntry标志,目前有5种标志:
Time Series Index(TSI)文件结构
当TSL文件大小达到配置的compaction阈值时(由配置文件中的max-index-log-file-size指定,默认为1M),TSL文件会compaction成TSI文件,TSI文件结构如上图所示:
- Magic: 魔数
- TagSetBlock: 存储TagKey,TagValue相关信息
- TagValueChunk: 存储TagValue相关信息
- TagValueBlock:
- TagValue
- Flag: 标志位,根据该标志位可以判断TagValue是否已经删除
- ValueSize: TagValue长度
- Value: TagValue值
- SeriesIDCount: 该TagValue对应的seriesID的数量(一个TagValue可以对应多个SeriesKey,SeriesKey和SeriesID是一对一的关系,从而一个TagValue对应对应多个seriesID)
- SeriesIDDataSize: 序列化后的SeriesIDs数据长度
- SeriesIDData:序列化后的SeriesIDs数据,SeriesIDs采用roaringBitmap的方式进行存储序列化
- TagValueHashIndex:
- TagValueCount: 该TagValueBlock中TagValue的数量
- TagValueOffset:该TagValueBlock中TagValue在文件中的对应的偏移量
- TagValue
- TagValueBlock:
- TagKeyBlock:
- TagKey:
- Flag: 标志位,表示该TagKey是否已经删除
- TagValueBlockOffset: 对应的TagValueBlock在文件中的偏移量
- TagValueBlockSize: 对应的TagValueBlock长度
- TagValueHashIndexOffset
- TagValueHashIndexSize
- KeySize: TagKey长度
- Key: TagKey
- TagKey:
- TagSetBlockTrailer:
- TagValueChunkOffset
- TagValueChunkSize
- TagKeyBlockOffset
- TagKeyBlockSize
- TagKeyHashIndexOffset
- TagKeyHashIndexSize
- Version
- TagValueChunk: 存储TagValue相关信息
- MeasurementBlock
- Flag: 标志位,根据该标志位可以判断measurement是否已经删除
- TagSetBlockOffset
- TagSetBlockSize
- MeasurementNameSize: measurement长度
- MeasurrementName: measurement名称
- SeriesIDCount: 该measurement拥有的seriesID数量
- SeriesIDDataSize
- SeriesIDData
- SeriesIDSet: 插入TSL的的所有seriesID
- TombstoneSeriesIDSet:TSL中被删除的所有seriesID
- SeriesSketch: hyhperLogLog结构,存储TSL中seriesID对应的SeriesKey(与SeriesIDSet中的seriesID相对应)
- TombstoneSketch:存储TSL中tombstoneSeriesID对应的SeriesKey(与TombstoneSeriesIDSet中的seriesID相对应),与SeriesSketch结合使用获取measurement cardinality
- Trailer
- MeasurementBlockOffset
- MeasurementBlockSize
- SeriesIDSetOffset
- SeriesIDSetSize
- TombstoneSeriesIDSetOffset
- TombstoneSeriesIDSetSize
- SeriesSketchOffset
- SeriesSketchSize
- TombstoneSketchOffset
- TombstoneSketchSize
- Version
Write Ahead Log(WAL)文件结构
为了防止数据丢失,InfluxDB在进行每次写入或删除操作时首先会将该操作写入WAL文件中,WAL如上图所示:
- Type:WAL Entry类型,目前有3中类型:WriteWALEntryType,DeleteWALEntryType,DeleteRangeWALEntryType
- WriteWALEntry
- FieldType: 插入的Field类型
- KeySize
- Key: SeriesKey + 单个FieldKey(因为是按列式存储)
- FieldValueCount:该Field列写入的数据个数
- Timestamp
- FieldValue
- DeleteWALEntry
- Key: SeriesKey + 单个FieldKey
- Newline:换行符\n
- DeleteRangeWALEntry
- MinTime: 批量删除中最小记录的时间戳
- MaxTime:批量删除中最大记录的时间戳
- KeySize
- Key:同上
- WriteWALEntry
- Snappy Compressed Data:不同类型Entry经过Snappy压缩后的数据(以上不同类型Entry经过snappy压缩后的数据)
Series Segment文件结构
Series Segment文件中存放SeriesKey,该文件结构如上所示:
- Magic
- Version
- Entry:
- SeriesInsertEntry
- Flag: SeriesEntryInsertFlag,标志该entry为SeriesInsertEntry
- SeriesID
- TotalSize: SeriesKey的总长度
- MeasurementSize
- Measurement
- TagEntryCount: TagEntry数量
- TagEntry:
- TagKeySize: TagKey长度
- TagKey
- TagValueSize: TagValue长度
- TagValue
- SeriesTombstoneEntry
- Flag: SeriesEntryTombstoneFlag,标志该entry为SeriesTombstoneEntry
- SeriesID
- SeriesInsertEntry
Series Index文件结构
Series Index文件为Series segment文件的索引文件,该文件存储seriesID -> SeriesKeyOffset的映射,series segment以及series index为db级别文件
- Magic
- Version
- MaxSeriesID: 最大seriesID
- MaxOffset: 最大seriesID对应的offset
- SeriesIDCount: KeyIDMapEntry的数量(IDOffsetMapEntry数量与KeyIDMapEntry数量相同)
- Capacity: KeyIDMapBlock为hash表结构,Capacity表示hash桶的总数量
- KeyIDMapBlockOffset
- KeyIDMapBlockSize
- IDOffsetMapBlockOffset
- IDOffsetMapBlockSize
- KeyIDMapBlock:通过该block可以获取不同SeriesKey对应的seriesID,hash对象为SeriesKey
- KeyIDMapEntry
- SeriesKeyOffset: 高32位表示series segment文件id,通过高32为可以找到存储该SeriesKey所在的series segment文件,低32位表示在series segment文件中的偏移量,通过低32位可以得到seriseID对应的SeriesKey
- SeriesID
- KeyIDMapEntry
- IDOffsetMapBlock:通过该block可以获得不同seriesID对应的SeriesKey,hash对象为seriesID
- IDOffsetMapEntry:
- SeriesID
- SeriesKeyOffset
- IDOffsetMapEntry: