无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

TDengine架構設計與存儲結構

Hongze Cheng

2019-07-11 / ,

TDengine是一款輕量級、高效且單機開源的面向物聯網的數據處理引擎,其核心是一個時序數據庫(Time-Series Database)。作為(wei)一款專門(men)為(wei)物(wu)聯網(wang)設計并實現的(de)數(shu)據(ju)引擎,TDengine在(zai)數(shu)據(ju)的(de)寫入、查詢以及(ji)存(cun)儲(chu)方(fang)面(mian)擁有(you)其他數(shu)據(ju)庫無法比擬的(de)優勢。本文主要探討(tao)了TDengine在(zai)架構(gou)設計和(he)存(cun)儲(chu)方(fang)面(mian)的(de)創新,以方(fang)便用(yong)戶理解TDengine強大性能背后的(de)邏輯。

TDengine架構設計

如圖1所示,TDengine服務主要包含兩大模塊:管理節點模塊(MGMT)數據節點模塊(DNODE)。整個TDengine還包含客戶端模塊

TDengine Database
圖 1 TDengine架構示意圖

管理節點模塊

管(guan)理節(jie)點(dian)模(mo)塊主要負責元(yuan)數(shu)(shu)(shu)據(ju)的存儲和(he)(he)(he)(he)查詢(xun)(xun)等(deng)工(gong)作(zuo),其中包括(kuo)用戶信息的管(guan)理、數(shu)(shu)(shu)據(ju)庫(ku)和(he)(he)(he)(he)表信息的創(chuang)建、刪(shan)除以及查詢(xun)(xun)等(deng)。應用連接TDengine時(shi)(shi)會首(shou)先連接到管(guan)理節(jie)點(dian)。在創(chuang)建/刪(shan)除數(shu)(shu)(shu)據(ju)庫(ku)和(he)(he)(he)(he)表時(shi)(shi),請求也會首(shou)先發送請求到管(guan)理節(jie)點(dian)模(mo)塊。由(you)管(guan)理節(jie)點(dian)模(mo)塊首(shou)先創(chuang)建/刪(shan)除元(yuan)數(shu)(shu)(shu)據(ju)信息,然后發送請求到數(shu)(shu)(shu)據(ju)節(jie)點(dian)模(mo)塊進行分配(pei)/刪(shan)除所(suo)需要的資源(yuan)。在數(shu)(shu)(shu)據(ju)寫入和(he)(he)(he)(he)查詢(xun)(xun)時(shi)(shi),應用同樣會首(shou)先訪(fang)問(wen)(wen)管(guan)理節(jie)點(dian)模(mo)塊,獲取(qu)元(yuan)數(shu)(shu)(shu)據(ju)信息。然后根據(ju)元(yuan)數(shu)(shu)(shu)據(ju)管(guan)理信息訪(fang)問(wen)(wen)數(shu)(shu)(shu)據(ju)節(jie)點(dian)模(mo)塊。

數據節點模塊

寫入(ru)數(shu)(shu)據(ju)(ju)的(de)(de)存(cun)儲(chu)和查詢(xun)工作(zuo)是(shi)(shi)由數(shu)(shu)據(ju)(ju)節(jie)點(dian)模(mo)塊負(fu)責。 為了(le)更(geng)高(gao)效地(di)利用資(zi)源,以及方便將來進行水平擴展(zhan),TDengine內部對數(shu)(shu)據(ju)(ju)節(jie)點(dian)進行了(le)虛(xu)(xu)擬(ni)化,引入(ru)了(le)虛(xu)(xu)擬(ni)節(jie)點(dian)(vnode)的(de)(de)概念,作(zuo)為存(cun)儲(chu)、資(zi)源分配以及數(shu)(shu)據(ju)(ju)備(bei)份(商業版本(ben)中(zhong)(zhong))的(de)(de)單元。如圖2所(suo)示,在(zai)一個(ge)dnode上(shang)(shang),通過虛(xu)(xu)擬(ni)化,可(ke)以將該dnode視為多個(ge)虛(xu)(xu)擬(ni)節(jie)點(dian)的(de)(de)集合。每個(ge)虛(xu)(xu)擬(ni)節(jie)點(dian)存(cun)儲(chu)一定數(shu)(shu)量的(de)(de)表(biao)中(zhong)(zhong)的(de)(de)數(shu)(shu)據(ju)(ju)。不(bu)同的(de)(de)vnode之間資(zi)源互(hu)不(bu)共享(xiang)。每個(ge)虛(xu)(xu)擬(ni)節(jie)點(dian)都(dou)有自己(ji)(ji)的(de)(de)緩存(cun),在(zai)硬盤上(shang)(shang)也有自己(ji)(ji)的(de)(de)存(cun)儲(chu)目錄。而(er)同一vnode內部無論是(shi)(shi)緩存(cun)還是(shi)(shi)硬盤的(de)(de)存(cun)儲(chu)都(dou)是(shi)(shi)共享(xiang)的(de)(de)。通過虛(xu)(xu)擬(ni)化,TDengine可(ke)以將dnode上(shang)(shang)有限(xian)的(de)(de)物理資(zi)源合理地(di)分配給不(bu)同的(de)(de)vnode,大(da)(da)大(da)(da)提高(gao)資(zi)源的(de)(de)利用率和并發(fa)度。一臺物理機器上(shang)(shang)的(de)(de)虛(xu)(xu)擬(ni)節(jie)點(dian)個(ge)數(shu)(shu)可(ke)以根據(ju)(ju)其硬件資(zi)源進行配置(zhi)。

TDengine Database
圖 2 TDengine虛擬化

客戶端模塊

TDengine客(ke)戶(hu)端(duan)模(mo)(mo)塊(kuai)主要(yao)負責將應(ying)用傳來的請求(SQL語句)進行(xing)解(jie)析,轉化為內部結構(gou)體再發送到服務(wu)端(duan)。TDengine的各種接口都是基于TDengine的客(ke)戶(hu)端(duan)模(mo)(mo)塊(kuai)進行(xing)開發的。

TDengine寫入流程

TDengine的完整寫(xie)入流程如圖3所示(shi)。為了(le)保證(zheng)寫(xie)入數(shu)(shu)(shu)(shu)據(ju)的安全性和完整性,TDengine在寫(xie)入數(shu)(shu)(shu)(shu)據(ju)時(shi)采用[預(yu)(yu)寫(xie)日志算(suan)法]。客(ke)戶(hu)端發來(lai)的數(shu)(shu)(shu)(shu)據(ju)在經過驗證(zheng)以后,首先會寫(xie)入預(yu)(yu)寫(xie)日志中(zhong),以保證(zheng)TDengine能夠(gou)在斷電等因素導致(zhi)的服務重啟時(shi)從(cong)預(yu)(yu)寫(xie)日志中(zhong)恢復(fu)數(shu)(shu)(shu)(shu)據(ju),避(bi)免數(shu)(shu)(shu)(shu)據(ju)的丟失。寫(xie)入預(yu)(yu)寫(xie)日志后,數(shu)(shu)(shu)(shu)據(ju)會被寫(xie)到對應的vnode的緩(huan)存(cun)(cun)中(zhong)。隨后,服務端會發送確認信息給客(ke)戶(hu)端表示(shi)寫(xie)入成功。TDengine中(zhong)存(cun)(cun)在兩種機制可以促(cu)使緩(huan)存(cun)(cun)中(zhong)的數(shu)(shu)(shu)(shu)據(ju)寫(xie)入到硬盤上進行持久化存(cun)(cun)儲:

TDengine Database
圖 3 TDengine寫入流程
  1. 時間驅動的落盤:TDengine服務會定時將vnode緩存中的數據寫入到硬盤上,默認為一個小時落一次盤。落盤間隔可在配置文件中配置。
  2. 數據驅動的落盤:當vnode中緩存的數據達到一定規模時,為了不阻塞后續數據的寫入,TDengine也會拉起落盤線程將緩存中的數據清空。數據驅動的落盤會刷新定時落盤的時間。

TDengine在數據落盤時會打開新的預寫日志文(wen)件(jian),在落盤后則(ze)會刪(shan)除老的預寫日志文(wen)件(jian),避免日志文(wen)件(jian)無(wu)限(xian)制的增長。

元數據的存儲

TDengine中的元數據信息包括TDengine中的數據庫,表等信息。元數據信息默認存放在 /var/lib/taos/mgmt/ 文件夾下。

/var/lib/taos/
       +--mgmt/
           +--db.db
           +--meters.db
           +--user.db
           +--vgroups.db

元數據(ju)(ju)文件(jian)只(zhi)進行(xing)追加(jia)操作,即(ji)便是元數據(ju)(ju)的(de)刪(shan)除,也(ye)只(zhi)是在數據(ju)(ju)文件(jian)中追加(jia)一條刪(shan)除的(de)記錄。

寫入數據的存儲

TDengine中(zhong)(zhong)寫入的(de)(de)數據(ju)(ju)在硬盤上是(shi)按時間維(wei)度進行分片的(de)(de)。同一個(ge)vnode中(zhong)(zhong)的(de)(de)表在同一時間范圍內的(de)(de)數據(ju)(ju)都存放(fang)在同一文件(jian)組中(zhong)(zhong),如(ru)下圖中(zhong)(zhong)的(de)(de)v0f1804*文件(jian)。這一數據(ju)(ju)分片方式可(ke)以大大簡化數據(ju)(ju)在時間維(wei)度的(de)(de)查(cha)詢,提高(gao)查(cha)詢速度。在默認配(pei)置下,硬盤上的(de)(de)每個(ge)文件(jian)存放(fang)10天數據(ju)(ju)。用戶可(ke)根據(ju)(ju)需(xu)要進行配(pei)置。

數(shu)據在(zai)文件中(zhong)(zhong)是(shi)按(an)塊存(cun)儲(chu)的(de)(de)(de)。每個數(shu)據塊只包含(han)一張(zhang)表的(de)(de)(de)數(shu)據,且數(shu)據是(shi)按(an)照時間主鍵(jian)遞(di)增排(pai)列的(de)(de)(de)。數(shu)據在(zai)數(shu)據塊中(zhong)(zhong)按(an)列存(cun)儲(chu),這樣使(shi)得同類型(xing)的(de)(de)(de)數(shu)據存(cun)放在(zai)一起,可以大大提(ti)高壓縮(suo)的(de)(de)(de)比例,節省存(cun)儲(chu)空間。

TDengine的數據文件默認存放在 /var/lib/taos/data/ 下。而 /var/lib/taos/tsdb/ 文件夾下存放了vnode的(de)信息、vnode中表(biao)的(de)信息以(yi)及數據文件的(de)鏈接(jie)。完整目錄結構如下所(suo)示(shi):

/var/lib/taos/
       +--tsdb/
       |   +--vnode0
       |        +--meterObj.v0
       |        +--db/
       |            +--v0f1804.head->/var/lib/taos/data/vnode0/v0f1804.head1
       |            +--v0f1804.data->/var/lib/taos/data/vnode0/v0f1804.data
       |            +--v0f1804.last->/var/lib/taos/data/vnode0/v0f1804.last1
       |            +--v0f1805.head->/var/lib/taos/data/vnode0/v0f1805.head1
       |            +--v0f1805.data->/var/lib/taos/data/vnode0/v0f1805.data
       |            +--v0f1805.last->/var/lib/taos/data/vnode0/v0f1805.last1
       |                   :
       +--data/
           +--vnode0/
                 +--v0f1804.head1
                 +--v0f1804.data
                 +--v0f1804.last1
                 +--v0f1805.head1
                 +--v0f1805.data
                 +--v0f1805.last1
                         :

meterObj文件

每個vnode中(zhong)只存在一個meterObj文件。該文件中(zhong)存儲(chu)了(le)vnode的(de)基本信息(xi)(xi)(創建(jian)時間,配置信息(xi)(xi),vnode的(de)統計(ji)信息(xi)(xi)等)以及該vnode中(zhong)表(biao)的(de)信息(xi)(xi)。其結構如(ru)下所示:

<文件開始>
 [文件頭]
 [表記錄1偏移量和長度]
 [表記錄2偏移量和長度]
 …
 [表記錄N偏移量和長度]
 [表記錄1]
 [表記錄2]
 …
 [表記錄N]
 [表記錄]
 <文件結尾>

其中,文件頭大小為512字節,主要存放(fang)vnode的(de)基本信息(xi)。每條表(biao)(biao)記錄(lu)代(dai)表(biao)(biao)屬于(yu)該vnode中的(de)一張表(biao)(biao)在硬盤上的(de)表(biao)(biao)示。

head文件

head文件(jian)(jian)中存放了(le)其(qi)對(dui)應的data文件(jian)(jian)中數據塊的索引信息。該文件(jian)(jian)組織形式如(ru)下:

<文件開始>
 [文件頭]
 [表1偏移量]
 [表2偏移量]
 …
 [表N偏移量]
 [表1數據索引]
 [表2數據索引]
 …
 [表N數據索引]
 <文件結尾>

文(wen)件開頭的(de)(de)偏(pian)移(yi)(yi)量列表(biao)表(biao)示對應表(biao)的(de)(de)數(shu)據索引塊的(de)(de)開始位置在文(wen)件中的(de)(de)偏(pian)移(yi)(yi)量。每(mei)張表(biao)的(de)(de)數(shu)據索引信息在head文(wen)件中都是連(lian)續存(cun)放的(de)(de)。這(zhe)也使得TDengine在讀(du)取(qu)單表(biao)數(shu)據時(shi),可以將該(gai)表(biao)所(suo)有的(de)(de)數(shu)據塊索引一次性讀(du)入內存(cun),大大提高讀(du)取(qu)速(su)度(du)。表(biao)的(de)(de)數(shu)據索引塊組織如下:

[索引塊信息]
 [數據塊1索引]
 [數據塊2索引]
 …
 [數據塊N索引]

其中(zhong),索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)塊(kuai)(kuai)(kuai)信(xin)息中(zhong)記(ji)(ji)錄(lu)了數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)的(de)個(ge)數(shu)等描述(shu)信(xin)息。每個(ge)數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)對應(ying)一(yi)個(ge)在(zai)(zai)data文(wen)件(jian)或last文(wen)件(jian)中(zhong)的(de)一(yi)個(ge)單獨的(de)數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)。索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)信(xin)息中(zhong)記(ji)(ji)錄(lu)了數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)存放的(de)文(wen)件(jian)、數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)起始位置的(de)偏移(yi)量、數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)中(zhong)數(shu)據(ju)(ju)(ju)(ju)(ju)時間主鍵的(de)范(fan)圍(wei)等。索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)塊(kuai)(kuai)(kuai)中(zhong)的(de)數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)是(shi)按照時間范(fan)圍(wei)順序(xu)排(pai)(pai)放的(de),這也就(jiu)是(shi)說(shuo),索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)塊(kuai)(kuai)(kuai)M對應(ying)的(de)數(shu)據(ju)(ju)(ju)(ju)(ju)塊(kuai)(kuai)(kuai)中(zhong)的(de)數(shu)據(ju)(ju)(ju)(ju)(ju)時間范(fan)圍(wei)都大(da)(da)于索(suo)(suo)(suo)(suo)引(yin)(yin)(yin)塊(kuai)(kuai)(kuai)M-1的(de)。這種預(yu)先排(pai)(pai)序(xu)的(de)存儲方式(shi)使得在(zai)(zai)TDengine在(zai)(zai)進行(xing)按照時間戳進行(xing)查(cha)(cha)詢時可以使用折半查(cha)(cha)找(zhao)算法,大(da)(da)大(da)(da)提高(gao)查(cha)(cha)詢速度。

data文件

data文(wen)件中存放(fang)了真實的(de)數據(ju)塊(kuai)。該(gai)文(wen)件只進行追加操作。其文(wen)件組(zu)織形(xing)式如下(xia):

<文件開始>
 [文件頭]
 [數據塊1]
 [數據塊2]
 …
 [數據塊N]
 <文件結尾>

每(mei)個數(shu)(shu)(shu)據(ju)塊(kuai)(kuai)只屬于vnode中(zhong)(zhong)(zhong)的(de)(de)一張表(biao),且數(shu)(shu)(shu)據(ju)塊(kuai)(kuai)中(zhong)(zhong)(zhong)的(de)(de)數(shu)(shu)(shu)據(ju)按照時間主鍵排(pai)列(lie)。數(shu)(shu)(shu)據(ju)塊(kuai)(kuai)中(zhong)(zhong)(zhong)的(de)(de)數(shu)(shu)(shu)據(ju)按列(lie)組織排(pai)放(fang),使(shi)得同一類型的(de)(de)數(shu)(shu)(shu)據(ju)排(pai)放(fang)在一起,方(fang)便壓縮和讀取。每(mei)個數(shu)(shu)(shu)據(ju)塊(kuai)(kuai)的(de)(de)組織形式如(ru)下所示:

[列1信息]
 [列2信息]
 …
 [列N信息]
 [列1數據]
 [列2數據]
 …
 [列N數據]

列(lie)(lie)(lie)信息(xi)中包含該(gai)列(lie)(lie)(lie)的(de)類(lei)型,列(lie)(lie)(lie)的(de)壓縮算法,列(lie)(lie)(lie)數(shu)據(ju)(ju)在文件中的(de)偏移(yi)量以(yi)及長度等。除(chu)此之(zhi)外,列(lie)(lie)(lie)信息(xi)中也(ye)包含該(gai)內(nei)存塊中該(gai)列(lie)(lie)(lie)數(shu)據(ju)(ju)的(de)預(yu)計(ji)算結(jie)果(guo),從而在過濾查詢時(shi)根據(ju)(ju)預(yu)計(ji)算結(jie)果(guo)判(pan)定是否(fou)讀(du)取(qu)數(shu)據(ju)(ju)塊,大(da)大(da)提高讀(du)取(qu)速度。

last文件

為了防止數(shu)(shu)(shu)據(ju)塊的(de)(de)碎片化,提高查詢速度和壓縮(suo)率,TDengine引入(ru)(ru)(ru)了last文(wen)件(jian)(jian)。當要(yao)落(luo)盤(pan)的(de)(de)數(shu)(shu)(shu)據(ju)塊中(zhong)的(de)(de)數(shu)(shu)(shu)據(ju)條數(shu)(shu)(shu)低于某個閾值時,TDengine會(hui)(hui)先將(jiang)該數(shu)(shu)(shu)據(ju)塊寫(xie)入(ru)(ru)(ru)到last文(wen)件(jian)(jian)中(zhong)進行暫時存(cun)儲(chu)。當有新的(de)(de)數(shu)(shu)(shu)據(ju)需(xu)要(yao)落(luo)盤(pan)時,last文(wen)件(jian)(jian)中(zhong)的(de)(de)數(shu)(shu)(shu)據(ju)會(hui)(hui)被讀取出來與新數(shu)(shu)(shu)據(ju)組(zu)成新的(de)(de)數(shu)(shu)(shu)據(ju)塊寫(xie)入(ru)(ru)(ru)到data文(wen)件(jian)(jian)中(zhong)。last文(wen)件(jian)(jian)的(de)(de)組(zu)織形式與data文(wen)件(jian)(jian)類似(si)。

小結

TDengine通過其創(chuang)新的(de)架構(gou)和存儲(chu)結(jie)構(gou)設計,有效提高了計算(suan)機(ji)資源的(de)使用率。一方面(mian),TDengine的(de)虛擬化(hua)使得TDengine的(de)水(shui)平擴展及(ji)備份非常容(rong)易(yi)。另(ling)一方面(mian),TDengine將(jiang)表中數據按時(shi)間主鍵排序(xu)存儲(chu)且其列式存儲(chu)的(de)組織(zhi)形式都(dou)使TDengine在寫(xie)入、查詢以及(ji)壓縮方面(mian)擁有非常大的(de)優勢。