儲存空間緊張?來看 TDengine TSZ 壓縮演算法如何顯著提升壓縮率

TDengine發表於2023-11-28

TSZ 壓縮演算法是 TDengine 為浮點資料型別提供的可選壓縮演算法,可以實現浮點數有損至無損全狀態壓縮,相比預設壓縮演算法,TSZ 壓縮演算法壓縮率更高,即使切至無損狀態,壓縮率也會比預設壓縮高一倍。一般來說,TSZ 壓縮演算法是透過資料預測技術完成的壓縮,所以更適合有規律變化的資料。同時 TSZ 壓縮時間會更長一些,在我們的伺服器 CPU 空閒、儲存空間緊張的情況下適合選用。

在此前釋出的《壓縮比提高5倍!貢獻者+1》一文中,華中科技大學、武漢光電國家研究中心的碩士研究生鍾宇為大家詳細介紹了其在近期發表的學術論文中,針對 TDengine TSZ 壓縮演算法進行的相關改進。本篇文章中,我們將就如何在 TDengine 中開啟 TSZ 壓縮演算法進行詳細說明,並會針對 TSZ 壓縮演算法展開功能測試,為大家驗證其在實際業務場景中的更優效能。

在 TDengine 中開啟 TSZ 壓縮演算法

TDengine 3.2.0.0 及以上版本中支援此壓縮演算法。在 taos.cfg 配置中增加以下內容,即可開啟 TSZ 壓縮演算法,功能開啟後,會替換預設演算法。以下表示欄位型別是 float 及 double 型別都使用此壓縮演算法,也可以單獨只配置一個。

lossyColumns     float|double

配置成功後需要重啟服務才能生效,當 Taosd 日誌輸出以下內容時,即表明功能已生效:

02/22 10:49:27.607990 00002933 UTL  lossyColumns     float|double

配置引數

FLOAT 型別精度控制:

DOUBLE 型別精度控制:

TSZ 壓縮中可選擇的演算法 FSE,預設為 HUFFMAN:

但需要注意的是,開啟 TSZ 後生成的儲存資料格式,在回退至 3.2.0.0 之前的版本後資料將不能被識別。

TDengine TSZ 壓縮演算法功能測試

資料正確性

首先我們需要驗證寫入資料被 TDengine 儲存後再次讀取出來的正確性:

  • 透過 0-others/compress_tsz1.py 實現;
  • 寫入 10 個子表, 每子表 10 萬資料,分別寫入 float 和 double 欄位指定的隨機值,寫入完成後全部再讀取出來,和原來寫入時的值進行比較。原來寫入的值把整數及小數部分分別在兩個 int64 的欄位中儲存,驗證時再讀取出來合成一個浮點數進行驗證。驗證的誤差 float 為 1e-6, double 為 1e-12;
  • 驗證透過,資料完全正確。

資料相容性

首先我們需要先寫入開啟 TSZ 壓縮的資料,然後再寫入關閉 TSZ 壓縮的資料,此階段測試預期是不管 TSZ 選項開啟或關閉,原來使用 TSZ 寫入的及沒有使用 TSZ 寫入的都能正確讀取出來。

測試步驟如下:

  1. 配置 TSZ 選項為開啟 lossyColumns float|double
  2. 啟動 taosd
  3. 建立資料庫及表,表中包括 float 及 double 欄位
  4. 寫入 100 萬條資料
  5. 寫入成功後讀取並檢視資料正確性
  6. 退出 taosd 並關閉 TSZ 選項
  7. 啟動 taosd 並寫入新資料到表中

測試結果顯示原來的資料及新寫入資料,都正常為符合預期,反覆開啟及關閉 TSZ,不影響已寫入資料的正常存取。

效能比較

我們對本次新引入的 FSE 演算法、原來的演算法,及關閉 TSZ 壓縮後的三個場景作為三種方案進行對比測試,驗證開啟 TSZ 演算法及使用 TSZ 新的 FSE 演算法的效果。本次測試的資料規模如下:1 個超級表,2 個子表,每子表 100 萬條資料,子表為 25 列 (其中 float 11 列、double 11 列)。

下表為最終測試結果:

從上表可知,方案一中新增的 FSE 演算法開啟後寫入效能優於原來的演算法,符合預期;其次,TSZ 壓縮演算法開啟比關閉時,在寫入效能、查詢及壓縮率方面均有小幅提升,此結論也符合預期。

寫在最後

在閱讀完本篇文章後,你一定對在 TDengine 中開啟 TSZ 壓縮演算法及如何打造更優質效能有了更深入的瞭解,現在你可以進行操作了。如果在實操過程中碰到任何問題或難點,可以新增 小T vx(tdengine),和我們的資/深研發工程師進行面對面溝通。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014783/viewspace-2997578/,如需轉載,請註明出處,否則將追究法律責任。

相關文章