本篇來回答 wal 和索引的部份。
寫入 Prometheus 的資料,都會存在預設名為 data
的資料夾之下。而這之下,有三種資料夾
./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
這是主要用來存資料的單位。
每個資料夾裡面有四樣東西:
以 json 格式存了一些基本資訊。
如樣本的時間區間,和資料的來源(是否為合併名個資料夾的第二手資料)。
儲存了時間序列的名稱和標籤資料。共有七個區段:
裡面存了壓縮後的樣本序列,檔名由 000000
每超過 512MB 就會再分割一個新檔案。
內容只有樣本時間和值,索引的部份都在 index 裡,給出 chunk 的位置參照。
chunks_head
資料夾裡面放的是一張所有 Chunk 的列表,檔名由 000001
起算,預設檔案大小超過 4MB 就會分割出一個新檔。
每條 chunk 記錄著記憶體內的的一段時間序列參照。
wal 資料夾裡面放的是「Prometheus 已認列的操作,但其效果只在記憶體內,未進入檔案系統」 從 Prometheus 第一次執行開始,這些指令會一條條增加,每 128 MB 形成一個檔案,檔案的檔名會從 00000000
一次加 1
。
一個 wal 檔的一條指令可以是以下五種之一:
Prometheus 預設每過兩小時,就會把當下仍未寫進入檔案系統的指令,打成一包放入 checkpoint.<最後一個 wal 檔名>
資料夾,裡面有許多 1MB 大的 wal 指令檔,檔名從 000000
開始遞增。