上篇題到時間序列資料的壓縮。以兩小時為區段,壓縮後的時間序列資料會被存在檔案系統中。
除了壓縮以外,一般常見縮限檔案大小的方式就是刪除沒用的資料。
Prometheus 刪除資料的方式主要有兩種。
/api/v1/admin/tsdb/delete_series
刪除時間序列然而 API 並不會直接開啓所有 Chunk,把對應的壓縮資料刪除後,平移其他時間序列。而是先記下這些資料之後要被刪除,有時間時再把所有檔案讀出來,依記下的結果重寫檔案。
由上資料刪除的做法可見,Prometheus 並不排拆「先把操作記下來,之後再把這些操作結果塞進檔案」的做法,並且有能力處理所衍生的問題。例如把結果塞進檔案的過程中,其它線程也要能讀到正確的資料。
「先把操作記下來,之後再存」這個動作,在許多的資料庫系統中,都會使用在資料寫入的場景。這個「操作記錄」稱為 Write Ahead Log,以 Prometheus 來說,/data
下面會有一個 wal
資料夾,裡面放還沒壓成檔案的新資料
資料庫之所以要「先記下,之後再存」顯然是因為「存」的過程比「記」還要複雜。為什麼存要存得複雜呢?可能是儲存資料的狀態比需時刻符合某些條件,所以比較麻煩;也可能是為了讓讀資料的時候可以輕鬆一點,所以先做一些事,如建立索引、把有關的資料存在附近、算出讀資料時會用到的中間值等⋯其中建立索引幾乎是每個資料庫系統都要做的事。
上篇提到 Prometheus 是可以設定允許 OOO(樣本亂序)的。
亂序顯然不利於用嚴格的時間區段分檔案。