prometheus 创建db

openDBWithMetrics参数dir 是data路径,默认是data目录,也可在cfg.localStoragePath指定。open调用os.MkdirAll创建数据目录open执行walDir := filepath.Join(dir, "wal")生成wal目录MigrateWALMigrate old WAL if one exists, 暂不清楚什么情况会migrate&DBdir 赋值给db,并创建dbwal.NewSize创建wal,这里指定了wal目录和segmentSize,默认是*DefaultSegmentSize* = 128 * 1024 * 1024 // 128 MB。创建成功返回wlogNewHead创建head,这里传入前面生成的wlogdb.reload()reload reloads blocks and truncates the head and its WALdb.Blocks()获取了磁盘上的blocks,并通过blocks[len(blocks)-1].Meta().MaxTime指定了minValidTimedb.head.Init(minValidTime)使用上一步的minValidTime来初始化head最后启动db
go db.run()并返回db对象。
New Wal

NewSize传入了wal dir 和segmentSizelistSegments执行具体findSegments文件操作,并将文件名排序check
segmentSize%*pageSize* != 0,pageSize是32kbos.MkdirAll创建wal dirSegments根据传入的wal dir 获取其中的SegmentswriteSegmentIndex = last + 1确定最新的SegmentIndexCreateSegment(w.Dir(), writeSegmentIndex)根据wal dir 和最新的SegmentIndex,新建segment文件w.setSegment(segment)将segment赋值给wal,w.donePages = int(stat.Size() / *pageSize*)初始化了当前的pageSize
New head

NewHead传入了wal对象和HeadOptions,HeadOptions包含了head_chunk 的root 目录,即data目录、StripeSize、db.chunkPoolmmappedChunksDir在data目录下创建chunks_head目录openMMapFilesMemPostingsmake([]map[uint64]*memSeries, stripeSize)make([]seriesHashmap, stripeSize)make([]stripeLock, stripeSize)newStripeSeriesNewUnorderedMemPostings创建postingh.minTime.Store(math.*MaxInt64*)、h.maxTime.Store(math.*MinInt64*)设置head的max、min 时间NewChunkDiskMappermmap head_chunk
db reload

reloadreloads blocks and truncates the head and its WALtruncateMemory首先removes old data before mint from the head,主要是head_chunktruncateWALremoves old data before mint from the WAL.调用
h.series.gcdeleteh.postings.Deletedelete posting:= h.chunkDiskMapper.Truncate(mint);Truncate the chunk m-mapperinitialize := h.MinTime() == math.*MaxInt64* 来判断是否是初始化的head,如果是就不用truncate调用
h.gc()进行deletewal.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 = toLoaddb.deleteBlocks(deletable)delete 废弃的blocks通过
readMetaFile读取元文件如果这个block 未打开,通过
OpenBlock打开该blockopenBlocks加载blocks目录中 blocks,主要是其meta文件Truncateremoves old data before mint from the head and WAL
本文详细介绍了Prometheus数据库的初始化过程,包括创建数据目录、WAL(Write-Ahead Log)、Head的构建以及内存管理和磁盘块的加载与修剪。主要涉及的数据结构有wal.NewSize、newHead以及内存映射的chunk管理。同时,文章还阐述了如何根据最小有效时间初始化Head,并在运行时进行数据加载与修剪,确保数据的有效性和存储效率。

被折叠的 条评论
为什么被折叠?



