prometheus存储

本地存储

核心概念

  • 采用TSDB本地存储,核心为block和wal. 最新版本每秒可以接收1000w样本更新.

相关参数

  • –storage.tsdb.retention 默认本地存储为15d(每天生成一个目录,data下,一共15个);如果将存储时间设置为4h,那么最多可以查询到11h数据(见下图3.6),这是因为这个时间不包括head block(3h)和最新生成的block(2h);5h也是最多可以查到11h数据 T-3h-2h-5h/4h = T-10h/9h;那么为什么上面每个block都是2h,没有发生压缩呢,这是因为默认情况下,block大小为–storage.tsdb.retention的十分之一,因此2h算大块不压缩
  • –storage.tsdb.path 调整时序数据的存储路径;wal也会存在于该目录
    prometheus存储_第1张图片

估算所占存储空间

  • 存储空间=每个指标大小(1~2Bytes)采集周期×storage.tsdb.retention

block

  • 目录结构

      [root@shzj-o-docker-12-2 data]# tree 01DB5QAD1P5WBBRPEJAABZERFX
      01DB5QAD1P5WBBRPEJAABZERFX
      ├── chunks      # 保存压缩后的时序数据,每个chunks大小为512M,超过会生成新的chunks
      │   ├── 000001
      │   └── 000002
      ├── index       # chunks中的偏移位置
      ├── meta.json   #  记录block块元信息,比如 样本的起始时间、chunks数量和数据量大小等
      └── tombstones  # 数据进行软删除,因为TSDB删除数据会删除整个目录;可以用来删除一部分数据
    
  • 存储数据量

  1. TSDB将存储的监控数据按照时间分成多个block存储,默认最小的block保存时间为2h(2h的block会合并成大block,之前block被删除)线上看到压缩三次,source有9个block,那么2*9=18小时
  2. TSDB还会将小块合并成大块,减少内存中block的数量,便于索引查找数据(线上观察下来,每一个block目录都经过三次合并,18小时数据)

head block

  1. head block中的数据是被存储在内存中的并且可以被任意修改;
  2. head block和后续的block初始设定保存2h数据,当head block超过3h时,会被拆分为2h+1h,2h block会变成只读块写入磁盘.(观察下来,每次压缩合并小块时间都比块内部时间多三个小时,为head block)
    prometheus存储_第2张图片

wal 防止数据丢失(数据收集上来暂时是存放在内存中,wal记录了这些信息)

  • 目录结构
  1. wal/ wal写入的单位是页,大小为32KB;如果wal一次性写入的页数超过一个段的空闲页数,那么会新写入一个段

     wal/
     ├── 00001529   每个数据段大小为128M
     ├── 00001530
     ├── 00001531
     ├── 00001532
     ├── 00001533
     ├── 00001534
     ├── 00001535
     ├── 00001536
     ├── 00001537
     ├── 00001538
     ├── 00001539
     ├── 00001540
     ├── 00001541
     └── checkpoint.001528
     	├── 00000000
     	└── 00000001
    
  • 数据流向
    prometheus将周期性采集到的数据通过Add接口添加到head block,但是这些数据暂时没有持久化,TSDB通过WAL将数据保存到磁盘上(个人理解此处是内存中数据,并不是真正压缩后数据),当出现宕机,启动多协程读取WAL,恢复数据.
远端存储

你可能感兴趣的:(#,prometheus)