TDengine 中的壓縮設計

簡介

機器設備產生的時序數據量大,直接存儲成本非常高,所以需要使用壓縮技術,盡可能減小體積。 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 官網

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77816.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習涉及的數學與計算機知識總結

深度學習涉及的數學與計算機知識可總結為以下核心模塊,結合理論與實踐需求分為數學基礎和計算機技能兩大方向: 一、數學知識 線性代數 核心:矩陣運算(乘法、轉置、逆矩陣)、向量空間、特征值與特征向量、奇異值分解&am…

javascript<——>進階

一、作用域:變量可以被訪問的范圍 1.局部作用域 1.1函數作用域 在函數內部聲明的變量,在函數內部被訪問的,外部無法直接訪問。 總結:1、函數內部聲明的變量,在函數外部無法直接訪問 2、函數的參數也是函數內部的局…

驅動開發硬核特訓 · Day 25 (附加篇):從設備樹到驅動——深入理解Linux時鐘子系統的實戰鏈路

一、前言 在嵌入式Linux開發中,無論是CPU、外設控制器,還是簡單的GPIO擴展器,大多數硬件模塊都離不開時鐘信號的支撐。 時鐘子系統(Clock Subsystem),作為Linux內核中基礎設施的一部分,為設備…

并發設計模式實戰系列(7):Thread Local Storage (TLS)

🌟 大家好,我是摘星! 🌟 今天為大家帶來的是并發設計模式實戰系列,第七章Thread Local Storage (TLS),廢話不多說直接開始~ 目錄 一、核心原理深度拆解 1. TLS內存模型 2. 關鍵特性 二、生活化類比&a…

時序數據庫 TDengine × Perspective:你需要的可視化“加速器”

你有沒有遇到這樣的場景:數據已經寫進數據庫,圖表卻總是“慢半拍”?或是操作界面太卡,光是一個排序就能讓你等到喝完一杯咖啡?當數據量越來越大、響應時間卻越來越長,開發者和用戶都不禁要問一句——就沒有…

前端面試每日三題 - Day 19

這是我為準備前端/全棧開發工程師面試整理的第十一天每日三題練習,涵蓋 JavaScript中WeakMap與內存管理的底層機制、Redux Toolkit的事件以及系統設計中的企業級表單引擎構建。通過這三道題,你將對現代前端開發中的關鍵概念有更深入的理解,并…

Antd Modal Drawer 更改默認項

當項目比較大使用了非常多的 Modal 和 Drawer 要是有需求一次性全部調整就會比較麻煩,目前 Antd 的 ConfigProvider 暫不支持(也有可能我沒找到,待大佬指證)就比如由于默認 Modal Drawer 的遮罩層是可以點擊關閉的,但是…

硬件工程師面試常見問題(8)

第三十六問:基爾霍夫定理的內容是什么? 基爾霍夫電流定理: 1. 內容:電路中任意一個節點上,在任意時刻,流入節電的電流之和等于流出節點的電流之和。 2. 表達式:根據上圖寫出節點電流定律的數學…

Elasticsearch 內存使用指南

作者:來自 Elastic Valentin Crettaz 探索 Elasticsearch 的內存需求以及不同類型的內存統計信息。 Elasticsearch 擁有豐富的新功能,幫助你為你的使用場景構建最佳搜索解決方案。瀏覽我們的示例筆記本了解更多信息,開始免費云試用&#xff0…

硬件工程師面試常見問題(9)

第四十一問:色環電阻的顏色表示什么? 各環表示的意思: 4色環的:前兩位表示有效位;第三環表示倍乘;最后一環表示誤差; 5色環的:前三位表示有效位;第四環表示倍乘&#…

PyTorch 深度學習實戰(23):多任務強化學習(Multi-Task RL)之擴展

之前的PyTorch 深度學習實戰(23):多任務強化學習(Multi-Task RL)總結擴展運用代碼如下: import torch import torch.nn as nn import torch.optim as optim import numpy as np from torch.distributions import Norm…

前端——CSS1

一,概述 CSS(Cascading Style Sheets)(級聯樣式表) css是一種樣式表語言,為html標簽修飾定義外觀,分工不同 涉及:對網頁的文字、背景、寬、高、布局進行修飾 分為內嵌樣式表&…

賦能航天教育:高校衛星仿真教學實驗平臺解決方案

?????? 隨著全球航天事業的飛速發展,對高素質航天人才的需求日益增長。如何在高校階段提前鍛煉學生的航天工程實踐能力,成為教育界的重要命題。作為領先的通信與網絡技術供應商,IPLOOK基于自身在5G核心網、衛星通信及仿真平臺領域的深…

Python爬蟲(10)Python數據存儲實戰:基于pymongo的MongoDB開發深度指南

目錄 一、為什么需要文檔型數據庫?1.1 數據存儲的范式變革1.2 pymongo的核心優勢 二、pymongo核心操作全解析2.1 環境準備2.2 數據庫連接與CRUD操作2.3 聚合管道實戰2.4 分批次插入百萬級數據(進階)2.5 分批次插入百萬級數據(進階…

Springboot 手搓 后端 滑塊驗證碼生成

目錄 一、效果演示 二、后端滑塊驗證碼生成思路 三、原理解析 四、核心代碼拿走 滑塊驗證碼react前端實現,見我的這篇博客:前端 React 彈窗式 滑動驗證碼實現_react中使用阿里云滑塊驗證碼2.0前端接入及相關視覺-CSDN博客 一、效果演示 生成的案例…

關于flink兩階段提交高并發下程序卡住問題

先拋出代碼 package com.dpf.flink;import com.dpf.flink.sink.MysqlSink; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.…

html css js網頁制作成品——HTML+CSS+js美甲店網頁設計(5頁)附源碼

美甲店 目錄 一、👨?🎓網站題目 二、??網站描述 三、📚網站介紹 四、🌐網站效果 五、🪓 代碼實現 🧱HTML 六、🥇 如何讓學習不再盲目 七、🎁更多干貨 一、👨?&a…

LeetCode[347]前K個高頻元素

思路: 使用小頂堆,最小的元素都出去了,省的就是大,高頻的元素了,所以要維護一個小頂堆,使用map存元素高頻變化,map存堆里,然后輸出堆的東西就行了 代碼: class Solution…

2024年網站開發語言選擇指南:PHP/Java/Node.js/Python如何選型?

2024年網站開發語言選擇指南:PHP/Java/Node.js/Python如何選型? 一、8大主流Web開發語言技術對比 1. PHP開發:中小型網站的首選方案 最新版本:PHP 8.3(2023年11月發布)核心優勢: 全球78%的網站…

從數據結構說起(一)

1 揭開數據結構神奇的面紗 1.1 初識數據結構 在C的標準庫模板(Standard Template Library,STL)課程上,我初次結識了《數據結構》。C語言提供的標準庫模板是面向對象程序設計與泛型程序設計思想相結合的典范。所謂的泛型編程就是編寫不依賴于具…