1: 集群與主要邏輯單元
TDengine Database是(shi)(shi)(shi)基于硬件(jian)、軟件(jian)系(xi)統(tong)(tong)不可(ke)(ke)靠(kao)、一定會有故障的(de)(de)(de)假(jia)設(she)進行(xing)(xing)設(she)計(ji)(ji)的(de)(de)(de),是(shi)(shi)(shi)基于任(ren)何(he)單臺(tai)(tai)計(ji)(ji)算(suan)機都(dou)無足夠能(neng)力處理海量數(shu)(shu)據的(de)(de)(de)假(jia)設(she)進行(xing)(xing)設(she)計(ji)(ji)的(de)(de)(de)。因(yin)此TDengine Database從研發(fa)的(de)(de)(de)第一天起(qi),就(jiu)按照(zhao)分布式高(gao)可(ke)(ke)靠(kao)架構進行(xing)(xing)設(she)計(ji)(ji),是(shi)(shi)(shi)完(wan)全去中心化的(de)(de)(de),是(shi)(shi)(shi)水平(ping)擴(kuo)展(zhan)的(de)(de)(de),這樣(yang)任(ren)何(he)單臺(tai)(tai)或多臺(tai)(tai)服(fu)(fu)務器宕機或軟件(jian)錯(cuo)誤都(dou)不影響(xiang)系(xi)統(tong)(tong)的(de)(de)(de)服(fu)(fu)務。通過節點虛(xu)擬化并(bing)輔以自(zi)動化負載均(jun)衡技術,TDengine Database能(neng)最大限(xian)度地利用異(yi)構集群中的(de)(de)(de)計(ji)(ji)算(suan)和(he)(he)存儲資源。而且(qie)只要數(shu)(shu)據副(fu)本數(shu)(shu)大于一,無論是(shi)(shi)(shi)硬軟件(jian)的(de)(de)(de)升級、還(huan)是(shi)(shi)(shi)IDC的(de)(de)(de)遷移等都(dou)無需停(ting)止集群的(de)(de)(de)服(fu)(fu)務,極大地保證系(xi)統(tong)(tong)的(de)(de)(de)正常運(yun)行(xing)(xing),并(bing)且(qie)降低(di)了系(xi)統(tong)(tong)管理員和(he)(he)運(yun)維人員的(de)(de)(de)工作量。
下面(mian)的示例圖上有八個物理節點(dian),每(mei)個物理節點(dian)被邏輯(ji)的劃(hua)分為多(duo)個虛(xu)擬節點(dian)。下面(mian)對系統的基本概念進行介紹。

物理節點(dnode):集群中的一物理服務器或云平臺上的一虛擬機。為安全以及通訊效率,一個物理節點可配置兩張網卡,或兩個IP地址。其中一張網卡用于集群內部通訊,其IP地址為privateIp, 另外一張網卡用于與集群外部應用的通訊,其IP地址為publicIp。在一些云平臺(如阿里云),對外的IP地址是映射過來的,因此publicIp還有一個對應的內部IP地址internalIp(與privateIp不同)。對于只(zhi)有(you)一(yi)個(ge)IP地址的物理節點,publicIp, privateIp以及internalIp都是(shi)同一(yi)個(ge)地址,沒有(you)任何區別。一(yi)個(ge)dnode上有(you)而(er)且(qie)只(zhi)有(you)一(yi)個(ge)taosd實例(li)運(yun)行(xing)。
虛擬數據節點(vnode):在(zai)物(wu)理節點(dian)(dian)之上(shang)的(de)(de)可獨(du)立運行的(de)(de)基礎邏輯(ji)單(dan)元,時(shi)(shi)序數據(ju)寫入、存儲、查詢等操(cao)作邏輯(ji)都(dou)在(zai)虛擬節點(dian)(dian)中進行(圖中V),采集的(de)(de)時(shi)(shi)序數據(ju)就存儲在(zai)vnode上(shang)。一(yi)個(ge)(ge)(ge)(ge)vnode包含固定數量的(de)(de)表。當(dang)創建一(yi)張新(xin)表時(shi)(shi),系統會檢查是否(fou)需要(yao)創建新(xin)的(de)(de)vnode。一(yi)個(ge)(ge)(ge)(ge)物(wu)理節點(dian)(dian)上(shang)能創建的(de)(de)vnode的(de)(de)數量取決于物(wu)理節點(dian)(dian)的(de)(de)硬(ying)件資源。一(yi)個(ge)(ge)(ge)(ge)vnode只屬于一(yi)個(ge)(ge)(ge)(ge)DB,但(dan)一(yi)個(ge)(ge)(ge)(ge)DB可以(yi)有多個(ge)(ge)(ge)(ge)vnode。
虛擬數據節點組(vgroup):位于(yu)不同(tong)(tong)物理(li)節(jie)點(dian)(dian)的(de)vnode可(ke)以(yi)組成一(yi)(yi)個(ge)虛擬(ni)數(shu)據(ju)(ju)(ju)節(jie)點(dian)(dian)組vnode group(如(ru)上圖dnode0中(zhong)的(de)V0, dnode1中(zhong)的(de)V1, dnode6中(zhong)的(de)V2屬于(yu)同(tong)(tong)一(yi)(yi)個(ge)虛擬(ni)節(jie)點(dian)(dian)組)。歸(gui)屬于(yu)同(tong)(tong)一(yi)(yi)個(ge)vgroup的(de)虛擬(ni)節(jie)點(dian)(dian)采取(qu)master/slave的(de)方(fang)式(shi)(shi)進行(xing)管(guan)理(li)。寫只能(neng)(neng)在master上進行(xing),但采用asynchronous的(de)方(fang)式(shi)(shi)將數(shu)據(ju)(ju)(ju)同(tong)(tong)步(bu)到(dao)slave,這樣(yang)確保了一(yi)(yi)份數(shu)據(ju)(ju)(ju)在多個(ge)物理(li)節(jie)點(dian)(dian)上有拷貝。如(ru)果(guo)master節(jie)點(dian)(dian)宕機,其他(ta)節(jie)點(dian)(dian)監測(ce)到(dao)后,將重新選舉vgroup里(li)(li)的(de)master, 新的(de)master能(neng)(neng)繼續處理(li)數(shu)據(ju)(ju)(ju)請(qing)求,從而保證(zheng)系(xi)統(tong)運行(xing)的(de)可(ke)靠性(xing)。一(yi)(yi)個(ge)vgroup里(li)(li)虛擬(ni)節(jie)點(dian)(dian)個(ge)數(shu)就(jiu)是數(shu)據(ju)(ju)(ju)的(de)副(fu)本(ben)數(shu)。如(ru)果(guo)一(yi)(yi)個(ge)DB的(de)副(fu)本(ben)數(shu)為N,系(xi)統(tong)必須有至少N個(ge)物理(li)節(jie)點(dian)(dian)。副(fu)本(ben)數(shu)在創建DB時通過(guo)參數(shu)replica可(ke)以(yi)指定,缺省為1。使用TDengine, 數(shu)據(ju)(ju)(ju)的(de)安(an)全依靠多副(fu)本(ben)解決,因此不再需要昂貴的(de)磁(ci)盤陣列等存儲設備(bei)。
虛擬管理節點(mnode):負責所(suo)有(you)(you)節點運行狀態(tai)的監(jian)控和維(wei)護,以及節點之間的負載均衡(圖(tu)中(zhong)M)。同時(shi),虛(xu)擬(ni)管(guan)理(li)節點也負責元數(shu)據(ju)(ju)(包括用戶、數(shu)據(ju)(ju)庫、表、靜態(tai)標(biao)簽等(deng))的存儲和管(guan)理(li),因此也稱(cheng)為(wei)Meta Node。TDengine集群中(zhong)可(ke)配置多個(ge)(最多不超過5個(ge)) mnode,它們自(zi)動(dong)構建成為(wei)一個(ge)管(guan)理(li)節點集群(圖(tu)中(zhong)M0, M1, M2)。mnode間采用master/slave的機制進行管(guan)理(li),而且(qie)采取強一致方式進行數(shu)據(ju)(ju)同步。mnode集群的創建由系統自(zi)動(dong)完成,無需(xu)人工干預。每個(ge)dnode上至多有(you)(you)一個(ge)mnode,而且(qie)每個(ge)dnode都知道整個(ge)集群中(zhong)所(suo)有(you)(you)mnode的IP地址。
taosc:一個(ge)(ge)軟(ruan)件模塊,是(shi)TDengine給應(ying)用(yong)提(ti)供的(de)(de)(de)驅(qu)動程(cheng)序(driver),內嵌于(yu)JDBC、ODBC driver中,或者(zhe)C語(yu)言連接(jie)庫里。應(ying)用(yong)都是(shi)通(tong)過taosc而不是(shi)直接(jie)來與整個(ge)(ge)集(ji)群(qun)進行(xing)交互(hu)的(de)(de)(de)。這(zhe)個(ge)(ge)模塊負(fu)責(ze)獲取并緩(huan)存元數據;將插(cha)入、查詢等請求轉發到正確的(de)(de)(de)虛擬節(jie)點(dian);在(zai)把結果返回(hui)給應(ying)用(yong)時,還需要負(fu)責(ze)最后一級的(de)(de)(de)聚合、排序、過濾等操作。對于(yu)JDBC, ODBC, C/C++接(jie)口(kou)而言,這(zhe)個(ge)(ge)模塊是(shi)在(zai)應(ying)用(yong)所處(chu)的(de)(de)(de)計算(suan)機上運行(xing),但消耗(hao)的(de)(de)(de)資源很小。為支持全分(fen)布式的(de)(de)(de)REST接(jie)口(kou),taosc在(zai)TDengine集(ji)群(qun)的(de)(de)(de)每(mei)個(ge)(ge)dnode上都有(you)一運行(xing)實例。
對外服務地址:TDengine集(ji)群(qun)可(ke)以容納(na)單(dan)臺(tai)、多(duo)臺(tai)甚至幾千臺(tai)物理(li)節(jie)點(dian)。應用只需要向集(ji)群(qun)中任何一個物理(li)節(jie)點(dian)的(de)publicIp發起連接即可(ke)。啟動CLI應用taos時,選(xuan)項-h需要提(ti)供的(de)就(jiu)是(shi)publicIp。
master/secondIp:每一(yi)(yi)個dnode都需要配置一(yi)(yi)個masterIp。dnode啟(qi)動(dong)后,將(jiang)對配置的(de)(de)(de)masterIp發(fa)起加入集群(qun)的(de)(de)(de)連(lian)(lian)接(jie)請(qing)求。masterIp是(shi)已經創(chuang)建的(de)(de)(de)集群(qun)中的(de)(de)(de)任何一(yi)(yi)個節(jie)點(dian)(dian)的(de)(de)(de)privateIp,對于集群(qun)中的(de)(de)(de)第一(yi)(yi)個節(jie)點(dian)(dian),就是(shi)它自己的(de)(de)(de)privateIp。為(wei)保證連(lian)(lian)接(jie)成功,每個dnode還可(ke)配置secondIp, 該IP地址也是(shi)已創(chuang)建的(de)(de)(de)集群(qun)中的(de)(de)(de)任何一(yi)(yi)個節(jie)點(dian)(dian)的(de)(de)(de)privateIp。如果一(yi)(yi)個節(jie)點(dian)(dian)連(lian)(lian)接(jie)masterIp失敗,它將(jiang)試圖鏈接(jie)secondIp。
dnode啟(qi)動后,會獲知集群的(de)mnode IP列(lie)表,并且(qie)定時向mnode發送(song)狀態(tai)信(xin)息。
vnode與mnode只是邏輯上的劃分,都是執行程序taosd里的不同線程而已,無需安裝不同的軟件,做任何特殊的配置。最小的系統配置就是一個物理節點,vnode,mnode和taosc都存在而且都正常運行,但單一節點無法保證系統的高可靠。
2: 一典型的操作流程
為解釋(shi)vnode, mnode, taosc和應(ying)用(yong)之間的關系以及各自扮演的角(jiao)色,下(xia)面對寫入數據(ju)這個(ge)典型操作的流程(cheng)進行剖析(xi)。

- 應用通過JDBC、ODBC或其他API接口發起插入數據的請求。
- taosc會檢查緩存,看是有保存有該表的meta data。如果有,直接到第4步。如果沒有,taosc將向mnode發出get meta-data請求。
- mnode將該表的meta-data返回給taosc。Meta-data包含有該表的schema, 而且還有該表所屬的vgroup信息(vnode ID以及所在的dnode的IP地址,如果副本數為N,就有N組vnodeID/IP)。如果taosc遲遲得不到mnode回應,而且存在多個mnode,taosc將向下一個mnode發出請求。
- taosc向master vnode發起插入請求。
- vnode插入數據后,給taosc一個應答,表示插入成功。如果taosc遲遲得不到vnode的回應,taosc會認為該節點已經離線。這種情況下,如果被插入的數據庫有多個副本,taosc將向vgroup里下一個vnode發出插入請求。
- taosc通知APP,寫入成功。
對(dui)于第(di)二(er)和(he)第(di)三步,taosc啟動時,并不知道mnode的(de)IP地(di)址(zhi),因(yin)此會直(zhi)接向(xiang)配置的(de)集群對(dui)外服務的(de)IP地(di)址(zhi)發起請求。如果(guo)接收到該請求的(de)dnode并沒有配置mnode,該dnode會在回復的(de)消(xiao)息中告知mnode的(de)IP地(di)址(zhi)列表(如果(guo)有多個dnodes,mnode的(de)IP地(di)址(zhi)可以有多個),這樣taosc會重(zhong)新向(xiang)新的(de)mnode的(de)IP地(di)址(zhi)發出獲取meta-data的(de)請求。
對(dui)于第四(si)和第五步,沒(mei)有緩(huan)存(cun)的(de)(de)情況下,taosc無法知道虛擬節點組里誰是(shi)master,就假設第一個vnodeID/IP就是(shi)master,向它(ta)發出請求。如果接收(shou)到請求的(de)(de)vnode并不是(shi)master,它(ta)會在回復中告知誰是(shi)master,這樣taosc就向建議的(de)(de)master vnode發出請求。一旦得到插入成(cheng)功的(de)(de)回復,taosc會緩(huan)存(cun)住master節點的(de)(de)信(xin)息。
上(shang)述(shu)是插入數據的(de)(de)流程,查詢(xun)、計算的(de)(de)流程也(ye)完(wan)(wan)全一致。taosc把這些復雜的(de)(de)流程全部封(feng)裝(zhuang)屏蔽了,因此應(ying)用無需處理重(zhong)定向(xiang)、獲取meta data等(deng)細節,完(wan)(wan)全是透明的(de)(de)。
通過taosc緩存(cun)機制,只有(you)在第一次對(dui)一張表操作時(shi),才需要訪問mnode,因(yin)(yin)此mnode不會成為(wei)系統瓶頸。但因(yin)(yin)為(wei)schema有(you)可能變(bian)化(hua),而且vgroup有(you)可能發(fa)生改(gai)變(bian)(比如負載(zai)均衡發(fa)生),因(yin)(yin)此taosc需要定時(shi)自動刷(shua)新緩存(cun)。
3: 數據分區
vnode(虛(xu)擬(ni)數據節(jie)點(dian))保存采集的(de)時(shi)序(xu)數據,而且查詢、計(ji)算(suan)都在這些節(jie)點(dian)上(shang)進行。為便于負載均(jun)衡(heng)、數據恢復、支持異構環境,TDengine將一個物理(li)節(jie)點(dian)根(gen)據其計(ji)算(suan)和存儲資(zi)源切(qie)分為多(duo)個vnode。這些vnode的(de)管理(li)是TDengine自(zi)動完(wan)成的(de),對(dui)應用(yong)完(wan)全(quan)透明。
對于(yu)單獨一(yi)(yi)(yi)個(ge)數(shu)(shu)據(ju)采集(ji)點,無(wu)論(lun)其數(shu)(shu)據(ju)量多(duo)大,一(yi)(yi)(yi)個(ge)vnode(或(huo)vnode group, 如果副本(ben)數(shu)(shu)大于(yu)1)有足夠的(de)(de)(de)(de)計(ji)算資源(yuan)(yuan)和存儲資源(yuan)(yuan)來處理(如果每秒(miao)生成一(yi)(yi)(yi)條16字節的(de)(de)(de)(de)記錄,一(yi)(yi)(yi)年產生的(de)(de)(de)(de)原(yuan)始數(shu)(shu)據(ju)不(bu)(bu)到(dao)0.5G),因此(ci)TDengine將一(yi)(yi)(yi)張表(biao)(biao)的(de)(de)(de)(de)所有數(shu)(shu)據(ju)都(dou)(dou)存放在一(yi)(yi)(yi)個(ge)vnode里,而(er)不(bu)(bu)會讓同一(yi)(yi)(yi)個(ge)采集(ji)點的(de)(de)(de)(de)數(shu)(shu)據(ju)分(fen)布到(dao)兩個(ge)或(huo)多(duo)個(ge)dnode上。而(er)且一(yi)(yi)(yi)個(ge)vnode可存儲多(duo)張表(biao)(biao)的(de)(de)(de)(de)數(shu)(shu)據(ju),一(yi)(yi)(yi)個(ge)vnode可容(rong)納的(de)(de)(de)(de)表(biao)(biao)的(de)(de)(de)(de)數(shu)(shu)目由配置參(can)數(shu)(shu)sessionsPerVnode指定,缺省為2000。設計(ji)上,一(yi)(yi)(yi)個(ge)vnode里所有的(de)(de)(de)(de)表(biao)(biao)都(dou)(dou)屬于(yu)同一(yi)(yi)(yi)個(ge)DB。因此(ci)一(yi)(yi)(yi)個(ge)數(shu)(shu)據(ju)庫DB需要的(de)(de)(de)(de)vnode或(huo)vgroup的(de)(de)(de)(de)個(ge)數(shu)(shu)等于(yu):數(shu)(shu)據(ju)庫表(biao)(biao)的(de)(de)(de)(de)數(shu)(shu)目/sessionsPerVnode。
創(chuang)(chuang)建(jian)(jian)(jian)DB時,系(xi)(xi)統并(bing)不(bu)(bu)會馬上分配(pei)(pei)資(zi)源(yuan)。但(dan)當創(chuang)(chuang)建(jian)(jian)(jian)一(yi)張(zhang)表(biao)時,系(xi)(xi)統將(jiang)看是(shi)否(fou)有(you)已經分配(pei)(pei)的vnode, 而且(qie)是(shi)否(fou)有(you)空(kong)位(wei),如(ru)果(guo)(guo)有(you),立(li)即在該有(you)空(kong)位(wei)的vnode創(chuang)(chuang)建(jian)(jian)(jian)表(biao)。如(ru)果(guo)(guo)沒有(you),系(xi)(xi)統將(jiang)從集群中,根(gen)據當前的負載情況,在一(yi)個dnode上創(chuang)(chuang)建(jian)(jian)(jian)一(yi)新的vnode, 然(ran)后創(chuang)(chuang)建(jian)(jian)(jian)表(biao)。如(ru)果(guo)(guo)DB有(you)多個副本,系(xi)(xi)統不(bu)(bu)是(shi)只創(chuang)(chuang)建(jian)(jian)(jian)一(yi)個vnode,而是(shi)一(yi)個vgroup(虛擬數據節點組(zu))。系(xi)(xi)統對vnode的數目沒有(you)任何限制(zhi),僅(jin)僅(jin)受限于(yu)物理節點本身的計算和(he)存(cun)儲資(zi)源(yuan)。
sessionsPerVnode的(de)設置需(xu)要(yao)考(kao)慮具體(ti)場景,創建DB時,可以(yi)個(ge)性化指定(ding)該參數(shu)(shu)。該參數(shu)(shu)不宜(yi)過(guo)大(da),也不宜(yi)過(guo)小。過(guo)小,極端(duan)情況,就是每個(ge)數(shu)(shu)據采集點一個(ge)vnode, 這(zhe)樣導致系統(tong)數(shu)(shu)據文件(jian)過(guo)多。過(guo)大(da),虛(xu)擬化帶(dai)來的(de)優勢就會喪失。給定(ding)集群計算資源的(de)情況下,整個(ge)系統(tong)vnode的(de)個(ge)數(shu)(shu)應該是CPU核的(de)數(shu)(shu)目的(de)兩倍以(yi)上。
4: 負載均衡
每(mei)個dnode(物理(li)節點(dian))都定時向 mnode(虛(xu)擬(ni)管理(li)節點(dian))報告其(qi)(qi)狀(zhuang)態(tai)(包括硬盤空間、內存大小(xiao)、CPU、網絡、虛(xu)擬(ni)節點(dian)個數等),因此mnode了(le)解整個集群的(de)狀(zhuang)態(tai)。基于整體(ti)狀(zhuang)態(tai),當(dang)mnode發現某個dnode負載(zai)(zai)過重(zhong),它會將(jiang)dnode上的(de)一個或多個vnode挪到其(qi)(qi)他dnode。在(zai)挪動過程(cheng)中,對外服務繼續(xu)進行(xing),數據插入(ru)、查(cha)詢和(he)計算操(cao)作都不受影響(xiang)。負載(zai)(zai)均衡(heng)操(cao)作結(jie)束后,應用(yong)也無需(xu)重(zhong)啟,將(jiang)自動連接新(xin)的(de)vnode。
如(ru)果(guo)mnode一(yi)(yi)段時間(jian)沒(mei)有收到dnode的(de)狀態報(bao)告,mnode會認為這(zhe)個dnode已經離線(xian)。如(ru)果(guo)離線(xian)時間(jian)超(chao)過一(yi)(yi)定(ding)時長(chang)(chang)(時長(chang)(chang)由配置參數offlineThreshold決定(ding)),該(gai)dnode將被mnode強制剔除出集群(qun)。該(gai)dnode上(shang)的(de)vnodes如(ru)果(guo)副本(ben)數大于一(yi)(yi),系統將自(zi)動在其他dnode上(shang)創建新的(de)副本(ben),以保證數據的(de)副本(ben)數。


























