prometheus 创建db

打开网易新闻 查看更多图片

  • openDBWithMetrics 参数dir 是data路径,默认是 data 目录,也可在 cfg.localStoragePath 指定。

    • open 调用 os.MkdirAll 创建数据目录

    • open 执行 walDir := filepath.Join(dir, "wal")生成wal目录

    • MigrateWAL Migrate old WAL if one exists, 暂不清楚什么情况会migrate

    • &DBdir 赋值给db,并创建db

    • wal.NewSize 创建wal,这里指定了wal目录和 segmentSize,默认是* DefaultSegmentSize* = 128 * 1024 * 1024 // 128 MB。创建成功返回 wlog

    • NewHead 创建head,这里传入前面生成的 wlog

    • db.reload() reload reloads blocks and truncates the head and its WAL

    • db.Blocks() 获取了磁盘上的blocks,并通过 blocks[len(blocks)-1].Meta().MaxTime指定了 minValidTime

    • db.head.Init(minValidTime) 使用上一步的 minValidTime 来初始化head

    • 最后启动db go db.run() 并返回db对象。

New Wal

  • NewSize 传入了wal dir 和 segmentSize

    • listSegments 执行具体find Segments 文件操作,并将文件名排序

    • check segmentSize%*pageSize* != 0pageSize 是32kb

    • os.MkdirAll 创建wal dir

    • Segments 根据传入的wal dir 获取其中的 Segments

    • writeSegmentIndex = last + 1 确定最新的 SegmentIndex

    • CreateSegment(w.Dir(), writeSegmentIndex) 根据wal dir 和最新的 SegmentIndex,新建 segment 文件

    • w.setSegment(segment)segment 赋值给wal, w.donePages = int(stat.Size() / *pageSize*)初始化了当前的pageSize

New head

打开网易新闻 查看更多图片

  • NewHead 传入了wal对象和 HeadOptionsHeadOptions 包含了head_chunk 的root 目录,即data目录、 StripeSizedb.chunkPool

    • mmappedChunksDir 在data目录下创建 chunks_head 目录

    • openMMapFiles

    • MemPostings

    • make([]map[uint64]*memSeries, stripeSize)

    • make([]seriesHashmap, stripeSize)

    • make([]stripeLock, stripeSize)

    • newStripeSeries

    • NewUnorderedMemPostings 创建posting

    • h.minTime.Store(math.*MaxInt64*)h.maxTime.Store(math.*MinInt64*) 设置head的max、min 时间

    • NewChunkDiskMapper mmap head_chunk

db reload

  • reload reloads blocks and truncates the head and its WAL

    • truncateMemory 首先removes old data before mint from the head,主要是head_chunk

    • truncateWAL removes old data before mint from the WAL.

    • 调用 h.series.gc delete

    • h.postings.Delete delete posting

    • := h.chunkDiskMapper.Truncate(mint); Truncate the chunk m-mapper

    • initialize := h.MinTime() == math.*MaxInt64* 来判断是否是初始化的head,如果是就不用truncate

    • 调用 h.gc() 进行delete

    • wal.Segments(h.wal.Dir()) 获取wal 所有文件

    • 根据要删除的index h.wal.Truncate(last + 1) 执行truncate

    • 首先通过 blockDirs 加载目录

    • deletableULIDs := db.blocksToDelete(loadable)check 初加载的blocks,判断哪些block 可删除

    • 基于初加载的blocks和可删除的blocks,确认最终加载的blocks。并赋值给db.blocks db.blocks = toLoad

    • db.deleteBlocks(deletable) delete 废弃的blocks

    • 通过 readMetaFile 读取元文件

    • 如果这个block 未打开,通过 OpenBlock 打开该block

    • openBlocks 加载blocks目录中 blocks,主要是其meta文件

    • Truncate removes old data before mint from the head and WAL