InfluxDB数据读取流程

InfluxDB数据读取流程

    • indirectIndex结构体
    • 数据读取流程

indirectIndex结构体

 在讲解InfluxDB数据读取流程之前,首先来看一下InfluxDB中一个中要的结构体struct indirectIndex,这样有助于我们了解后续数据读取以及删除的整个流程,indirectIndex相当于TSM文件的index,通过indirectIndex来查找TSM中的IndexBlock

// indirectIndex is a TSMIndex that uses a raw byte slice representation of an index.  This
// implementation can be used for indexes that may be MMAPed into memory.
type indirectIndex struct {
	mu sync.RWMutex
	// b is the underlying index byte slice.  This could be a copy on the heap or an MMAP
	// slice reference
	b []byte

	// offsets contains the positions in b for each key.  It points to the 2 byte length of
	// key.
	offsets []byte

	// minKey, maxKey are the minium and maximum (lexicographically sorted) contained in the
	// file
	minKey, maxKey []byte

	// minTime, maxTime are the minimum and maximum times contained in the file across all
	// series.
	minTime, maxTime int64

	// tombstones contains only the tombstoned keys with subset of time values deleted.  An
	// entry would exist here if a subset of the points for a key were deleted and the file
	// had not be re-compacted to remove the points on disk.
	tombstones map[string][]TimeRange
}

在这里,我们主要了解一下以下字段:

  • offsets:存放着对应TSM中各个IndexBlock在TSM文件中的偏移量
  • minKey:TSM文件中最小的Key
  • maxKey:TSM文件中最大的Key(TSM中Key按字典序排列)
  • minTime:TSM文件中最早插入的数据的时间
  • maxTime:TSM文件中最晚插入的数据的时间
  • tombsone:Map结构,表示Key在[startTime, endTime]时间段的数据已经被删除了

数据读取流程

InfluxDB数据读取流程_第1张图片
以使用tsi索引为例介绍InfluxDB查询流程,如上图所示,InfluxDB select流程如下:

  1. InfluxDB在进行select查询时会将查询WHERE分为两部分:field过滤和tag过滤。首先会将tag过滤提取出来从倒排索引文件TSL以及TSI中读取满足WHERE条件的SeriesID
  2. 通过SeriesID从SeriesIndex中获取对应的SeriesKey所在的SeriesSegment文件以及在文件中的offset
  3. 从对应的SeriesSegment文件的offset中取出SeriesID对应的SeriesKey
  4. 将SeriesKey和select中的projection list所包含的fieldKey组合起来得到Key(SeriesKey + 单个fieldKey)(例:select a::field,b::field from m where c = 'test’得到m,c=‘test’+am,c=‘test’+b两个Key(假设该过滤条件只过滤出m,c='test’这一个SeriesKey))
  5. 由于indirectIndex.offsets中记录了TSM各个IndexBlock在文件中的偏移量,从而可以根据Key对TSM的IndexBlock部分进行binary search(每个TSM文件中的IndexBlock都包含对应的Key,且IndexBlock都按Key进行排序)得到IndexBlock中的多个IndexEntry
  6. 为了减少读取不满足WHERE中时间范围的数据,会对IndexEntry进行时间过滤,得到满足时间过滤条件的IndexEntry
  7. 根据IndexEntry可以获得对应的DataBlock,从DataBlock中将Key对应的数据读取出来,并根据field条件进行相应的过滤,返回满足条件的数据

你可能感兴趣的:(influxDB)