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压缩流程相关推荐

  1. Prometheus TSDB

    TSDB 概述: Head: 数据库的内存部分 Block: 磁盘上持久块,是不变的 WAL: 预写日志系统 M-map: 磁盘及内存映射 粉红色框是传入的样品,样品先进入Head中存留一会,然后到磁 ...

  2. Prometheus TSDB存储原理

    Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...

  3. 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 ...

  4. 详解LZ77字典编码压缩和解压缩流程(典型的压缩算法)

    字典编码本质上是将在字典中出现过的字符串使用一个索引值代替,以此来达到压缩目的.基于字典的压缩算法有很多,LZ77和LZ78是最原始的两个算法,后者是前者的变体,原理基本上相似.本文对LZ77字典编码 ...

  5. prometheus数据结构和压缩原理讲解

    Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概花了200多G(引用官方PPT). 接下来让我们看看他 ...

  6. Prometheus 学习之——本地存储 TSDB

    Prometheus 学习之--本地存储 TSDB 文章目录 Prometheus 学习之--本地存储 TSDB 前言 一.TSDB 核心概念 二.详细介绍 1.block 1)chunks 2)in ...

  7. 【大数据运维监控】Prometheus水平扩展Cortex的架构分析

    Cortex由Weaveworks创建,是一个开放源码的时间序列数据库和监视系统,用于应用程序和微服务.基于Prometheus,Cortex增加了水平缩放和几乎无限的数据保留. Cortex的架构图 ...

  8. 普罗米修斯?古希腊泰坦之神?异形?不,新一代企业级监控组件—Prometheus

    文章目录 Prometheus + Grafana 监控效果图 一.Prometheus 简介 Prometheus成长历程 Prometheus诞生背景 云时代的到来 Prometheus 监控特点 ...

  9. Prometheus入门教程

    目录 1.简介 2.主要功能 3.Prometheus的架构及核心组件 4.安装和配置 5.相关概念 5.1.数据模型(时间序列) 5.2.metric类型 Counter(计数器) Gauge(测量 ...

最新文章

  1. 用js方法做提交表单的校验
  2. mac mysql编码修改_mac 下修改mysql数据库的编码格式
  3. 经典教材《模式识别和机器学习》官方免费下载!
  4. python列表根据值找索引_python实现列表中由数值查到索引的方法
  5. cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果
  6. 键盘录入学生信息,保存到集合中
  7. postman返回值设置为全局变量
  8. 有效的Java –所有对象通用的方法
  9. Codeforces 55D Beautiful numbers (数位DP)
  10. Pyhton-Web框架之【Django】
  11. IBM的ITIL管理解决方案
  12. linux 扫描媒体库,如何扫描出Android系统媒体库中视频文件
  13. oracle 退出循环 使变量清空,[转]Oracle 清除incident和trace -- ADRCI用法
  14. iOS -- SKPhysicsJointSpring类
  15. 手机QQ空间装逼代码收集
  16. JavaScript网页打印国际象棋棋盘
  17. EdgeBox_EHub_tx1_tx2_E100 系统网络调试链接说明
  18. VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
  19. MFC如何设置背景图片
  20. 机器学习中的概率模型

热门文章

  1. python Pip安装卸载,命令 常用选项
  2. 计算机管理物流应用专业,物流管理专业是做什么的
  3. 亚马逊echo中国使用_如何在您的Amazon Echo上收听播客
  4. tomcat+jsp IDEA 在线人脸识别 寻找系统 基于openCV
  5. 手机app兼容性测试点分析(通用)
  6. 【程序员面试金典】 01.09. 字符串轮转
  7. 最新JS正则匹配大全(工具类:不断更新)
  8. 在Word中如何删除顽固的空白页
  9. H3C 路由优先级,数值越小表明优先级越高
  10. Kotlin高仿微信-第23篇-个人信息-二维码名片