在使用(yong) TDengine 存(cun)儲(chu)時序數據(ju)(ju)時,壓(ya)縮數據(ju)(ju)以節省磁盤(pan)空間是(shi)至(zhi)關(guan)重要的。TDengine 支持(chi)用(yong)戶根據(ju)(ju)自身數據(ju)(ju)特性靈活指(zhi)定壓(ya)縮算法,從而實現更高效的存(cun)儲(chu)。然而,如何選(xuan)擇(ze)最(zui)合適(shi)的壓(ya)縮算法,才(cai)能最(zui)大限(xian)度地(di)降(jiang)低(di)存(cun)儲(chu)開(kai)銷?為了解決這一(yi)問題,我們特別(bie)推(tui)出了一(yi)個實用(yong)工具,幫助用(yong)戶快速判斷并選(xuan)擇(ze)最(zui)適(shi)合其數據(ju)(ju)特征(zheng)的壓(ya)縮算法。
本工具(ju)通過(guo)分析樣本數(shu)據(ju),提供最(zui)佳壓(ya)縮(suo)率(lv)的檢(jian)測(ce)結果,并同時輸出與之相(xiang)關(guan)(guan)的兩個(ge)關(guan)(guan)鍵性(xing)能指標:寫(xie)(xie)入速度和(he)查(cha)詢速度。由于寫(xie)(xie)入過(guo)程中(zhong)涉(she)及(ji)數(shu)據(ju)壓(ya)縮(suo),壓(ya)縮(suo)效(xiao)率(lv)越高(gao),寫(xie)(xie)入速度越快(kuai);而查(cha)詢過(guo)程中(zhong)則(ze)需(xu)要解壓(ya)數(shu)據(ju),解壓(ya)效(xiao)率(lv)越高(gao),查(cha)詢速度越快(kuai)。借助這些指標,用戶可以根據(ju)實(shi)際需(xu)求(qiu),在存儲(chu)效(xiao)率(lv)與訪問(wen)性(xing)能之間找到(dao)最(zui)佳平(ping)衡(heng),選擇最(zui)適合自(zi)己數(shu)據(ju)的壓(ya)縮(suo)算(suan)法。
下載和安裝
1. 本工具為開源工具,使用 python 編寫
2. 工具下載地址:
3. 本工具為綠色軟件,下載后即(ji)可使用,無需安裝(zhuang)
使用指南
文件說明
1. testCompression.py:主程序文件,運行時需依賴 json/template.json。
2. json 目錄:存放運行 taosBenchmark 所需的 JSON 和 CSV 文件。
3. json/tempalte.json:taosBenchmark 用于生成不同二級壓縮算法的模板文件,文件名固定不可修改,格式與使用方法詳見官網文檔://docs.yakult-sh.com.cn/reference/tools/taosbenchmark/。模板文件中使用宏 @COMPRESS 表示壓縮算法名。支持的四種壓縮算法分別為:zlib、xz、zstd、lz4,以及 disabled(關閉二級壓縮)。
4. d0_10w.csv.zip:測試樣本數據文件(10 萬條數據)。使用前需解壓至當前目錄,在 template.json 中有引用。
5. query.json:報告中 query-QPS 指標的來源,通過 taosBenchmark 測試查詢性能,使用可詳見官網taosBenchmark 使用說明。
6. generate.json:配置文件用于(yu)通過 taosBenchmark 生(sheng)成樣例數據 d0_10w.csv。可以修改(gai)此 json 生(sheng)成更大規(gui)模的數據集(ji)(如 100 萬(wan)或更多)。
使用步驟
1. 前置條件:
1)確認已安裝 TDengine 3.3.2.0 及以上版本
2)確認已安裝 python3
3)確認已安裝 TDegnine 的 python3 連接器 taospy
4)確認 taosd 服務已啟動,執行 taos 可正常連接 TDengine
5)確認 taosBenchmark(安裝包中(zhong)自(zi)帶) 能運行
2. 進入倉庫源碼目錄 testCompression3. 解壓 json/d0_10w.csv.zip 到當前 json 目錄,確認 d0_10w.csv 在 json 目錄下存在
4. 在 testCompression 目錄下執行 python3 ./testCompression.py 運行主程序啟動檢測
5. 輸(shu)出測試報告,測試完成。歷史測試報告記錄在(zai) ./result.txt
操作步驟如下:
# 安裝 TDengine python 連接器
pip3 install taospy
# 下載 TDengine 開源代碼倉庫
git clone //github.com/taosdata/TDengine.git
# 進入工具目錄
cd TDengine/tools/auto/testCompression
# 解壓測試樣本數據集
unzip json/d0_10w.csv.zip -d ./json/
# 運行主程序
python3 testCompression.py
# 查看測試報告
cat ./result.txt
輸出報告
為了檢測更精準,在上一步示例操作中(zhong)把 tempalte.json 文件中(zhong)子表(biao)數(shu) childtable_count 從(cong) 1 改(gai)為 10 ,數(shu)據規模擴大 10 倍到(dao) 100w 后得到(dao)的檢測數(shu)據如下——
數(shu)據分布說明:100w 數(shu)據是把 csv 文件中 10w 數(shu)據復制出 10 份放(fang)到 10 個子表中的

從結(jie)果可以看(kan)出,此樣本數據下最(zui)好的 xz 壓縮算法(fa)與最(zui)差(cha)的 lz4 之(zhi)間壓縮率差(cha)距還(huan)是很大的。
格式說明:
1. 第一(yi)行(xing)括號中的時(shi)間(jian)為(wei)測試開始時(shi)間(jian),最(zui)后一(yi)行(xing)為(wei)測試完(wan)成時(shi)間(jian)。
2. 2 ~ 4 行是記錄 taosBenchmark json 文件中的幾個重要信息,VGROUPD 數量,子(zi)表數量及生成子(zi)表行數。
3. 下面 5 ~ 10 行為報告內容,各列如下:
No:序號compress:壓縮算(suan)法(fa)dataSize磁(ci)盤(pan)上壓縮后(hou)數(shu)據文件大小rate:壓縮率writeSpeed: 寫(xie)入速度(du) (單位(wei):寫(xie)入行數(shu)/每秒)query-QPS: 查詢(xun) QPS(單位(wei):查詢(xun)請求(qiu)數(shu)/每秒),查詢(xun) sql 可在 json/query.json 中指定
4. 重點說下 rate (壓縮率)的計算:
分母:
1)對于固定長度數據類型,分母即約定的長度 bool ( 1 字節)tinyint ( 1 字節) smallint ( 2 字節) int ( 4 字節) 等
2)對于可變長度(du)(du)數(shu)據類型,如 varchar, binary , nchar 等(deng),分(fen)母是在建表(biao)時創建字(zi)段時指(zhi)定的長度(du)(du),如 varchar(12) 即(ji) 12 字(zi)節
分子:壓縮后數據的實際大小
此壓縮率是以超級表(biao)為統計(ji)(ji)單位(wei),統計(ji)(ji)的是超級表(biao)及其所有子表(biao)。
更換樣本
更換為自(zi)己的樣本數據(ju),需要修改(gai)以下幾處:
1. 更換 CSV 文件
若你的數據已在 TDegnine 中,可以通過 taos-CLI 工具導出。
重點強調下,一個 csv 文件中只能存放一張子表數據。
選擇一個最具代表數據特征的子表,假設為 d0,可以使用 select * from d0 >> d0.csv 命令完成導出,導出后的 csv 需刪除第一行(第一行是列名, 非數據,需刪除)。
步驟如下:
# taos-CLI 中導出表數據到 csv
select * from d0 >> d0.csv
# shell 中刪除 csv 首行
sed -i '1d' d0.csv
2. template.json 中做相應修改
1. “prepared_rand”: 100000 一定要改為大于或等于你的 CSV 文件行數
2. “sample_file”: “./json/d0_10w.csv” 改成你 csv 文件路徑
3. “use_sample_ts”: “yes”, 如果你的 csv 文件中第一列是時間主列,保持 yes 不動,即寫入數據的時間使 用 csv 文件中的第一列時間。如果你的 csv 文件沒有時間列的,改成 no,由 taosBenchmark 幫你生成時間列,生成時間的開始時間由”start_timestamp” 指定,步長由 “timestamp_step” 指定,每個子表生成的記錄數由 “insert_rows” 指定。
4. “childtable_count”: 1, CSV 文件寫入到幾個子表中,每個子表寫入數據都是和 CSV 中數據是相同的,填寫你期望的數量。
5. “columns”:更換成與你 CSV 文件中數據相匹(pi)配(pei)的列類型
示例:如你(ni)的 CSV 文件有 100 萬行(xing), 你(ni)希望(wang)能把寫入數(shu)據規模擴大 10 倍,那按照(zhao)如下代碼中藍色標記進行(xing)修(xiu)改即可:
{
"filetype": "insert",
...
"prepared_rand": 1000000,
"databases": [
{
"dbinfo": {
"name": "dbrate",
...
},
"super_tables": [
{
"name": "meters",
"childtable_count": 10,
"childtable_prefix": "d",
"insert_rows": 1000000,
...
}
]
}
]
}
檢測方法
1. 整體檢測
這(zhe)種(zhong)方(fang)式是通過按用戶實際建表(biao)結構和實際數據(ju)(ju)進行整(zheng)體壓縮率測試,上述示例即屬(shu)于這(zhe)種(zhong),一個 CSV 文件中混(hun)合著表(biao)的(de)所(suo)有(you)數據(ju)(ju)類型,對(dui)所(suo)有(you)數據(ju)(ju)類型整(zheng)體上評估最(zui)佳(jia)(jia)壓縮算法(fa)。該方(fang)法(fa)優點是操作簡單,檢測速(su)度快,但卻無法(fa)針(zhen)對(dui)不同(tong)數據(ju)(ju)類型的(de)列(lie)分別優化,可能會(hui)忽略各列(lie)數據(ju)(ju)類型對(dui)應的(de)最(zui)佳(jia)(jia)壓縮算法(fa)。
2. 單數據列檢測
單數(shu)據(ju)列檢(jian)測(ce)方式將用戶實際(ji)建表中的(de)所有列按數(shu)據(ju)類型(xing)分組(zu),例如,如果(guo)表中包含(han)四種數(shu)據(ju)類型(xing),則分為(wei)四組(zu),每組(zu)分別進行一次(ci)測(ce)試(shi)。該(gai)方法(fa)的(de)優勢在(zai)于,CSV 文(wen)件中僅保留時間(jian)列和(he)指定的(de)數(shu)據(ju)類型(xing)列,使(shi)得檢(jian)測(ce)結果(guo)更加(jia)精確,能夠準確找到(dao)該(gai)數(shu)據(ju)類型(xing)的(de)最佳壓縮率。但其缺點(dian)是需要進行多輪操作,增加(jia)了測(ce)試(shi)的(de)復雜性(xing)和(he)時間(jian)成本(ben)。
常見問題
1. 我的數據樣本應該多大合適?
原則上(shang),數(shu)據越(yue)大(da),檢測(ce)壓縮率越(yue)準確(que)。建議 CSV 文(wen)件的(de)行數(shu)不少(shao)于 1 萬(wan),寫入數(shu)據庫(ku)的(de)總行數(shu)不少(shao)于 100 萬(wan)。通過(guo)配置(zhi)多個子表寫入,可(ke)以(yi)進一步放大(da)樣本數(shu)量,提升測(ce)試(shi)的(de)精度。
2. 機動車我已知某列最佳壓縮算法,不想再每輪測試中再改變,怎么辦?
我們的(de)(de)目標是找出每列(lie)(lie)數據的(de)(de)最佳壓(ya)縮算(suan)法(fa)(fa)。當已知某列(lie)(lie)的(de)(de)最佳壓(ya)縮算(suan)法(fa)(fa)時,可(ke)在 template.json 中直接(jie)用具體(ti)算(suan)法(fa)(fa)名替換(huan) @COMPRESS 宏,這樣在測試過(guo)程中,該列(lie)(lie)的(de)(de)壓(ya)縮算(suan)法(fa)(fa)將保持不變。
3. TDengine 都支持哪些壓縮算法?
壓縮算法(fa)支持列表請參(can)考官網:
4. 如何在 template.json 中定義數據類型?
在 csv 測(ce)試樣本數據(ju)(ju)中,每一列數據(ju)(ju)都需要在 template.json 中聲明數據(ju)(ju)類(lei)型。可參(can)考 taosBenchmark 使用說明 最后一節的“數據(ju)(ju)類(lei)型書寫(xie)對照表”,確保數據(ju)(ju)類(lei)型定義正確:
結語
通過該工具,用戶可以更高效地測試并選擇最適合自身數據的壓縮算法,不僅提升存儲效率,還能在性能和存儲之間取得最佳平衡。無論是整體壓縮測試還是單數據列檢測,該工具都為不同需求提供了靈活的方案,幫助用戶快速找到解決方案。同時,如果您在使用過程中有任何疑問或遇到問題,歡迎訪問我們的開源社區: 與社區成員互動,或發送郵件至 kjduan@yakult-sh.com.cn 與我們聯系。


























