在學(xué)習(xí)關(guān)系數(shù)據(jù)庫(kù)的時(shí)候,很多教材都會(huì)提供一些經(jīng)典的例子,比如如何為學(xué)生建表,管理他們學(xué)習(xí)的科目、成績(jī)、綜合表現(xiàn)等,先從邏輯上分解定義庫(kù)、表,同時(shí)通過(guò)主鍵外鍵構(gòu)建起表與表之間的關(guān)系,然后轉(zhuǎn)換成具體的 SQL 語(yǔ)句,最后通過(guò)各類(lèi)關(guān)系運(yùn)算實(shí)現(xiàn)數(shù)據(jù)的增刪改查。
但是在使用時(shí)序數(shù)據(jù)庫(kù)(Time Series Database,TSDB)的時(shí)候,我們首先要面對(duì)的一個(gè)問(wèn)題就是如何建立數(shù)據(jù)模型(Data Model),也就是如何將業(yè)務(wù)邏輯中的實(shí)體數(shù)據(jù)具體映射到所選的時(shí)序庫(kù)。
而且出于對(duì)讀寫(xiě)性能、壓縮效率等目標(biāo)的權(quán)衡,不同的時(shí)序數(shù)據(jù)庫(kù)產(chǎn)品有可能會(huì)選擇不同的模型,這時(shí)候就要仔細(xì)分析了。本文將以 InfluxDB 和 TDengine 為例,對(duì)比學(xué)習(xí)一下它們的數(shù)據(jù)模型。
概述
InfluxDB 針對(duì)現(xiàn)實(shí)世界的測(cè)量值選擇了 bucket、measurement 這兩個(gè)核心概念,沒(méi)有關(guān)系數(shù)據(jù)庫(kù)里的 database、table 等概念;而 TDengine 選擇了兼容 SQL、降低門(mén)檻的路線,也就繼承了 database、table 等概念,同時(shí)創(chuàng)新性地提出了“一個(gè)數(shù)據(jù)采集點(diǎn)一張表”的數(shù)據(jù)模型。
InfluxDB 的數(shù)據(jù)模型
我們先來(lái)看看 InfluxDB 中的核心概念。根據(jù)其官方文檔:
InfluxDB 數(shù)據(jù)模型將時(shí)序數(shù)據(jù)組織為 bucket 和 measurement。一個(gè) bucket 可以包含多個(gè) measurement。measurement 可以包含多個(gè)標(biāo)簽和字段。
可以將 bucket 理解為存儲(chǔ)時(shí)序數(shù)據(jù)的位置,我們可以為其指定時(shí)序數(shù)據(jù)的保存策略。measurement 則用于時(shí)序數(shù)據(jù)的邏輯分組。從邏輯意義上對(duì)比,我們可以把 bucket 看作關(guān)系數(shù)據(jù)庫(kù)中的 database,把 measurement 看作 table。
measurement 又包括幾個(gè)部分:
- 標(biāo)簽(tag):其值不經(jīng)常改變的鍵值對(duì)。用來(lái)保存一些相對(duì)靜態(tài)的信息,比如采集設(shè)備的主機(jī)、位置、站點(diǎn)等。
- 字段(field):其值隨著時(shí)間經(jīng)常改變的鍵值對(duì),比如溫度、壓強(qiáng)、股價(jià)等。
- 時(shí)間戳(timestamp):與當(dāng)前數(shù)據(jù)關(guān)聯(lián)的時(shí)間戳。
在此基礎(chǔ)上,InfluxDB 又有兩個(gè)新的概念,point(數(shù)據(jù)點(diǎn))和時(shí)間線(series),當(dāng)然這在很多時(shí)序數(shù)據(jù)庫(kù)中都是類(lèi)似的。
整體來(lái)看,InfluxDB 的數(shù)據(jù)模型比較直觀,而且不需要提前定義好模式,容易上手,后期如果有需要,動(dòng)態(tài)增加新的字段也比較容易。當(dāng)然,考慮后續(xù)的查詢性能,在數(shù)據(jù)量非常大的情況下,也需要仔細(xì)設(shè)計(jì) measurement 中的 tag 和 field,在此就不做贅述。新用戶可以直接使用 InfluxDB 的圖形界面或命令行客戶端來(lái)創(chuàng)建 bucket,然后就可以利用行協(xié)議寫(xiě)入數(shù)據(jù)了。就像這樣:
influx write \
--bucket get-started \
--precision s "
home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000
home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000
home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600
home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600
home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200
home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200
home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800
"
在查詢方面,InfluxDB 提供了類(lèi) SQL 的 InfluxQL 語(yǔ)言,后來(lái)又推出了函數(shù)式的腳本語(yǔ)言 Flux。需要一定的學(xué)習(xí)成本。
TDengine 的數(shù)據(jù)模型
TDengine 充分利用了時(shí)序數(shù)據(jù)的特點(diǎn),提出了“一個(gè)數(shù)據(jù)采集點(diǎn)一張表”與“超級(jí)表”的概念,設(shè)計(jì)了創(chuàng)新的存儲(chǔ)引擎,讓數(shù)據(jù)的寫(xiě)入、查詢和存儲(chǔ)效率都得到極大的提升。
首先,TDengine 為了讓有數(shù)據(jù)庫(kù)經(jīng)驗(yàn)的從業(yè)者快速上手,直接選擇了以 SQL 為接口語(yǔ)言的設(shè)計(jì)策略。所謂“一個(gè)數(shù)據(jù)采集點(diǎn)一張表”,就是在設(shè)計(jì)數(shù)據(jù)模型時(shí),要對(duì)每個(gè)數(shù)據(jù)采集點(diǎn)單獨(dú)建一張表,用來(lái)存儲(chǔ)這個(gè)數(shù)據(jù)采集點(diǎn)所采集的時(shí)序數(shù)據(jù)。這種設(shè)計(jì)有幾大優(yōu)點(diǎn):
- 由于不同數(shù)據(jù)采集點(diǎn)產(chǎn)生數(shù)據(jù)的過(guò)程完全獨(dú)立,每個(gè)數(shù)據(jù)采集點(diǎn)的數(shù)據(jù)源是唯一的,一張表也就只有一個(gè)寫(xiě)入者,這樣就可采用無(wú)鎖方式來(lái)寫(xiě),寫(xiě)入速度就能大幅提升。
- 對(duì)于一個(gè)數(shù)據(jù)采集點(diǎn)而言,其產(chǎn)生的數(shù)據(jù)是按照時(shí)間排序的,因此寫(xiě)的操作可用追加的方式實(shí)現(xiàn),進(jìn)一步大幅提高數(shù)據(jù)寫(xiě)入速度。
- 一個(gè)數(shù)據(jù)采集點(diǎn)的數(shù)據(jù)是以塊為單位連續(xù)存儲(chǔ)的。如果讀取一個(gè)時(shí)間段的數(shù)據(jù),它能大幅減少隨機(jī)讀取操作,成數(shù)量級(jí)的提升讀取和查詢速度。
- 一個(gè)數(shù)據(jù)塊內(nèi)部,采用列式存儲(chǔ),對(duì)于不同數(shù)據(jù)類(lèi)型,采用不同壓縮算法,而且由于一個(gè)數(shù)據(jù)采集點(diǎn)的采集量的變化是緩慢的,壓縮率更高。
由于一個(gè)數(shù)據(jù)采集點(diǎn)一張表,導(dǎo)致表的數(shù)量巨增,難以管理,而且應(yīng)用經(jīng)常需要做采集點(diǎn)之間的聚合操作,聚合的操作也變得復(fù)雜起來(lái)。為解決這個(gè)問(wèn)題,TDengine 引入了超級(jí)表(Super Table,簡(jiǎn)稱(chēng)為 STable)的概念。在 TDengine 的設(shè)計(jì)里,表用來(lái)代表一個(gè)具體的數(shù)據(jù)采集點(diǎn),超級(jí)表用來(lái)代表一組相同類(lèi)型的數(shù)據(jù)采集點(diǎn)集合。
所以在使用 TDengine 時(shí),我們要先創(chuàng)建庫(kù)(database),再創(chuàng)建超級(jí)表,然后為具體的數(shù)據(jù)采集點(diǎn)創(chuàng)建子表。從創(chuàng)建到管理數(shù)據(jù),都可用自己熟悉的 SQL 語(yǔ)法。TDengine 3.0 新增的流式計(jì)算語(yǔ)法,也是直接擴(kuò)充了 SQL,很容易上手。
當(dāng)然,硬幣總有兩面。TDengine 為了性能選擇了這樣的設(shè)計(jì),但是像 InfluxDB 的無(wú)模式操作,實(shí)現(xiàn)起來(lái)就要復(fù)雜一些。不過(guò) TDengine 也通過(guò)內(nèi)部功能提供了無(wú)模式寫(xiě)入功能。
本文簡(jiǎn)單對(duì)比了 InfluxDB 和 TDengine 的數(shù)據(jù)模型??偨Y(jié)而言,如果沒(méi)有數(shù)據(jù)庫(kù)相關(guān)背景,InfluxDB 上手比較直觀;如果有 SQL 經(jīng)驗(yàn),甚至在業(yè)務(wù)中已經(jīng)用 MySQL 等關(guān)系數(shù)據(jù)庫(kù)處理過(guò)時(shí)序數(shù)據(jù),則 TDengine 更為友好。



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



-1.png)




.png)


證.png)


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



