网易首页 > 网易号 > 正文 申请入驻

Prometheus时序数据库-磁盘中的存储结构

0
分享至

本文转载自解bug之路 作者alchemystarlzy

前言

之前的文章里,笔者详细描述了监控数据在Prometheus内存中的结构。而其在磁盘中的存储结构,也是非常有意思的,关于这部分内容,将在本篇文章进行阐述。

磁盘目录结构

首先我们来看Prometheus运行后,所形成的文件目录结构

在笔者自己的机器上的具体结构如下:

prometheus-data |-01EY0EH5JA3ABCB0PXHAPP999D (block) |-01EY0EH5JA3QCQB0PXHAPP999D (block) |-chunks |-000001 |-000002 ..... |-000021 |-index |-meta.json |-tombstones |-wal |-chunks_head

Block

一个Block就是一个独立的小型数据库,其保存了一段时间内所有查询所用到的信息。包括标签/索引/符号表数据等等。Block的实质就是将一段时间里的内存数据组织成文件形式保存下来。

最近的Block一般是存储了2小时的数据,而较为久远的Block则会通过compactor进行合并,一个Block可能存储了若干小时的信息。值得注意的是,合并操作只是减少了索引的大小(尤其是符号表的合并),而本身数据(chunks)的大小并没有任何改变。

meta.json

我们可以通过检查meta.json来得到当前Block的一些元信息。

{ "ulid":"01EY0EH5JA3QCQB0PXHAPP999D" // maxTime-minTime = 7200s => 2 h "minTime": 1611664000000 "maxTime": 1611671200000 "stats": { "numSamples": 1505855631, "numSeries": 12063563, "numChunks": 12063563 } "compaction":{ "level" : 1 "sources: [ "01EY0EH5JA3QCQB0PXHAPP999D" ] } "version":1}

其中的元信息非常清楚明了。这个Block记录了2个小时的数据。

让我们再找一个比较陈旧的Block看下它的meta.json.

"ulid":"01EXTEH5JA3QCQB0PXHAPP999D", // maxTime - maxTime =>162h "minTime":1610964800000, "maxTime":1611548000000 ...... "compaction":{ "level": 5, "sources: [ 31个01EX...... ] }, "parents: [ { "ulid": 01EXTEH5JA3QCQB1PXHAPP999D ... } { "ulid": 01EXTEH6JA3QCQB1PXHAPP999D ... } { "ulid": 01EXTEH5JA31CQB1PXHAPP999D ... } ]

从中我们可以看到,该Block是由31个原始Block经历5次压缩而来。最后一次压缩的三个Block ulid记录在parents中。如下图所示:

Chunks结构

CUT文件切分

所有的Chunk文件在磁盘上都不会大于512M,对应的源码为:

func (w *Writer) WriteChunks(chks ...Meta) error { ...... for i, chk := range chks { cutNewBatch := (i != 0) && (batchSize+SegmentHeaderSize > w.segmentSize) ...... if cutNewBatch { ...... } ...... }}

当写入磁盘单个文件超过512M的时候,就会自动切分一个新的文件。

一个Chunks文件包含了非常多的内存Chunk结构,如下图所示:

图中也标出了,我们是怎么寻找对应Chunk的。通过将文件名(000001,前32位)以及(offset,后32位)编码到一个int类型的refId中,使得我们可以轻松的通过这个id获取到对应的chunk数据。

chunks文件通过mmap去访问

由于chunks文件大小基本固定(最大512M),所以我们很容易的可以通过mmap去访问对应的数据。直接将对应文件的读操作交给操作系统,既省心又省力。对应代码为:

func NewDirReader(dir string, pool chunkenc.Pool) (*Reader, error) { ...... for _, fn := range files { f, err := fileutil.OpenMmapFile(fn) ...... } ...... bs = append(bs, realByteSlice(f.Bytes()))}通过sgmBytes := s.bs[offset]就直接能获取对应的数据

index索引结构

前面介绍完chunk文件,我们就可以开始阐述最复杂的索引结构了。

寻址过程

索引就是为了让我们快速的找到想要的内容,为了便于理解。笔者就通过一次数据的寻址来探究Prometheus的磁盘索引结构。考虑查询一个

拥有系列三个标签({__name__:http_requests}{job:api-server}{instance:0})且时间为start/end的所有序列数据

我们先从选择Block开始,遍历所有Block的meta.json,找到具体的Block

前文说了,通过Labels找数据是通过倒排索引。我们的倒排索引是保存在index文件里面的。那么怎么在这个单一文件里找到倒排索引的位置呢?这就引入了TOC(Table Of Content)

TOC(Table Of Content)

func NewTOCFromByteSlice(bs ByteSlice) (*TOC, error) { ...... // indexTOCLen = 6*8+4 = 52 b := bs.Range(bs.Len()-indexTOCLen, bs.Len()) ...... return &TOC{ Symbols: d.Be64(), Series: d.Be64(), LabelIndices: d.Be64(), LabelIndicesTable: d.Be64(), Postings: d.Be64(), PostingsTable: d.Be64(), }, nil}

Posting offset table 以及 Posting倒排索引

首先我们访问的是Posting offset table。由于倒排索引按照不同的LabelPair(key/value)会有非常多的条目。所以Posing offset table就是决定到底访问哪一条Posting索引。offset就是指的这一Posting条目在文件中的偏移。

Series

我们通过三条Postings倒排索引索引取交集得出

{series1,Series2,Series3,Series4}∩{series1,Series2,Series3}∩{Series2,Series3}={Series2,Series3}

也就是要读取Series2和Serie3中的数据,而Posting中的Ref(Series2)和Ref(Series3)即为这两Series在index文件中的偏移。

Series以Delta的形式记录了chunkId以及该chunk包含的时间范围。这样就可以很容易过滤出我们需要的chunk,然后再按照chunk文件的访问,即可找到最终的原始数据。

SymbolTable

值得注意的是,为了尽量减少我们文件的大小,对于Label的Name和Value这些有限的数据,我们会按照字母序存在符号表中。由于是有序的,所以我们可以直接将符号表认为是一个
[]string切片。然后通过切片的下标去获取对应的sting。考虑如下符号表:

读取index文件时候,会将SymbolTable全部加载到内存中,并组织成symbols []string这样的切片形式,这样一个Series中的所有标签值即可通过切片下标访问得到。

Label Index以及Label Table

事实上,前面的介绍已经将一个普通数据寻址的过程全部讲完了。但是index文件中还包含label索引以及label Table,这两个是用来记录一个Label下面所有可能的值而存在的。
这样,在正则的时候就可以非常容易的找到我们需要哪些LabelPair。详情可以见前篇。

事实上,真正的Label Index比图中要复杂一点。它设计成一条LabelIndex可以表示(多个标签组合)的所有数据。不过在Prometheus代码中只会采用存储一个标签对应所有值的形式。

完整的index文件结构

这里直接给出完整的index文件结构,摘自Prometheus中index.md文档。

┌────────────────────────────┬─────────────────────┐│ magic(0xBAAAD700) <4b> │ version(1) <1 byte> │├────────────────────────────┴─────────────────────┤│ ┌──────────────────────────────────────────────┐ ││ │ Symbol Table │ ││ ├──────────────────────────────────────────────┤ ││ │ Series │ ││ ├──────────────────────────────────────────────┤ ││ │ Label Index 1 │ ││ ├──────────────────────────────────────────────┤ ││ │ ... │ ││ ├──────────────────────────────────────────────┤ ││ │ Label Index N │ ││ ├──────────────────────────────────────────────┤ ││ │ Postings 1 │ ││ ├──────────────────────────────────────────────┤ ││ │ ... │ ││ ├──────────────────────────────────────────────┤ ││ │ Postings N │ ││ ├──────────────────────────────────────────────┤ ││ │ Label Index Table │ ││ ├──────────────────────────────────────────────┤ ││ │ Postings Table │ ││ ├──────────────────────────────────────────────┤ ││ │ TOC │ ││ └──────────────────────────────────────────────┘ │└──────────────────────────────────────────────────┘

tombstones

由于Prometheus Block的数据一般在写完后就不会变动。如果要删除部分数据,就只能记录一下删除数据的范围,由下一次compactor组成新block的时候删除。而记录这些信息的文件即是tomstones。

Prometheus入门书籍推荐

总结

Prometheus作为时序数据库,设计了各种文件结构来保存海量的监控数据,同时还兼顾了性能。只有彻底了解其存储结构,才能更好的指导我们应用它!

欢迎大家关注我公众号,里面有各种干货,还有大礼包相送哦!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
都体:国米在协商贝尔托拉的转会,斯佩齐亚为他提供了续约合同

都体:国米在协商贝尔托拉的转会,斯佩齐亚为他提供了续约合同

直播吧
2024-11-30 07:43:13
内蒙男子发现妻子出轨,在卧室装7个摄像头,看清情夫后让他崩溃

内蒙男子发现妻子出轨,在卧室装7个摄像头,看清情夫后让他崩溃

天字号野史
2024-11-23 22:29:23
央视都在夸!看了《我是刑警》43岁马苏的哭戏,才懂什么叫演员

央视都在夸!看了《我是刑警》43岁马苏的哭戏,才懂什么叫演员

娱乐的小灶
2024-11-30 08:42:44
15次射门打入9球,阿尔瓦雷斯在马竞的得分效率十分惊人。

15次射门打入9球,阿尔瓦雷斯在马竞的得分效率十分惊人。

星耀国际足坛
2024-11-30 01:40:03
中国发出警告:要么5000亿回购,要么专利权别想要了

中国发出警告:要么5000亿回购,要么专利权别想要了

看世界的人
2024-11-27 22:52:29
十几个身材火爆的美女被一次性扎带反绑双手,然后被要求蹲在地上

十几个身材火爆的美女被一次性扎带反绑双手,然后被要求蹲在地上

张晓磊
2024-11-29 07:48:41
奉劝美国别再装!卑鄙耍手段,氛围不合适,防长会唔免谈没商量

奉劝美国别再装!卑鄙耍手段,氛围不合适,防长会唔免谈没商量

柳扶风
2024-11-30 08:49:41
画家方力钧:作画“丑化”袁隆平,画自己家人却很正常,引发众怒

画家方力钧:作画“丑化”袁隆平,画自己家人却很正常,引发众怒

通文知史
2024-11-21 11:20:03
含有剧毒的植物,却养活了8亿人口,至今仍出现在我们的餐桌上

含有剧毒的植物,却养活了8亿人口,至今仍出现在我们的餐桌上

八斗小先生
2024-11-30 09:17:23
美国企业疯狂囤货,关税大棒意外成就“中国超级促销”

美国企业疯狂囤货,关税大棒意外成就“中国超级促销”

每日经济新闻
2024-11-29 19:27:52
姆巴佩正处于抑郁阶段,压垮他的最后一棵稻草,其实正是皇马

姆巴佩正处于抑郁阶段,压垮他的最后一棵稻草,其实正是皇马

老乐说球
2024-11-30 09:38:17
男子错买1.4万余元机票 退票仅退4992元

男子错买1.4万余元机票 退票仅退4992元

鲁中晨报
2024-11-29 12:20:21
赵本山儿子赵大牛12万巴黎世家棉袄穿出30块地摊货感,网友:绝了

赵本山儿子赵大牛12万巴黎世家棉袄穿出30块地摊货感,网友:绝了

娱不咸
2024-10-31 20:20:02
百万网红谢欣桐被曝出轨,聊天记录不堪入目,温柔乖乖女人设崩塌

百万网红谢欣桐被曝出轨,聊天记录不堪入目,温柔乖乖女人设崩塌

南城无双
2024-11-27 11:16:56
百岁老人林佳楣,她是原国家主席李先念的夫人,身体依旧硬朗

百岁老人林佳楣,她是原国家主席李先念的夫人,身体依旧硬朗

大江
2024-11-27 18:28:13
中国第4艘航母下水将近,公开招标!用这个省命名的可能性最大

中国第4艘航母下水将近,公开招标!用这个省命名的可能性最大

青辉
2024-11-29 17:13:36
约炮用力过猛,女子当场死亡,男子被判两年

约炮用力过猛,女子当场死亡,男子被判两年

书画艺术收藏
2024-11-18 20:00:02
如果中美脱钩,美国把在中国资产全撤走,中国买的美债还能兑现吗

如果中美脱钩,美国把在中国资产全撤走,中国买的美债还能兑现吗

橘色数码
2024-11-28 09:04:29
津媒:中国足球迎来后备力量井喷式爆发,三支国少队伍潜力巨大

津媒:中国足球迎来后备力量井喷式爆发,三支国少队伍潜力巨大

直播吧
2024-11-29 08:26:27
冯绍峰恋情曝光女友被扒,曝海量生活照,和赵丽颖完全是两种类型

冯绍峰恋情曝光女友被扒,曝海量生活照,和赵丽颖完全是两种类型

缘浅娱深
2024-11-28 15:04:34
2024-11-30 10:00:49
杨建荣的数据库笔记
杨建荣的数据库笔记
专注于数据库和开源技术
430文章数 1862关注度
往期回顾 全部

科技要闻

"AGI不是大杀器,是普通人每天在用的产品"

头条要闻

上海一业主将价值20万自行车放楼道 结果车"消失"了

头条要闻

上海一业主将价值20万自行车放楼道 结果车"消失"了

体育要闻

穆雷与德约科维奇能凑成王炸组合吗?

娱乐要闻

叶珂被曝独自去产检,他俩真分了吗

财经要闻

雪松爆雷前实控人张劲在香港抛售房产

汽车要闻

问界M7今年累计交付量已突破18万辆

态度原创

时尚
房产
亲子
家居
艺术

直播|| 今年冬天只想背这个包!

房产要闻

大量甩地!114亿,4790亩!海南土地市场全面爆发!

亲子要闻

娃不稳,鸡也鸡不出来

家居要闻

现代设计感 温馨两居室

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

无障碍浏览 进入关怀版