prometheus/tsdb压缩流程
tsdb/compact.go
populateBlock
1、 indexr,chunkr,tombsr读blocks信息到内存
2、写symbol到index
for sumbols.Next()indexw.AddSymbols()//读所有symbol信息,并写入index文件。经过此步骤,当前index文件中暂时只有symbols信息。
结合tsdb官方的index 格式进行理解,https://ganeshvernekar.com/blog/prometheus-tsdb-persistent-block-and-its-index/
经过此步,填充了 len+#symbols ,暂时写为“alenblen"刚好8字节。len...str是add的symbol.
3、for set.Next() //处理所有chunk数据。
chunkw.WriteChunks(chks...)//把未压缩的chunk block数据开始落盘
indexw.AddSeries()//tsdb/index/index.go
-- finishSymbols() // tsdb/index/index.go
func (w *Writer) finishSymbols() error {// Write out the length and symbol count.w.buf1.Reset()w.buf1.PutBE32int(int(w.f.pos - w.toc.Symbols - 4))fmt.Println("w.numSymbols:",w.numSymbols,w.toc.Symbols,w.toc.Series,w.f.pos,w.f.pos - w.toc.Symbols - 4)fmt.Println("w.toc.Symbols:",w.toc.Symbols)fmt.Println("w.toc.Series:",w.toc.Series)w.buf1.PutBE32int(int(w.numSymbols))if err := w.writeAt(w.buf1.Get(), w.toc.Symbols); err != nil {return err}
finishSymbols的作用:填充并补齐symbol table在2中未处理的字段。
其中symle table未填充的内容为:
在进入到finishSymbol前,len... str_n的内容已经进行了写入和填充。进入finishsymbol后,需要填充len,symbol,crc.
其中,w.buf1.PutBE32int(int(w.f.pos - w.toc.Symbols - 4))中,
w.f.pos表示index当前写入位置,第一次处理时,就表示index当前文件大小。
w.toc.Symbols表示symbol的占位,上图的index整体布局中,w.toc.Symbols排在magic,version后面,刚好是5位,所以w.toc.Symbols=5
4表示symbol table的crc32预留位。
所以,经过w.f.pos - w.toc.Symbols - 4,就是当前symbol的string长度。此结果按照4byte,放在len<4b> 位置。如果当前symbol超过,下面再处理crc32时,会报错“errors: populate block: add series: read symbols: invalid checksum; read symbols: invalid checksum”
其他字段填充,可以对照symbol table的格式进行对比理解。
prometheus/tsdb压缩流程相关推荐
- Prometheus TSDB
TSDB 概述: Head: 数据库的内存部分 Block: 磁盘上持久块,是不变的 WAL: 预写日志系统 M-map: 磁盘及内存映射 粉红色框是传入的样品,样品先进入Head中存留一会,然后到磁 ...
- Prometheus TSDB存储原理
Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...
- Prometheus TSDB (Part 3): Memory Mapping of Head Chunks from Disk
Prometheus TSDB (Part 3): Memory Mapping of Head Chunks from Disk 本文译自Ganesh Vernekar 的 prometheus-t ...
- 详解LZ77字典编码压缩和解压缩流程(典型的压缩算法)
字典编码本质上是将在字典中出现过的字符串使用一个索引值代替,以此来达到压缩目的.基于字典的压缩算法有很多,LZ77和LZ78是最原始的两个算法,后者是前者的变体,原理基本上相似.本文对LZ77字典编码 ...
- prometheus数据结构和压缩原理讲解
Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概花了200多G(引用官方PPT). 接下来让我们看看他 ...
- Prometheus 学习之——本地存储 TSDB
Prometheus 学习之--本地存储 TSDB 文章目录 Prometheus 学习之--本地存储 TSDB 前言 一.TSDB 核心概念 二.详细介绍 1.block 1)chunks 2)in ...
- 【大数据运维监控】Prometheus水平扩展Cortex的架构分析
Cortex由Weaveworks创建,是一个开放源码的时间序列数据库和监视系统,用于应用程序和微服务.基于Prometheus,Cortex增加了水平缩放和几乎无限的数据保留. Cortex的架构图 ...
- 普罗米修斯?古希腊泰坦之神?异形?不,新一代企业级监控组件—Prometheus
文章目录 Prometheus + Grafana 监控效果图 一.Prometheus 简介 Prometheus成长历程 Prometheus诞生背景 云时代的到来 Prometheus 监控特点 ...
- Prometheus入门教程
目录 1.简介 2.主要功能 3.Prometheus的架构及核心组件 4.安装和配置 5.相关概念 5.1.数据模型(时间序列) 5.2.metric类型 Counter(计数器) Gauge(测量 ...
最新文章
- 用js方法做提交表单的校验
- mac mysql编码修改_mac 下修改mysql数据库的编码格式
- 经典教材《模式识别和机器学习》官方免费下载!
- python列表根据值找索引_python实现列表中由数值查到索引的方法
- cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果
- 键盘录入学生信息,保存到集合中
- postman返回值设置为全局变量
- 有效的Java –所有对象通用的方法
- Codeforces 55D Beautiful numbers (数位DP)
- Pyhton-Web框架之【Django】
- IBM的ITIL管理解决方案
- linux 扫描媒体库,如何扫描出Android系统媒体库中视频文件
- oracle 退出循环 使变量清空,[转]Oracle 清除incident和trace -- ADRCI用法
- iOS -- SKPhysicsJointSpring类
- 手机QQ空间装逼代码收集
- JavaScript网页打印国际象棋棋盘
- EdgeBox_EHub_tx1_tx2_E100 系统网络调试链接说明
- VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
- MFC如何设置背景图片
- 机器学习中的概率模型