時(shí)序數(shù)據(jù)庫作為物聯(lián)網(wǎng)、工業(yè)互聯(lián)網(wǎng)和金融交易等領(lǐng)域的核心基礎(chǔ)設(shè)施,面臨著海量數(shù)據(jù)存儲(chǔ)的巨大挑戰(zhàn)。TDengine作為一款專為時(shí)序數(shù)據(jù)設(shè)計(jì)的高性能數(shù)據(jù)庫,通過創(chuàng)新的多級(jí)壓縮技術(shù),將存儲(chǔ)成本降低至傳統(tǒng)方案的10%以內(nèi)。本文將深入解析TDengine的壓縮算法原理與配置實(shí)踐,幫助開發(fā)者構(gòu)建高效、低成本的時(shí)序數(shù)據(jù)存儲(chǔ)方案。
一、TDengine壓縮架構(gòu)概覽
1.1 列式存儲(chǔ)與壓縮的天然契合
TDengine采用列式存儲(chǔ)架構(gòu),同一列的數(shù)據(jù)類型相同、取值范圍相近,這為高效壓縮創(chuàng)造了理想條件。相比行式存儲(chǔ),列式存儲(chǔ)的壓縮率通常可提升3-5倍。
-- 查看表的壓縮配置
DESCRIBE db.meters;
1.2 兩級(jí)壓縮機(jī)制
TDengine實(shí)現(xiàn)了獨(dú)特的兩級(jí)壓縮架構(gòu):
| 壓縮層級(jí) | 壓縮類型 | 算法特點(diǎn) | 適用場(chǎng)景 |
|---|---|---|---|
| 一級(jí)壓縮 | 數(shù)據(jù)類型專用 | 差值、位編碼、zigzag等 | 利用時(shí)序數(shù)據(jù)特征 |
| 二級(jí)壓縮 | 通用算法 | LZ4、ZLIB、ZSTD、XZ | 進(jìn)一步壓縮數(shù)據(jù)體積 |
二、一級(jí)壓縮:數(shù)據(jù)類型專用算法
一級(jí)壓縮針對(duì)不同數(shù)據(jù)類型采用專門的編碼算法,充分利用時(shí)序數(shù)據(jù)的特征規(guī)律。
2.1 時(shí)間戳壓縮:差值編碼(Delta Encoding)
時(shí)序數(shù)據(jù)的時(shí)間戳通常具有高度規(guī)律性,相鄰數(shù)據(jù)點(diǎn)的時(shí)間間隔相對(duì)固定。差值編碼只存儲(chǔ)相鄰時(shí)間戳的差值,而非完整時(shí)間戳。
-- 原始時(shí)間戳序列(毫秒)
-- 1699123200000, 1699123201000, 1699123202000, 1699123203000
-- 差值編碼后
-- 1699123200000, 1000, 1000, 1000
壓縮效果:64位時(shí)間戳經(jīng)差值編碼后,通??捎?-16位表示,壓縮比可達(dá)4:1至8:1。
2.2 布爾值壓縮:位編碼(Bit Encoding)
布爾類型只有兩個(gè)取值,傳統(tǒng)存儲(chǔ)需要1字節(jié)。TDengine采用位編碼,8個(gè)布爾值僅需1字節(jié)。
-- 原始布爾序列
-- true, false, true, true, false, true, false, false
-- 位編碼后(1字節(jié))
-- 10110100 (二進(jìn)制)
壓縮效果:壓縮比固定為8:1。
2.3 整數(shù)壓縮:ZigZag編碼
有符號(hào)整數(shù)采用ZigZag編碼,將負(fù)數(shù)映射為正數(shù),使小絕對(duì)值整數(shù)占用更少的編碼空間。
原始值 -> ZigZag編碼
0 -> 0
-1 -> 1
1 -> 2
-2 -> 3
2 -> 4
這種編碼方式特別適合傳感器數(shù)據(jù),因?yàn)閭鞲衅髯x數(shù)通常在小范圍內(nèi)波動(dòng)。
2.4 浮點(diǎn)數(shù)壓縮:Delta-Delta編碼
對(duì)于浮點(diǎn)數(shù),TDengine采用delta-delta編碼,存儲(chǔ)相鄰差值的差值。
-- 原始浮點(diǎn)序列
-- 25.3, 25.5, 25.8, 26.0, 26.2
-- 一級(jí)差值
-- 0.2, 0.3, 0.2, 0.2
-- Delta-Delta編碼(二級(jí)差值)
-- 0.2, 0.1, -0.1, 0
壓縮效果:對(duì)于變化平緩的傳感器數(shù)據(jù),delta-delta編碼可將64位浮點(diǎn)數(shù)壓縮至8-16位。
2.5 字符串壓縮:字典壓縮(Dictionary Encoding)
對(duì)于重復(fù)率高的字符串(如設(shè)備型號(hào)、狀態(tài)標(biāo)識(shí)),TDengine采用字典壓縮。
-- 原始字符串列
-- "temperature", "humidity", "temperature", "pressure", "temperature"
-- 字典映射
-- 0: "temperature"
-- 1: "humidity"
-- 2: "pressure"
-- 編碼后
-- 0, 1, 0, 2, 0
壓縮效果:對(duì)于枚舉類字符串,壓縮比可達(dá)10:1以上。
三、二級(jí)壓縮:通用壓縮算法
一級(jí)壓縮后的數(shù)據(jù)進(jìn)入二級(jí)壓縮階段,TDengine支持多種通用壓縮算法:
3.1 支持的壓縮算法
| 算法 | 壓縮比 | 壓縮速度 | 解壓速度 | 適用場(chǎng)景 |
|---|---|---|---|---|
| LZ4 | 中等 | 極快 | 極快 | 實(shí)時(shí)性要求高的場(chǎng)景 |
| ZLIB | 較高 | 中等 | 中等 | 平衡壓縮比與性能 |
| ZSTD | 高 | 快 | 快 | 推薦默認(rèn)選擇 |
| XZ | 極高 | 慢 | 中等 | 歸檔存儲(chǔ)場(chǎng)景 |
3.2 壓縮算法配置
在創(chuàng)建數(shù)據(jù)庫時(shí)指定壓縮算法:
-- 創(chuàng)建數(shù)據(jù)庫,指定壓縮算法為ZSTD
CREATE DATABASE db COMPRESS 2;
-- 壓縮級(jí)別說明
-- 0: 不壓縮
-- 1: LZ4(默認(rèn))
-- 2: ZLIB
-- 3: ZSTD
-- 4: XZ
3.3 表級(jí)壓縮配置
-- 創(chuàng)建表時(shí)指定壓縮選項(xiàng)
CREATE TABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT
) COMPRESS("current", "zstd") COMPRESS("voltage", "lz4");
四、有損壓縮:TSZ算法
對(duì)于允許一定精度損失的場(chǎng)景,TDengine提供TSZ(Time Series Compression)有損壓縮算法。
4.1 TSZ算法原理
TSZ基于預(yù)測(cè)模型,利用時(shí)序數(shù)據(jù)的趨勢(shì)特征進(jìn)行壓縮:
- 預(yù)測(cè)階段:根據(jù)歷史數(shù)據(jù)預(yù)測(cè)下一個(gè)值
- 殘差編碼:只存儲(chǔ)預(yù)測(cè)值與實(shí)際值的差值
- 精度控制:通過最大誤差閾值控制壓縮質(zhì)量
-- 啟用TSZ有損壓縮(創(chuàng)建數(shù)據(jù)庫時(shí))
CREATE DATABASE db PRECISION '1ms' COMPRESS 3;
-- 設(shè)置壓縮精度損失閾值
ALTER DATABASE db KEEP 365d;
4.2 TSZ適用場(chǎng)景
- 監(jiān)控指標(biāo)數(shù)據(jù)(允許微小誤差)
- 歷史歸檔數(shù)據(jù)
- 大規(guī)模傳感器數(shù)據(jù)采集
壓縮效果:TSZ算法可實(shí)現(xiàn)20:1至50:1的壓縮比,同時(shí)保持99%以上的數(shù)據(jù)精度。
五、傳輸壓縮:網(wǎng)絡(luò)帶寬優(yōu)化
除了存儲(chǔ)壓縮,TDengine還支持傳輸層壓縮,降低網(wǎng)絡(luò)帶寬消耗。
5.1 傳輸壓縮配置
-- 服務(wù)端配置(taos.cfg)
compressMsgSize 1024
-- 含義:消息大小超過1024字節(jié)時(shí)啟用壓縮
5.2 RESTful API壓縮
# 啟用gzip壓縮的RESTful請(qǐng)求
curl -H "Accept-Encoding: gzip" \
-H "Content-Type: application/json" \
http://localhost:6041/rest/sql/db \
-d "SELECT * FROM meters LIMIT 100"
5.3 WebSocket壓縮
// WebSocket連接啟用壓縮
const ws = new WebSocket('ws://localhost:6041/ws', {
perMessageDeflate: true
});
六、壓縮性能優(yōu)化實(shí)踐
6.1 壓縮算法選擇建議
| 數(shù)據(jù)特征 | 推薦算法 | 理由 |
|---|---|---|
| 高頻實(shí)時(shí)寫入 | LZ4 | 壓縮速度快,不影響寫入性能 |
| 歷史歸檔數(shù)據(jù) | XZ | 最大化壓縮比,節(jié)省存儲(chǔ)成本 |
| 通用場(chǎng)景 | ZSTD | 壓縮比與速度的最佳平衡 |
| 允許精度損失 | TSZ | 極致壓縮比 |
6.2 監(jiān)控壓縮效果
-- 查看數(shù)據(jù)庫占用空間
SELECT * FROM information_schema.ins_databases;
-- 查看超級(jí)表數(shù)據(jù)量
SELECT COUNT(*) FROM db.meters;
6.3 壓縮率優(yōu)化技巧
- 合理設(shè)置數(shù)據(jù)類型:使用最小的足夠數(shù)據(jù)類型
-- 推薦:使用TINYINT代替INT存儲(chǔ)小范圍整數(shù)
CREATE TABLE sensors (status TINYINT);
- 利用標(biāo)簽去重:將不變屬性放入標(biāo)簽而非列
-- 推薦做法
CREATE STABLE meters (ts TIMESTAMP, val FLOAT)
TAGS (device_id BINARY(20), location BINARY(50));
- 批量寫入:減少壓縮開銷,提高壓縮效率
七、總結(jié)
TDengine通過創(chuàng)新的兩級(jí)壓縮架構(gòu),將時(shí)序數(shù)據(jù)庫的存儲(chǔ)效率提升到了新的高度。一級(jí)壓縮利用數(shù)據(jù)類型特征實(shí)現(xiàn)高效編碼,二級(jí)壓縮通過通用算法進(jìn)一步壓縮體積,配合可選的TSZ有損壓縮,整體壓縮率可達(dá)原始數(shù)據(jù)的10%以內(nèi)。
在實(shí)際應(yīng)用中,建議根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的壓縮算法:實(shí)時(shí)性優(yōu)先選擇LZ4,存儲(chǔ)成本敏感選擇ZSTD或XZ,允許精度損失的場(chǎng)景可啟用TSZ算法。通過合理的壓縮配置,企業(yè)可在保證查詢性能的同時(shí),大幅降低時(shí)序數(shù)據(jù)的存儲(chǔ)成本。
TDengine作為國產(chǎn)開源時(shí)序數(shù)據(jù)庫的代表,其壓縮技術(shù)已達(dá)到業(yè)界領(lǐng)先水平,為物聯(lián)網(wǎng)、工業(yè)互聯(lián)網(wǎng)等海量數(shù)據(jù)場(chǎng)景提供了經(jīng)濟(jì)高效的存儲(chǔ)解決方案。



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



-1.png)




.png)


證.png)


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



