在工業(yè)互聯(lián)網(wǎng)和物聯(lián)網(wǎng)等領(lǐng)域,數(shù)據(jù)集的價值與其規(guī)模是成正比的:應(yīng)用程序和算法可以使用的數(shù)據(jù)越多,它們的輸出結(jié)果就越精確。然而,由眾多設(shè)備產(chǎn)生的海量數(shù)據(jù)需要處理,對于大型企業(yè)來說,存儲成本可能會非常高昂。
但有一個好消息,那就是時序數(shù)據(jù)非常易于壓縮。TDengine 大幅提高了數(shù)據(jù)壓縮率,甚至能將數(shù)據(jù)集壓縮至原始大小的1/10,并且?guī)缀醪粫绊懱幚硇阅?。這一切都得益于幾個關(guān)鍵的創(chuàng)新點。
列式存儲
時序數(shù)據(jù)庫主要用來存儲設(shè)備隨時間變化而產(chǎn)生的數(shù)據(jù)。這些數(shù)據(jù)通常以較短的時間間隔進(jìn)行采集,比如一分鐘采集一次,或一秒鐘采集一次。這就導(dǎo)致每個數(shù)據(jù)點與其相鄰點的數(shù)值十分接近。以每 15s 測量一次溫度的設(shè)備為例,在這么短的時間內(nèi),正常情況下,溫度的變化通常不會太大,保持在一個相對穩(wěn)定的范圍內(nèi)。
和 MySQL 這類采用行式存儲的通用數(shù)據(jù)庫不同,TDengine 采用列式存儲。
- 大幅提高壓縮率:同一列數(shù)據(jù)相近,便于壓縮;不同數(shù)據(jù)類型可采用不同壓縮算法。
- 大幅提高分析性能:時序數(shù)據(jù)的分析,往往是針對一個采集量在一個時間范圍段進(jìn)行的。如果行式存儲,會讀取大量的無效數(shù)據(jù)。
采用列式存儲,由于這些數(shù)據(jù)的相似性,即便不使用復(fù)雜的壓縮技術(shù),也能達(dá)到很好的壓縮效果。

兩級壓縮
TDengine 采用兩級壓縮技術(shù),即先對數(shù)據(jù)進(jìn)行編碼,然后在編碼的基礎(chǔ)上對數(shù)據(jù)塊進(jìn)行壓縮。
TDengine 對數(shù)據(jù)的編碼方式如下:
- 較小的整數(shù)數(shù)據(jù)類型(INT、TINYINT 等)使用 simple8b 編碼。
- 較大的整數(shù)數(shù)據(jù)類型(BIGINT 和 UBIGINT)和時間戳使用 delta 編碼。
- 浮點數(shù)據(jù)類型(FLOAT 和 DOUBLE)使用 delta-of-delta 編碼。
delta 編碼,也稱增量編碼,是一種在序列數(shù)據(jù)之間以數(shù)據(jù)差異(delta)的形式存儲或傳輸數(shù)據(jù)的方法。例如,對于序列數(shù)據(jù) [2, 4, 6, 9, 7],delta 編碼會存儲 [2, 2, 2, 3, -2],其中每個值表示前一個數(shù)據(jù)點與當(dāng)前數(shù)據(jù)點之間的差異。在時序數(shù)據(jù)場景下,由于相鄰數(shù)據(jù)點的差異通常較小,Delta編碼可以顯著減少數(shù)據(jù)的冗余,從而顯著提高壓縮效率。
編碼后,對于所有的數(shù)據(jù)類型,會使用標(biāo)準(zhǔn)的數(shù)據(jù)壓縮算法進(jìn)行壓縮。TDengine 默認(rèn)對所有列使用 lz4 進(jìn)行壓縮。但用戶可以在建表時,根據(jù)需要配置 zlib、zstd、tsz、xz 或 disabled 等壓縮算法,不同的數(shù)據(jù)類型,可以選擇不同的壓縮算法。詳細(xì)可查看《可配置壓縮算法》。
存儲壓縮算法增強(qiáng)后,TDengine 的壓縮比預(yù)期可再提升一倍以上。
一個設(shè)備一張表
為充分利用其數(shù)據(jù)的時序性和其他數(shù)據(jù)特點,TDengine 采取一張設(shè)備一張表的策略,要求對每個數(shù)據(jù)采集點單獨建表,用來存儲這個數(shù)據(jù)采集點所采集的時序數(shù)據(jù)。這樣的好處是:
- 每張表里的記錄按時間自動排序
- 新數(shù)據(jù)記錄的寫入變成簡單的追加操作
- 數(shù)值按列的變化范圍更小
- 設(shè)備 ID、標(biāo)簽不會重復(fù)存儲
這樣的設(shè)計讓 TDengine 在數(shù)據(jù)壓縮率上遠(yuǎn)超其他時序數(shù)據(jù)庫,同時,也便于數(shù)據(jù)的管理和查詢。
可配置壓縮算法
從 TDengine 3.3.0.0 版本開始,TDengine 提供了更高級的壓縮功能,用戶可以在建表時針對每一列配置是否進(jìn)行壓縮、以及使用的壓縮算法和壓縮級別。
- 第一級壓縮支持多種編碼方法,可擴(kuò)充, 包括 simple8b、delta-i、delta-d、bit-packing、disabled
- 第二級壓縮支持多種壓縮算法,可擴(kuò)充,包括 lz4、zlib、zstd、tsz、xz、disabled
- 壓縮等級支持 高、中、低三種
詳見《可配置壓縮算法》。
存儲壓縮算法增強(qiáng)后,TDengine 的壓縮比預(yù)期可再提升一倍以上。
Q&A
Q:TDengine 的時序數(shù)據(jù)壓縮率能達(dá)到多少?核心解決什么問題?
A:TDengine 能將時序數(shù)據(jù)壓縮至原始大小的1/10,且?guī)缀醪挥绊憯?shù)據(jù)處理性能。其核心解決工業(yè)互聯(lián)網(wǎng)、物聯(lián)網(wǎng)場景中的 “海量數(shù)據(jù)存儲成本高” 問題 —— 設(shè)備持續(xù)產(chǎn)生的大量時序數(shù)據(jù)無需依賴額外存儲資源,即可低成本留存,同時保障后續(xù)分析性能。
Q:TDengine 為什么采用列式存儲?相比行式存儲,對壓縮率有什么幫助?
A:TDengine 采用列式存儲是基于時序數(shù)據(jù) “相鄰數(shù)據(jù)點數(shù)值相近” 的特點(如 15 秒采集一次的溫度數(shù)據(jù)變化小)。相比行式存儲(如 MySQL),列式存儲的優(yōu)勢直接提升壓縮率:① 同一列數(shù)據(jù)特征一致、數(shù)值相近,更易壓縮;② 可針對不同數(shù)據(jù)類型(如整數(shù)、浮點)匹配專屬壓縮算法,避免行式存儲中 “混合數(shù)據(jù)難適配算法” 的問題。
?Q:TDengine 的 “兩級壓縮” 技術(shù)具體怎么實現(xiàn)?支持哪些編碼和壓縮算法?
A:TDengine 兩級壓縮分 “編碼→壓縮” 兩步,針對性降低數(shù)據(jù)冗余:① 第一級(編碼):按數(shù)據(jù)類型適配算法,如小整數(shù)用 simple8b 編碼、時間戳用 delta 編碼、浮點用 delta-of-delta 編碼;② 第二級(壓縮):默認(rèn)用 lz4 算法,用戶可在建表時配置 zlib、zstd、tsz、xz 等算法,也可選擇禁用。其中 delta 編碼通過存儲 “相鄰數(shù)據(jù)差異”,大幅減少時序數(shù)據(jù)冗余。
Q:TDengine “一個設(shè)備一張表” 的設(shè)計,對提升壓縮率有什么作用?
A:“一個設(shè)備一張表” 是 TDengine 提升壓縮率的關(guān)鍵設(shè)計,核心作用包括:① 表內(nèi)數(shù)據(jù)按時間自動排序,相鄰數(shù)據(jù)數(shù)值變化范圍更小,壓縮難度降低;② 新數(shù)據(jù)僅需追加寫入,無需調(diào)整已有數(shù)據(jù)結(jié)構(gòu),避免冗余存儲;③ 設(shè)備 ID、標(biāo)簽等信息無需重復(fù)存儲在每條數(shù)據(jù)中,直接減少數(shù)據(jù)量,進(jìn)一步放大壓縮效果。
Q:TDengine 支持自定義配置壓縮算法嗎?具體有哪些可配置選項?
A:從 TDengine 3.3.0.0 版本開始,支持針對每一列自定義壓縮配置:① 第一級編碼可選 simple8b、delta-i、delta-d 等(或禁用);② 第二級壓縮算法可選 lz4、zlib、zstd、tsz 等(或禁用);③ 壓縮等級支持高、中、低三檔。靈活配置后,壓縮比預(yù)期可再提升一倍以上,詳情可參考《可配置壓縮算法》文檔。



互聯(lián)網(wǎng).png)



-1.png)







證.png)


伙伴.png)
伙伴.png)
伙伴.png)



