// stackgithub.com/influxdata/influxdb/tsdb.(*Store).Open at store.go:221github.com/influxdata/influxdb/cmd/influxd/run.(*Server).Open at server.go:442github.com/influxdata/influxdb/cmd/influxd/run.(*Command).Run at command.go:149main.(*Main).Run at main.go:81main.main at main.go:45// server.gofunc (s *Server) Open() error {if err := s.TSDBStore.Open(); err !=nil {return fmt.Errorf("open tsdb store: %s", err) }}
Store 的 Open 操作会遍历 data 目录,为每个 db 创建一个 Index,为每个 Shard 创建一个 ShardIndex。
ShardIndex 与 Index 是组合的关系,通过 opt 传递 Index,所以 ShardIndex 的大部分核心接口都是通过 Index 实现的。
ShardIndex
ShardIndex 的方法分为四类:
删除 series,支持单个和批量。
创建 series
SeriesIDSet 相关
仅仅是代理 Index 的方法
数据结构
主要存储了两个字段:
seriesIDSet:series Ids 的位图,通过 Roaring Bitmap 实现
measurements:measurement name 到 series count 的 map
typeShardIndexstruct { id uint64*Index seriesIDSet *tsdb.SeriesIDSet measurements map[string]int// measurement name -> series 的数量 opt tsdb.EngineOptions}
series: series key 到 series 的索引,series key = measurement + tag set
measurements:measurement name 到 measurement 的索引
typeIndexstruct { mu sync.RWMutex database string sfile *tsdb.SeriesFile fieldset *tsdb.MeasurementFieldSet measurements map[string]*measurement// key: measurement name series map[string]*series// key: series key(measurement + tag set) seriesSketch, seriesTSSketch estimator.Sketch measurementsSketch, measurementsTSSketch estimator.Sketch rebuildQueue sync.Mutex}// series 相关typeseriesstruct { mu sync.RWMutex deleted bool ID uint64 Measurement *measurement Key string Tags models.Tags}typeTags []TagtypeTagstruct { Key []byte Value []byte}// measurement 相关typemeasurementstruct { Database string Name string`json:"name,omitempty"` NameBytes []byte mu sync.RWMutex fieldNames map[string]struct{} seriesByID map[uint64]*series// key: series id seriesByTagKeyValue map[string]*tagKeyValue// key: tag key sortedSeriesIDs seriesIDs dirty bool}typetagKeyValuestruct { mu sync.RWMutex entries map[string]*tagKeyValueEntry// key: tag value}typetagKeyValueEntrystruct { m map[uint64]struct{} // key: series id a seriesIDs// 有序的 series ids}// 适合做排序、、交集、并集等操作typeseriesIDs []uint64// element: series id