精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Prometheus時序數據庫-磁盤中的存儲結構

存儲 存儲軟件
Prometheus作為時序數據庫,設計了各種文件結構來保存海量的監控數據,同時還兼顧了性能。只有徹底了解其存儲結構,才能更好的指導我們應用它!

[[384167]]

前言

之前的文章里,筆者詳細描述了監控數據在Prometheus內存中的結構。而其在磁盤中的存儲結構,也是非常有意思的,關于這部分內容,將在本篇文章進行闡述。

磁盤目錄結構

首先我們來看Prometheus運行后,所形成的文件目錄結構

 

在筆者自己的機器上的具體結構如下:

  1. prometheus-data 
  2.     |-01EY0EH5JA3ABCB0PXHAPP999D (block) 
  3.     |-01EY0EH5JA3QCQB0PXHAPP999D (block) 
  4.         |-chunks 
  5.             |-000001 
  6.             |-000002 
  7.             ..... 
  8.             |-000021 
  9.         |-index 
  10.         |-meta.json 
  11.         |-tombstones 
  12.     |-wal 
  13.     |-chunks_head 

Block

一個Block就是一個獨立的小型數據庫,其保存了一段時間內所有查詢所用到的信息。包括標簽/索引/符號表數據等等。Block的實質就是將一段時間里的內存數據組織成文件形式保存下來。

 

最近的Block一般是存儲了2小時的數據,而較為久遠的Block則會通過compactor進行合并,一個Block可能存儲了若干小時的信息。值得注意的是,合并操作只是減少了索引的大小(尤其是符號表的合并),而本身數據(chunks)的大小并沒有任何改變。

meta.json

我們可以通過檢查meta.json來得到當前Block的一些元信息。

  1.     "ulid":"01EY0EH5JA3QCQB0PXHAPP999D" 
  2.     // maxTime-minTime = 7200s => 2 h 
  3.     "minTime": 1611664000000 
  4.     "maxTime": 1611671200000 
  5.     "stats": { 
  6.         "numSamples": 1505855631, 
  7.         "numSeries": 12063563, 
  8.         "numChunks": 12063563 
  9.     } 
  10.     "compaction":{ 
  11.         "level" : 1 
  12.         "sources: [ 
  13.             "01EY0EH5JA3QCQB0PXHAPP999D" 
  14.         ] 
  15.     } 
  16.     "version":1 

其中的元信息非常清楚明了。這個Block記錄了2個小時的數據。

 

讓我們再找一個比較陳舊的Block看下它的meta.json.

  1. "ulid":"01EXTEH5JA3QCQB0PXHAPP999D"
  2.  // maxTime - maxTime =>162h 
  3.  "minTime":1610964800000, 
  4.  "maxTime":1611548000000 
  5.  ...... 
  6.  "compaction":{ 
  7.      "level": 5, 
  8.      "sources: [ 
  9.          31個01EX...... 
  10.      ] 
  11.  }, 
  12.  "parents: [ 
  13.      {     
  14.          "ulid": 01EXTEH5JA3QCQB1PXHAPP999D 
  15.          ... 
  16.      } 
  17.      {     
  18.          "ulid": 01EXTEH6JA3QCQB1PXHAPP999D 
  19.          ... 
  20.      } 
  21.              {     
  22.          "ulid": 01EXTEH5JA31CQB1PXHAPP999D 
  23.          ... 
  24.      } 
  25.  ] 

從中我們可以看到,該Block是由31個原始Block經歷5次壓縮而來。最后一次壓縮的三個Block ulid記錄在parents中。如下圖所示:

 

Chunks結構

CUT文件切分

所有的Chunk文件在磁盤上都不會大于512M,對應的源碼為:

  1. func (w *Writer) WriteChunks(chks ...Meta) error { 
  2.     ...... 
  3.     for i, chk := range chks { 
  4.         cutNewBatch := (i != 0) && (batchSize+SegmentHeaderSize > w.segmentSize) 
  5.         ...... 
  6.         if cutNewBatch { 
  7.             ...... 
  8.         } 
  9.         ...... 
  10.     } 

當寫入磁盤單個文件超過512M的時候,就會自動切分一個新的文件。

一個Chunks文件包含了非常多的內存Chunk結構,如下圖所示:

 

圖中也標出了,我們是怎么尋找對應Chunk的。通過將文件名(000001,前32位)以及(offset,后32位)編碼到一個int類型的refId中,使得我們可以輕松的通過這個id獲取到對應的chunk數據。

chunks文件通過mmap去訪問

由于chunks文件大小基本固定(最大512M),所以我們很容易的可以通過mmap去訪問對應的數據。直接將對應文件的讀操作交給操作系統,既省心又省力。對應代碼為:

  1. func NewDirReader(dir string, pool chunkenc.Pool) (*Reader, error) { 
  2.     ...... 
  3.     for _, fn := range files { 
  4.         f, err := fileutil.OpenMmapFile(fn) 
  5.         ...... 
  6.     } 
  7.     ...... 
  8.     bs = append(bs, realByteSlice(f.Bytes())) 
  9. 通過sgmBytes := s.bs[offset]就直接能獲取對應的數據 

 

index索引結構

前面介紹完chunk文件,我們就可以開始闡述最復雜的索引結構了。

尋址過程

索引就是為了讓我們快速的找到想要的內容,為了便于理解。筆者就通過一次數據的尋址來探究Prometheus的磁盤索引結構??紤]查詢一個

  1. 擁有系列三個標簽 
  2. ({__name__:http_requests}{job:api-server}{instance:0}) 
  3. 且時間為start/end的所有序列數據 

我們先從選擇Block開始,遍歷所有Block的meta.json,找到具體的Block

 

前文說了,通過Labels找數據是通過倒排索引。我們的倒排索引是保存在index文件里面的。那么怎么在這個單一文件里找到倒排索引的位置呢?這就引入了TOC(Table Of Content)

TOC(Table Of Content)

 

由于index文件一旦形成之后就不再會改變,所以Prometheus也依舊使用mmap來進行操作。采用mmap讀取TOC非常容易:

  1. func NewTOCFromByteSlice(bs ByteSlice) (*TOC, error) { 
  2.     ...... 
  3.     // indexTOCLen = 6*8+4 = 52 
  4.     b := bs.Range(bs.Len()-indexTOCLen, bs.Len()) 
  5.     ...... 
  6.     return &TOC{ 
  7.         Symbols:           d.Be64(), 
  8.         Series:            d.Be64(), 
  9.         LabelIndices:      d.Be64(), 
  10.         LabelIndicesTable: d.Be64(), 
  11.         Postings:          d.Be64(), 
  12.         PostingsTable:     d.Be64(), 
  13.     }, nil 

Posting offset table 以及 Posting倒排索引

首先我們訪問的是Posting offset table。由于倒排索引按照不同的LabelPair(key/value)會有非常多的條目。所以Posing offset table就是決定到底訪問哪一條Posting索引。offset就是指的這一Posting條目在文件中的偏移。

 

Series

我們通過三條Postings倒排索引索引取交集得出

  1. {series1,Series2,Series3,Series4} 
  2. ∩ 
  3. {series1,Series2,Series3} 
  4. ∩ 
  5. {Series2,Series3} 
  6. {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文檔。

  1. ┌────────────────────────────┬─────────────────────┐ 
  2. │ magic(0xBAAAD700) <4b>     │ version(1) <1 byte> │ 
  3. ├────────────────────────────┴─────────────────────┤ 
  4. │ ┌──────────────────────────────────────────────┐ │ 
  5. │ │                 Symbol Table                 │ │ 
  6. │ ├──────────────────────────────────────────────┤ │ 
  7. │ │                    Series                    │ │ 
  8. │ ├──────────────────────────────────────────────┤ │ 
  9. │ │                 Label Index 1                │ │ 
  10. │ ├──────────────────────────────────────────────┤ │ 
  11. │ │                      ...                     │ │ 
  12. │ ├──────────────────────────────────────────────┤ │ 
  13. │ │                 Label Index N                │ │ 
  14. │ ├──────────────────────────────────────────────┤ │ 
  15. │ │                   Postings 1                 │ │ 
  16. │ ├──────────────────────────────────────────────┤ │ 
  17. │ │                      ...                     │ │ 
  18. │ ├──────────────────────────────────────────────┤ │ 
  19. │ │                   Postings N                 │ │ 
  20. │ ├──────────────────────────────────────────────┤ │ 
  21. │ │               Label Index Table              │ │ 
  22. │ ├──────────────────────────────────────────────┤ │ 
  23. │ │                 Postings Table               │ │ 
  24. │ ├──────────────────────────────────────────────┤ │ 
  25. │ │                      TOC                     │ │ 
  26. │ └──────────────────────────────────────────────┘ │ 
  27. └──────────────────────────────────────────────────┘ 

tombstones

由于Prometheus Block的數據一般在寫完后就不會變動。如果要刪除部分數據,就只能記錄一下刪除數據的范圍,由下一次compactor組成新block的時候刪除。而記錄這些信息的文件即是tomstones。

 

總結

Prometheus作為時序數據庫,設計了各種文件結構來保存海量的監控數據,同時還兼顧了性能。只有徹底了解其存儲結構,才能更好的指導我們應用它!

本文轉載自微信公眾號「解Bug之路」,可以通過以下二維碼關注。轉載本文請聯系解Bug之路公眾號。  

 

責任編輯:武曉燕 來源: 解Bug之路
相關推薦

2021-02-22 10:37:47

存儲Prometheus

2021-03-15 10:10:29

數據庫數據查詢

2021-03-08 10:18:55

數據庫數據Prometheus

2017-11-20 11:37:19

時序數據數據存儲HBase

2022-07-06 15:41:55

數據庫

2022-09-23 07:44:48

時序數據庫物聯網

2021-09-26 10:08:33

TSDB時序數據庫壓縮解壓

2020-03-11 09:50:21

時序數據庫快速檢索

2022-07-11 10:45:12

數據庫分析

2022-07-11 11:12:32

數據分析

2022-12-18 19:38:31

時序數據庫數據庫

2018-04-16 08:44:51

InfluxDB TS時序數據庫存儲

2021-08-31 14:01:59

時序數據庫數據庫數據

2022-07-07 12:23:29

數據庫

2022-07-07 12:37:27

數據

2022-06-10 17:37:37

數據庫

2021-08-04 05:49:40

數據庫數時序數據庫技術

2017-09-05 14:45:14

時序數據數據庫大數據

2018-06-26 09:37:07

時序數據庫FacebookNoSQL

2019-05-30 08:31:39

數據庫QTSDB分布式
點贊
收藏

51CTO技術棧公眾號

99riav视频一区二区| 亚洲欧美日韩免费| 精品91在线| 亚洲精品自拍第一页| 天天操天天摸天天爽| 大片免费在线观看| 99免费精品视频| 国产精品一区二区3区| 国产又粗又猛又爽又黄的视频小说| 国产一区二区三区黄网站 | 欧美波霸videosex极品| 亚洲精品第一| 色综合久久综合网| 免费看啪啪网站| 日韩午夜影院| 国产精品77777| 国产精品大陆在线观看| 久久久久久久久久一区二区三区 | 国产一区二三区| 欧洲午夜精品久久久| 成人自拍小视频| 九九综合在线| 亚洲国产精品女人久久久| 国产精品一区二区小说| av剧情在线观看| 亚洲人一二三区| 神马影院午夜我不卡影院| www.av导航| 久草精品在线观看| 国产精品久久久| 在线观看免费国产视频| 亚洲欧美网站在线观看| 伊人精品在线观看| 国产熟女高潮一区二区三区 | 玖玖国产精品视频| 久久免费福利视频| 国产稀缺精品盗摄盗拍| 大色综合视频网站在线播放| 亚洲成人网在线| 91丨porny丨九色| 日韩国产91| 在线观看成人小视频| 三上悠亚久久精品| 黄色羞羞视频在线观看| 亚洲色图欧洲色图| 中文字幕欧美日韩一区二区三区| 超碰免费在线| 国产精品美女一区二区| 欧美一区观看| 国产女主播在线写真| 91久色porny| 久久精品国产综合精品| 天堂在线视频网站| 丰满放荡岳乱妇91ww| 99高清视频有精品视频| av中文字幕免费| 国产精品一区二区三区99| 国产精品爱啪在线线免费观看| 国产www在线| 久久男女视频| 国产精品久久av| 一二三区在线播放| 国产又粗又猛又爽又黄91精品| 成人av番号网| 亚洲AV无码乱码国产精品牛牛| 丁香另类激情小说| 国内一区在线| 国产午夜视频在线观看| 欧美国产精品中文字幕| 亚洲国产精品综合| 操你啦视频在线| 亚洲影视资源网| 奇米精品一区二区三区| 日韩av中字| 欧美日韩国产精选| 中文字幕55页| 欧美自拍一区| 亚洲一区二区福利| 极品色av影院| 亚洲小说欧美另类社区| 欧亚精品在线观看| 中文字幕一区二区久久人妻| 国产一区二区三区在线观看免费| 91中文精品字幕在线视频| 性色av蜜臀av| 久久免费看少妇高潮| 亚洲制服欧美久久| 蜜乳av一区| 色噜噜狠狠成人网p站| 五月激情婷婷在线| 97人人澡人人爽91综合色| 日韩成人av网址| 欧美性猛交xxxx乱大交少妇| 国产一区二区三区四区老人| 国产91精品久久久| 一本色道久久综合亚洲| 不卡的av在线播放| 亚洲免费在线精品一区| 黄色在线观看视频网站| 欧美视频一区二区在线观看| 精品人妻一区二区三区免费| 亚洲资源网你懂的| 欧美精品免费播放| 欧美特级黄色片| 国产精品白丝jk黑袜喷水| 欧美12av| 1024在线看片你懂得| 日本韩国欧美三级| www.四虎精品| 99久久亚洲精品蜜臀| 97国产精品人人爽人人做| 亚洲一级视频在线观看| 972aa.com艺术欧美| 中文字幕第50页| 国产精品高清乱码在线观看| 欧美一级日韩免费不卡| 一区二区三区在线观看免费视频| 在线成人www免费观看视频| 国产精品亚洲激情| 日韩欧美在线观看一区二区| 亚洲精品五月天| www.这里只有精品| 免费一区二区| 欧美一级高清免费| 人妻一区二区三区四区| 日韩毛片高清在线播放| 国产自偷自偷免费一区| 欧美wwwsss9999| 久久久久久久一区二区| 国产精品一区二区免费视频| 久久久久88色偷偷免费| 少妇人妻无码专区视频| 清纯唯美激情亚洲| 日韩中文字幕精品视频| 丰满人妻一区二区三区四区| 久久免费美女视频| 37pao成人国产永久免费视频| 国产精品x8x8一区二区| 欧美成人免费播放| 国产麻豆免费观看| 中文字幕日韩一区二区| 小泽玛利亚视频在线观看| 欧美日韩激情| 日韩av免费看| 欧美成熟毛茸茸| 色综合久久精品| 免费在线观看你懂的| 亚洲欧美bt| 欧美欧美一区二区| free欧美| 中国china体内裑精亚洲片| 亚洲高清在线看| 国产精品网曝门| 最新天堂在线视频| 亚洲激情久久| 91九色对白| hd国产人妖ts另类视频| 亚洲国模精品私拍| 偷偷操不一样的久久| 91片在线免费观看| 免费观看精品视频| 精品国产91| 成人精品视频99在线观看免费| 免费在线观看黄| 日韩一级欧美一级| 中文字幕亚洲精品在线| 久久综合一区二区| 在线免费av播放| 91精品二区| 国产嫩草一区二区三区在线观看| 理论不卡电影大全神| 亚洲欧美国产va在线影院| 免费在线不卡av| 亚洲男人的天堂在线aⅴ视频| 中文字幕1区2区| 国产手机视频一区二区| 日本黑人久久| 国产精选久久| 8090成年在线看片午夜| 高清av在线| 欧美成人一区二区三区| 欧美精品二区三区| 国产精品三级电影| 四虎精品一区二区| 日韩国产精品大片| 国产精品国三级国产av| 窝窝社区一区二区| 国产一区欧美二区三区| 暖暖在线中文免费日本| 亚洲视频第一页| 999免费视频| 色综合久久中文综合久久97| 三级黄色免费观看| 99精品久久99久久久久| 一级黄色特级片| 夜久久久久久| 法国空姐在线观看免费| 久久久伦理片| 91久久久在线| 日韩a**中文字幕| 久久久久久久久久国产精品| av在线播放网站| 亚洲成人a**站| 国产免费福利视频| 91久久精品日日躁夜夜躁欧美| 久草免费新视频| 中文乱码免费一区二区| 美女黄色一级视频| 国精产品一区一区三区mba视频| 精品少妇一区二区三区在线| 性欧美69xoxoxoxo| 日韩精品另类天天更新| 精品欧美午夜寂寞影院| 成人网在线观看| 欧美韩国亚洲| 欧美亚洲成人网| 激情图片在线观看高清国产| 色偷偷91综合久久噜噜| 美女做暖暖视频免费在线观看全部网址91| 日韩欧美电影在线| 伊人22222| 欧美丝袜丝交足nylons图片| 久久久精品免费看| 亚洲成人综合在线| 九九热精彩视频| 亚洲三级电影全部在线观看高清| 人妻视频一区二区| 91麻豆swag| 内射中出日韩无国产剧情| 国产盗摄一区二区三区| www.欧美激情.com| 久久丁香综合五月国产三级网站 | 国产高清在线免费观看| 国产精品久久99| 久草手机视频在线观看| 国产精品情趣视频| 手机av在线不卡| 国产精品免费看片| 又色又爽的视频| 国产精品美女久久久久久2018| 免费成人深夜天涯网站| 国产亚洲欧洲一区高清在线观看| 精品无码一区二区三区| 91玉足脚交白嫩脚丫在线播放| 欧美xxxx×黑人性爽| 成人av动漫在线| 男男做爰猛烈叫床爽爽小说| av亚洲精华国产精华精| 中文字幕乱码一区| 91丨porny丨国产| 中文字幕av网址| 国产欧美日韩在线| 特黄一区二区三区| 中文字幕一区二区三中文字幕| 少妇高潮惨叫久久久久| 亚洲欧美中日韩| 青青草免费av| 午夜精品福利久久久| 五月婷婷中文字幕| 欧美午夜精品久久久久久人妖| 欧美黑人一区二区| 欧美影院午夜播放| av在线免费在线观看| 精品少妇一区二区三区免费观看| 欧美亚洲精品在线观看| 亚洲精品久久久久久久久久久久久 | 中文字幕影音先锋| 亚洲国产日日夜夜| 一级片视频在线观看| 欧美日韩在线播放| 精品人妻aV中文字幕乱码色欲| 亚洲成人激情在线| 国产香蕉在线| 欧美成在线视频| 忘忧草在线影院两性视频| 国产成人小视频在线观看| 日韩城人网站| 精品一区二区三区视频日产| 欧美裸体在线版观看完整版| 天天操天天干天天玩| 一级成人国产| 三级一区二区三区| 成人国产亚洲欧美成人综合网| 午夜理伦三级做爰电影| 国产精品久久久久久亚洲毛片 | 成人毛片网站| 蜜臀91精品国产高清在线观看| 影音先锋欧美资源| 亚洲人体偷拍| 中日韩av在线播放| a亚洲天堂av| a一级免费视频| 狠狠躁天天躁日日躁欧美| 97超碰中文字幕| 亚洲精品www| 91黄色在线| 国产精品久久久久久影视| 成人精品动漫一区二区三区| 亚洲国产精品一区二区第一页 | 亚洲欧美一区二区三区极速播放| 久久久精品免费看| 欧美一级生活片| 99re在线视频| 国产91ⅴ在线精品免费观看| 亚洲青青久久| 欧洲亚洲一区二区| 在线播放精品| 色哟哟免费视频| 国产精品麻豆视频| 在线视频一区二区三区四区| 日韩免费视频一区二区| av片在线免费观看| 欧美一级高清免费播放| 丁香婷婷成人| 国产日韩欧美大片| 免费在线视频一区| 国产精品无码午夜福利| 亚洲综合色视频| 国产露脸国语对白在线| 伊人男人综合视频网| 在线免费三级电影网站| 爱情岛论坛亚洲入口| 外国成人激情视频| 四季av一区二区| 久久久高清一区二区三区| 日韩av免费网址| 欧美mv日韩mv国产网站| 黄色网在线免费观看| 国产精品亚洲欧美导航| 猛男gaygay欧美视频| 日本三级免费网站| 不卡一区二区中文字幕| 久久精品国产亚洲av高清色欲| 69堂成人精品免费视频| 在线观看a视频| 国产精品中文字幕在线| 欧美精品尤物在线观看| 日日碰狠狠丁香久燥| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美亚洲精品天堂| 精品视频—区二区三区免费| 男人天堂视频在线观看| 狠狠色噜噜狠狠色综合久| 在线看片成人| a天堂视频在线观看| 婷婷久久综合九色综合伊人色| 老熟妇高潮一区二区高清视频| 欧美黑人xxxⅹ高潮交| 视频国产精品| 九九爱精品视频| 26uuu久久综合| 一区二区三区在线观看av| 亚洲开心激情网| 不卡一二三区| 日本婷婷久久久久久久久一区二区 | 精品国产一区二区三区不卡蜜臂| 国产精品69久久久| av资源网一区| jizz国产在线观看| 在线观看中文字幕亚洲| 日韩伦理一区二区| 国产乱子伦精品视频| 成人激情免费网站| 精品国产xxx| xvideos国产精品| 日韩视频1区| 国产91在线视频观看| 国产欧美一区视频| 国产精品系列视频| 久久免费国产视频| 免费精品国产的网站免费观看| 在线免费观看av的网站| 亚洲欧洲av在线| 手机看片一区二区| 国产精品久久久久久久午夜| 91精品秘密在线观看| www国产视频| 欧美日韩一级片在线观看| 婷婷色在线资源| 欧美精品二区三区四区免费看视频 | 亚洲视频免费在线观看| 性生交大片免费看女人按摩| 欧美性受xxxx白人性爽| 日本a口亚洲| 亚洲最大视频网| 欧洲视频一区二区| 欧美xxxx黑人又粗又长| 日本在线视频一区| 国产成人激情av| 中文字幕观看视频| 欧美精品videos性欧美| 欧美理论电影大全| 日韩黄色一区二区| 欧美日韩一二三| 久草在线中文最新视频| 制服国产精品| 久久久久国产精品厨房| 亚洲爱情岛论坛永久| 国产精品免费久久久久久| 在线看片日韩|