iT邦幫忙

2024 iThome 鐵人賽

DAY 15
1
DevOps

時間序列資料庫探討 - Prometheus系列 第 15

Prometheus - 時間序列資料儲存格式

  • 分享至 

  • xImage
  •  

上篇提問

  • Prometheus 什麼時候會重寫檔案。
  • wal 檔的生命週期?
  • Prometheus 的索引格式是什麼?
  • 允許 OOO 的情況下,怎麼分檔案呢?

本篇來回答 wal 和索引的部份。

Prometheus 在檔案系統中的資料儲存結構

寫入 Prometheus 的資料,都會存在預設名為 data 的資料夾之下。而這之下,有三種資料夾

  • 名稱是 26 個英數字母長的資料夾
  • 名為 chunk_head 的資料夾
  • 名為 wal 的資料夾

官方文件舉例:

./data
├── 01BKGV7JBM69T2G1BGBGM6KB12
│   └── meta.json
├── 01BKGTZQ1SYQJTR4PB43C8PD98
│   ├── chunks
│   │   └── 000001
│   ├── tombstones
│   ├── index
│   └── meta.json
├── 01BKGTZQ1HHWHV8FBJXW1Y3W0K
│   └── meta.json
├── 01BKGV7JC0RY8A6MACW02A2PJD
│   ├── chunks
│   │   └── 000001
│   ├── tombstones
│   ├── index
│   └── meta.json
├── chunks_head
│   └── 000001
└── wal
    ├── 000000002
    └── checkpoint.00000001
        └── 00000000

26 個英數字母長的數據資料夾

這是主要用來存資料的單位。
每個資料夾裡面有四樣東西:

  • meta.json 檔案
  • index 檔案
  • tombstones 檔案
  • Chunks 資料夾

meta.json 檔案

以 json 格式存了一些基本資訊。
如樣本的時間區間,和資料的來源(是否為合併名個資料夾的第二手資料)。

index 檔案

儲存了時間序列的名稱和標籤資料。共有七個區段

  • Symbol Table
  • Series
  • Label Index
  • Postings
  • Label Offset Table
  • Postings Offset Table
  • TOC

Chunks 資料夾

裡面存了壓縮後的樣本序列,檔名由 000000 每超過 512MB 就會再分割一個新檔案。
內容只有樣本時間和值,索引的部份都在 index 裡,給出 chunk 的位置參照。

Chunks Head

chunks_head 資料夾裡面放的是一張所有 Chunk 的列表,檔名由 000001 起算,預設檔案大小超過 4MB 就會分割出一個新檔。
每條 chunk 記錄著記憶體內的的一段時間序列參照。

wal 資料夾

wal 資料夾裡面放的是「Prometheus 已認列的操作,但其效果只在記憶體內,未進入檔案系統」 從 Prometheus 第一次執行開始,這些指令會一條條增加,每 128 MB 形成一個檔案,檔案的檔名會從 00000000 一次加 1
一個 wal 檔的一條指令可以是以下五種之一:

  • 一個新的時間序列
    • 對於新的序列名稱和標籤集,指定一個序列 id。
  • 一些樣本點
    • 每個樣本點所屬的時間序列、時間戳和樣本值
  • 樣本刪除操作
    • 要刪除的時間序列 id 和刪除的時間區間
  • 一個範例時間序列
    • 名稱、標籤集和樣本集
  • 時間序列的名稱或標籤更動
    • 序列 id 和更動後的名稱和標籤

Prometheus 預設每過兩小時,就會把當下仍未寫進入檔案系統的指令,打成一包放入 checkpoint.<最後一個 wal 檔名> 資料夾,裡面有許多 1MB 大的 wal 指令檔,檔名從 000000 開始遞增。


上一篇
Prometheus - 資料儲存格式
下一篇
Prometheus - 時間序列資料儲存檔案的分合
系列文
時間序列資料庫探討 - Prometheus30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言