簡介
機器設備產生的時序數據量大,直接存儲成本非常高,所以需要使用壓縮技術,盡可能減小體積。 TDengine 使用了列式存儲,結合二級壓縮技術,壓縮率通常可以達到 20%,特殊情況下更能達到 5 % 以內,超高的壓縮率實實在在的為用戶節約了磁盤空間。
數據壓縮
數據壓縮是一種在不損失數據有效信息的前提下,利用特定算法對數據進行重新組織和處理,以減少數據占用的存儲空間和提高數據傳輸效率的技術。TDengine 在數據的存儲和傳輸過程中均采用了這一技術,旨在優化存儲資源的使用并加快數據交換的速度。
存儲壓縮
TDengine 在存儲架構上采用了列式存儲技術,這意味著在存儲介質中,數據是以列為單位進行連續存儲的。這與傳統的行式存儲不同,后者在存儲介質中是以行為單位進行連續存儲的。列式存儲與時序數據的特性相結合,尤其適合處理平穩變化的時序數據。
為了進一步提高存儲效率,TDengine 采用了差值編碼技術。這種技術通過計算相鄰數據點之間的差異來存儲數據,而不是直接存儲原始值,從而大幅度減少存儲所需的信息量。在差值編碼之后,TDengine 還會使用通用的壓縮技術對數據進行二次壓縮,以實現更高的壓縮率。
對于設備采集的穩定時序數據,TDengine 的壓縮效果尤為顯著,壓縮率通常可以達到 10% 以內,甚至在某些情況下更高。這種高效的壓縮技術為用戶節約了大量的存儲成本,同時也提高了數據的存儲和訪問效率。
一級壓縮
時序數據自設備采集后,遵循 TDengine 的數據建模規則,每臺采集設備會被構建為一張子表。如此,一臺設備產生的所有時序數據均記錄在同一張子表中。在數據存儲過程中,數據是以塊為單位進行分塊存儲的,每個數據塊僅包含一張子表的數據。壓縮操作也是以塊為單位進行的,對子表中的每一列數據分別進行壓縮,壓縮后的數據仍然按
塊存儲至硬盤。
時序數據的平穩性是其主要特征之一,例如采集的大氣溫度、水溫等,通常在一定范圍內波動。利用這一特性,可以對數據進行重編碼,并且根據不同的數據類型采用
應的編碼技術,以實現最高的壓縮效率。接下來將介紹各種數據類型的壓縮方法。
- 時間戳類型:由于時間戳列通常記錄設備連續采集數據的時刻,且采集頻率固定,因此只須記錄相鄰時間點的差值。由于差值通常較小,這種方法比直接存儲原始
時間戳更能節省存儲空間。 - 布爾類型:布爾類型通過一個比特位表示一個布爾值,一個字節可以存儲 8 個布爾值。通過緊湊的編碼方式,可以顯著減少存儲空間。
- 數值類型:物聯網設備產生的數值數據,如溫度、濕度、氣壓、車速、油耗等,通常數值不大且在一定范圍內波動。對于這類數據,統一采用 zigzag 編碼技術。該技術將有符號整數映射為無符號整數,并將整數的補碼最高位移動到低位,負數除了符號位以外的其他位取反,正數保持不變。這樣做可以將有效數據位集中,同時增加前導零的數量,從而在后續壓縮步驟中獲得更佳的壓縮效果。
- 浮點數類型:對于 float 和 double 兩種浮點數類型,采用 delta-delta 編碼方法。
- 字符串類型:字符串類型數據采用字典壓縮算法,通過短的標識符替換原字符串中頻繁出現的長字符串,從而減少存儲的信息長度。
二級壓縮
在完成針對特定數據類型的專用壓縮之后,TDengine 進一步采用通用的壓縮技術,將數據視為無差別的二進制數據進行二次壓縮。與一級壓縮相比,二級壓縮的側重點在于消除數據塊之間的信息冗余。這種雙重壓縮技術,一方面專注于局部數據的精簡,另一方面著眼于整體數據的重疊消除,二者相輔相成,共同實現了 TDengine 中的超高壓縮率。
TDengine 支持多種壓縮算法,包括 LZ4、ZLIB、ZSTD、XZ 等,用戶可以根據具體的應用場景和需求,在壓縮率和寫入速度之間進行靈活權衡,選擇最適合的壓縮方案。
有損壓縮
TDengine 引擎為浮點數類型數據提供了無損壓縮和有損壓縮兩種模式。浮點數的精度通常由其小數點后的位數決定。在某些情況下,設備采集的浮點數精度較高,但實際應用中關注的精度卻較低,此時采用有損壓縮可以有效地節約存儲空間。TDengine 的有損壓縮算法基于預測模型,其核心思想是利用前序數據點的趨勢來預測后續數據點的走勢。這種算法能夠顯著提高壓縮率,相比之下,其壓縮效果遠超無損壓縮。有損壓縮算法的名稱為 TSZ。
傳輸壓縮
TDengine 在數據傳輸過程中提供了壓縮功能,以減少網絡帶寬的消耗。使用原生連接從客戶端(如 taosc)向服務器傳輸數據時,可以通過配置壓縮傳輸來節省帶寬。在配置文件 taos.cfg 中,可以設置 compressMsgSize 選項來實現這一目標。可配置的值有以下 3 個。
- 0:表示禁用壓縮傳輸。
- 1:表示啟用壓縮傳輸,但僅對大于 1KB 的數據包進行壓縮。
- 2:表示啟用壓縮傳輸,對所有數據包進行壓縮。
在使用 RESTful 和 WebSocket 連接與 taosAdapter 通信時,taosAdapter 支持行業標準的壓縮協議,允許連接端根據行業標準協議開啟或關閉傳輸過程中的壓縮。以下是具體的實現方式:
- RESTful 接口使用壓縮:客戶端在 HTTP 請求頭部指定 Accept-Encoding 來告知服務器可接受的壓縮類型,如 gzip、deflate 等。服務器在返回結果時,會在 ContentEncoding 頭部中指定所使用的壓縮算法,并返回壓縮過的數據。
- WebSocket 接口使用壓縮:可以參考 WebSocket 協議標準文檔 RFC7692,了解如何在 WebSocket 連接中實現壓縮。
- 數據備份遷移工具 taosX 與 taosX Agent 之間的通信也可以開啟壓縮傳輸。在 agent.toml 配置文件中,設置壓縮開關選項 compression=true 即可啟用壓縮功能。
壓縮流程
下圖展示了 TDengine 引擎在時序數據的整個傳輸及存儲過程中的壓縮及解壓過程,以更好地理解整個處理過程。
更多壓縮相關文章
- 如何選擇最佳的壓縮算法
- TDengine 檢測數據最佳壓縮算法工具
- TDengine 新功能 壓縮算法可配置
訪問官網
更多內容歡迎訪問 TDengine 官網