天天看点

InfluxDB文件结构解析

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文件目录结构如上图所示,从图中我们可以看出InfluxDB主目录下有3个子目录:data,wal,meta:

  • data:存放时序数据以及其索引文件
  • wal: 存放插入数据时产生的write ahead log(wal)
  • meta:存放元数据

    下面我们对重要的文件进行进一步的解析。

Time-Structured Merge Tree(TSM) File

InfluxDB文件结构解析

  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)文件结构

InfluxDB文件结构解析

  当有新的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编码校验和

Time Series Index(TSI)文件结构

InfluxDB文件结构解析
InfluxDB文件结构解析
InfluxDB文件结构解析

  当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在文件中的对应的偏移量
    • TagKeyBlock:
      • TagKey:
        • Flag: 标志位,表示该TagKey是否已经删除
        • TagValueBlockOffset: 对应的TagValueBlock在文件中的偏移量
        • TagValueBlockSize: 对应的TagValueBlock长度
        • TagValueHashIndexOffset
        • TagValueHashIndexSize
        • KeySize: TagKey长度
        • Key: TagKey
    • TagSetBlockTrailer:
      • TagValueChunkOffset
      • TagValueChunkSize
      • TagKeyBlockOffset
      • TagKeyBlockSize
      • TagKeyHashIndexOffset
      • TagKeyHashIndexSize
      • Version
  • 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文件结构解析

  为了防止数据丢失,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:同上
  • Snappy Compressed Data:不同类型Entry经过Snappy压缩后的数据(以上不同类型Entry经过snappy压缩后的数据)

Series Segment文件结构

InfluxDB文件结构解析

  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

Series Index文件结构

InfluxDB文件结构解析

  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
  • IDOffsetMapBlock:通过该block可以获得不同seriesID对应的SeriesKey,hash对象为seriesID
    • IDOffsetMapEntry:
      • SeriesID
      • SeriesKeyOffset
下一篇: 话说CAS

继续阅读