1: 集群與主要邏輯單元
TDengine Database是基于硬件、軟件系統(tǒng)不可靠、一定會(huì)有故障的假設(shè)進(jìn)行設(shè)計(jì)的,是基于任何單臺(tái)計(jì)算機(jī)都無(wú)足夠能力處理海量數(shù)據(jù)的假設(shè)進(jìn)行設(shè)計(jì)的。因此TDengine Database從研發(fā)的第一天起,就按照分布式高可靠架構(gòu)進(jìn)行設(shè)計(jì),是完全去中心化的,是水平擴(kuò)展的,這樣任何單臺(tái)或多臺(tái)服務(wù)器宕機(jī)或軟件錯(cuò)誤都不影響系統(tǒng)的服務(wù)。通過(guò)節(jié)點(diǎn)虛擬化并輔以自動(dòng)化負(fù)載均衡技術(shù),TDengine Database能最大限度地利用異構(gòu)集群中的計(jì)算和存儲(chǔ)資源。而且只要數(shù)據(jù)副本數(shù)大于一,無(wú)論是硬軟件的升級(jí)、還是IDC的遷移等都無(wú)需停止集群的服務(wù),極大地保證系統(tǒng)的正常運(yùn)行,并且降低了系統(tǒng)管理員和運(yùn)維人員的工作量。
下面的示例圖上有八個(gè)物理節(jié)點(diǎn),每個(gè)物理節(jié)點(diǎn)被邏輯的劃分為多個(gè)虛擬節(jié)點(diǎn)。下面對(duì)系統(tǒng)的基本概念進(jìn)行介紹。

物理節(jié)點(diǎn)(dnode):集群中的一物理服務(wù)器或云平臺(tái)上的一虛擬機(jī)。為安全以及通訊效率,一個(gè)物理節(jié)點(diǎn)可配置兩張網(wǎng)卡,或兩個(gè)IP地址。其中一張網(wǎng)卡用于集群內(nèi)部通訊,其IP地址為privateIp, 另外一張網(wǎng)卡用于與集群外部應(yīng)用的通訊,其IP地址為publicIp。在一些云平臺(tái)(如阿里云),對(duì)外的IP地址是映射過(guò)來(lái)的,因此publicIp還有一個(gè)對(duì)應(yīng)的內(nèi)部IP地址internalIp(與privateIp不同)。對(duì)于只有一個(gè)IP地址的物理節(jié)點(diǎn),publicIp, privateIp以及internalIp都是同一個(gè)地址,沒(méi)有任何區(qū)別。一個(gè)dnode上有而且只有一個(gè)taosd實(shí)例運(yùn)行。
虛擬數(shù)據(jù)節(jié)點(diǎn)(vnode):在物理節(jié)點(diǎn)之上的可獨(dú)立運(yùn)行的基礎(chǔ)邏輯單元,時(shí)序數(shù)據(jù)寫(xiě)入、存儲(chǔ)、查詢等操作邏輯都在虛擬節(jié)點(diǎn)中進(jìn)行(圖中V),采集的時(shí)序數(shù)據(jù)就存儲(chǔ)在vnode上。一個(gè)vnode包含固定數(shù)量的表。當(dāng)創(chuàng)建一張新表時(shí),系統(tǒng)會(huì)檢查是否需要?jiǎng)?chuàng)建新的vnode。一個(gè)物理節(jié)點(diǎn)上能創(chuàng)建的vnode的數(shù)量取決于物理節(jié)點(diǎn)的硬件資源。一個(gè)vnode只屬于一個(gè)DB,但一個(gè)DB可以有多個(gè)vnode。
虛擬數(shù)據(jù)節(jié)點(diǎn)組(vgroup):位于不同物理節(jié)點(diǎn)的vnode可以組成一個(gè)虛擬數(shù)據(jù)節(jié)點(diǎn)組vnode group(如上圖dnode0中的V0, dnode1中的V1, dnode6中的V2屬于同一個(gè)虛擬節(jié)點(diǎn)組)。歸屬于同一個(gè)vgroup的虛擬節(jié)點(diǎn)采取master/slave的方式進(jìn)行管理。寫(xiě)只能在master上進(jìn)行,但采用asynchronous的方式將數(shù)據(jù)同步到slave,這樣確保了一份數(shù)據(jù)在多個(gè)物理節(jié)點(diǎn)上有拷貝。如果master節(jié)點(diǎn)宕機(jī),其他節(jié)點(diǎn)監(jiān)測(cè)到后,將重新選舉vgroup里的master, 新的master能繼續(xù)處理數(shù)據(jù)請(qǐng)求,從而保證系統(tǒng)運(yùn)行的可靠性。一個(gè)vgroup里虛擬節(jié)點(diǎn)個(gè)數(shù)就是數(shù)據(jù)的副本數(shù)。如果一個(gè)DB的副本數(shù)為N,系統(tǒng)必須有至少N個(gè)物理節(jié)點(diǎn)。副本數(shù)在創(chuàng)建DB時(shí)通過(guò)參數(shù)replica可以指定,缺省為1。使用TDengine, 數(shù)據(jù)的安全依靠多副本解決,因此不再需要昂貴的磁盤(pán)陣列等存儲(chǔ)設(shè)備。
虛擬管理節(jié)點(diǎn)(mnode):負(fù)責(zé)所有節(jié)點(diǎn)運(yùn)行狀態(tài)的監(jiān)控和維護(hù),以及節(jié)點(diǎn)之間的負(fù)載均衡(圖中M)。同時(shí),虛擬管理節(jié)點(diǎn)也負(fù)責(zé)元數(shù)據(jù)(包括用戶、數(shù)據(jù)庫(kù)、表、靜態(tài)標(biāo)簽等)的存儲(chǔ)和管理,因此也稱(chēng)為Meta Node。TDengine集群中可配置多個(gè)(最多不超過(guò)5個(gè)) mnode,它們自動(dòng)構(gòu)建成為一個(gè)管理節(jié)點(diǎn)集群(圖中M0, M1, M2)。mnode間采用master/slave的機(jī)制進(jìn)行管理,而且采取強(qiáng)一致方式進(jìn)行數(shù)據(jù)同步。mnode集群的創(chuàng)建由系統(tǒng)自動(dòng)完成,無(wú)需人工干預(yù)。每個(gè)dnode上至多有一個(gè)mnode,而且每個(gè)dnode都知道整個(gè)集群中所有mnode的IP地址。
taosc:一個(gè)軟件模塊,是TDengine給應(yīng)用提供的驅(qū)動(dòng)程序(driver),內(nèi)嵌于JDBC、ODBC driver中,或者C語(yǔ)言連接庫(kù)里。應(yīng)用都是通過(guò)taosc而不是直接來(lái)與整個(gè)集群進(jìn)行交互的。這個(gè)模塊負(fù)責(zé)獲取并緩存元數(shù)據(jù);將插入、查詢等請(qǐng)求轉(zhuǎn)發(fā)到正確的虛擬節(jié)點(diǎn);在把結(jié)果返回給應(yīng)用時(shí),還需要負(fù)責(zé)最后一級(jí)的聚合、排序、過(guò)濾等操作。對(duì)于JDBC, ODBC, C/C++接口而言,這個(gè)模塊是在應(yīng)用所處的計(jì)算機(jī)上運(yùn)行,但消耗的資源很小。為支持全分布式的REST接口,taosc在TDengine集群的每個(gè)dnode上都有一運(yùn)行實(shí)例。
對(duì)外服務(wù)地址:TDengine集群可以容納單臺(tái)、多臺(tái)甚至幾千臺(tái)物理節(jié)點(diǎn)。應(yīng)用只需要向集群中任何一個(gè)物理節(jié)點(diǎn)的publicIp發(fā)起連接即可。啟動(dòng)CLI應(yīng)用taos時(shí),選項(xiàng)-h需要提供的就是publicIp。
master/secondIp:每一個(gè)dnode都需要配置一個(gè)masterIp。dnode啟動(dòng)后,將對(duì)配置的masterIp發(fā)起加入集群的連接請(qǐng)求。masterIp是已經(jīng)創(chuàng)建的集群中的任何一個(gè)節(jié)點(diǎn)的privateIp,對(duì)于集群中的第一個(gè)節(jié)點(diǎn),就是它自己的privateIp。為保證連接成功,每個(gè)dnode還可配置secondIp, 該IP地址也是已創(chuàng)建的集群中的任何一個(gè)節(jié)點(diǎn)的privateIp。如果一個(gè)節(jié)點(diǎn)連接masterIp失敗,它將試圖鏈接secondIp。
dnode啟動(dòng)后,會(huì)獲知集群的mnode IP列表,并且定時(shí)向mnode發(fā)送狀態(tài)信息。
vnode與mnode只是邏輯上的劃分,都是執(zhí)行程序taosd里的不同線程而已,無(wú)需安裝不同的軟件,做任何特殊的配置。最小的系統(tǒng)配置就是一個(gè)物理節(jié)點(diǎn),vnode,mnode和taosc都存在而且都正常運(yùn)行,但單一節(jié)點(diǎn)無(wú)法保證系統(tǒng)的高可靠。
2: 一典型的操作流程
為解釋vnode, mnode, taosc和應(yīng)用之間的關(guān)系以及各自扮演的角色,下面對(duì)寫(xiě)入數(shù)據(jù)這個(gè)典型操作的流程進(jìn)行剖析。

- 應(yīng)用通過(guò)JDBC、ODBC或其他API接口發(fā)起插入數(shù)據(jù)的請(qǐng)求。
- taosc會(huì)檢查緩存,看是有保存有該表的meta data。如果有,直接到第4步。如果沒(méi)有,taosc將向mnode發(fā)出get meta-data請(qǐng)求。
- mnode將該表的meta-data返回給taosc。Meta-data包含有該表的schema, 而且還有該表所屬的vgroup信息(vnode ID以及所在的dnode的IP地址,如果副本數(shù)為N,就有N組vnodeID/IP)。如果taosc遲遲得不到mnode回應(yīng),而且存在多個(gè)mnode,taosc將向下一個(gè)mnode發(fā)出請(qǐng)求。
- taosc向master vnode發(fā)起插入請(qǐng)求。
- vnode插入數(shù)據(jù)后,給taosc一個(gè)應(yīng)答,表示插入成功。如果taosc遲遲得不到vnode的回應(yīng),taosc會(huì)認(rèn)為該節(jié)點(diǎn)已經(jīng)離線。這種情況下,如果被插入的數(shù)據(jù)庫(kù)有多個(gè)副本,taosc將向vgroup里下一個(gè)vnode發(fā)出插入請(qǐng)求。
- taosc通知APP,寫(xiě)入成功。
對(duì)于第二和第三步,taosc啟動(dòng)時(shí),并不知道m(xù)node的IP地址,因此會(huì)直接向配置的集群對(duì)外服務(wù)的IP地址發(fā)起請(qǐng)求。如果接收到該請(qǐng)求的dnode并沒(méi)有配置mnode,該dnode會(huì)在回復(fù)的消息中告知mnode的IP地址列表(如果有多個(gè)dnodes,mnode的IP地址可以有多個(gè)),這樣taosc會(huì)重新向新的mnode的IP地址發(fā)出獲取meta-data的請(qǐng)求。
對(duì)于第四和第五步,沒(méi)有緩存的情況下,taosc無(wú)法知道虛擬節(jié)點(diǎn)組里誰(shuí)是master,就假設(shè)第一個(gè)vnodeID/IP就是master,向它發(fā)出請(qǐng)求。如果接收到請(qǐng)求的vnode并不是master,它會(huì)在回復(fù)中告知誰(shuí)是master,這樣taosc就向建議的master vnode發(fā)出請(qǐng)求。一旦得到插入成功的回復(fù),taosc會(huì)緩存住master節(jié)點(diǎn)的信息。
上述是插入數(shù)據(jù)的流程,查詢、計(jì)算的流程也完全一致。taosc把這些復(fù)雜的流程全部封裝屏蔽了,因此應(yīng)用無(wú)需處理重定向、獲取meta data等細(xì)節(jié),完全是透明的。
通過(guò)taosc緩存機(jī)制,只有在第一次對(duì)一張表操作時(shí),才需要訪問(wèn)mnode,因此mnode不會(huì)成為系統(tǒng)瓶頸。但因?yàn)閟chema有可能變化,而且vgroup有可能發(fā)生改變(比如負(fù)載均衡發(fā)生),因此taosc需要定時(shí)自動(dòng)刷新緩存。
3: 數(shù)據(jù)分區(qū)
vnode(虛擬數(shù)據(jù)節(jié)點(diǎn))保存采集的時(shí)序數(shù)據(jù),而且查詢、計(jì)算都在這些節(jié)點(diǎn)上進(jìn)行。為便于負(fù)載均衡、數(shù)據(jù)恢復(fù)、支持異構(gòu)環(huán)境,TDengine將一個(gè)物理節(jié)點(diǎn)根據(jù)其計(jì)算和存儲(chǔ)資源切分為多個(gè)vnode。這些vnode的管理是TDengine自動(dòng)完成的,對(duì)應(yīng)用完全透明。
對(duì)于單獨(dú)一個(gè)數(shù)據(jù)采集點(diǎn),無(wú)論其數(shù)據(jù)量多大,一個(gè)vnode(或vnode group, 如果副本數(shù)大于1)有足夠的計(jì)算資源和存儲(chǔ)資源來(lái)處理(如果每秒生成一條16字節(jié)的記錄,一年產(chǎn)生的原始數(shù)據(jù)不到0.5G),因此TDengine將一張表的所有數(shù)據(jù)都存放在一個(gè)vnode里,而不會(huì)讓同一個(gè)采集點(diǎn)的數(shù)據(jù)分布到兩個(gè)或多個(gè)dnode上。而且一個(gè)vnode可存儲(chǔ)多張表的數(shù)據(jù),一個(gè)vnode可容納的表的數(shù)目由配置參數(shù)sessionsPerVnode指定,缺省為2000。設(shè)計(jì)上,一個(gè)vnode里所有的表都屬于同一個(gè)DB。因此一個(gè)數(shù)據(jù)庫(kù)DB需要的vnode或vgroup的個(gè)數(shù)等于:數(shù)據(jù)庫(kù)表的數(shù)目/sessionsPerVnode。
創(chuàng)建DB時(shí),系統(tǒng)并不會(huì)馬上分配資源。但當(dāng)創(chuàng)建一張表時(shí),系統(tǒng)將看是否有已經(jīng)分配的vnode, 而且是否有空位,如果有,立即在該有空位的vnode創(chuàng)建表。如果沒(méi)有,系統(tǒng)將從集群中,根據(jù)當(dāng)前的負(fù)載情況,在一個(gè)dnode上創(chuàng)建一新的vnode, 然后創(chuàng)建表。如果DB有多個(gè)副本,系統(tǒng)不是只創(chuàng)建一個(gè)vnode,而是一個(gè)vgroup(虛擬數(shù)據(jù)節(jié)點(diǎn)組)。系統(tǒng)對(duì)vnode的數(shù)目沒(méi)有任何限制,僅僅受限于物理節(jié)點(diǎn)本身的計(jì)算和存儲(chǔ)資源。
sessionsPerVnode的設(shè)置需要考慮具體場(chǎng)景,創(chuàng)建DB時(shí),可以個(gè)性化指定該參數(shù)。該參數(shù)不宜過(guò)大,也不宜過(guò)小。過(guò)小,極端情況,就是每個(gè)數(shù)據(jù)采集點(diǎn)一個(gè)vnode, 這樣導(dǎo)致系統(tǒng)數(shù)據(jù)文件過(guò)多。過(guò)大,虛擬化帶來(lái)的優(yōu)勢(shì)就會(huì)喪失。給定集群計(jì)算資源的情況下,整個(gè)系統(tǒng)vnode的個(gè)數(shù)應(yīng)該是CPU核的數(shù)目的兩倍以上。
4: 負(fù)載均衡
每個(gè)dnode(物理節(jié)點(diǎn))都定時(shí)向 mnode(虛擬管理節(jié)點(diǎn))報(bào)告其狀態(tài)(包括硬盤(pán)空間、內(nèi)存大小、CPU、網(wǎng)絡(luò)、虛擬節(jié)點(diǎn)個(gè)數(shù)等),因此mnode了解整個(gè)集群的狀態(tài)?;谡w狀態(tài),當(dāng)mnode發(fā)現(xiàn)某個(gè)dnode負(fù)載過(guò)重,它會(huì)將dnode上的一個(gè)或多個(gè)vnode挪到其他dnode。在挪動(dòng)過(guò)程中,對(duì)外服務(wù)繼續(xù)進(jìn)行,數(shù)據(jù)插入、查詢和計(jì)算操作都不受影響。負(fù)載均衡操作結(jié)束后,應(yīng)用也無(wú)需重啟,將自動(dòng)連接新的vnode。
如果mnode一段時(shí)間沒(méi)有收到dnode的狀態(tài)報(bào)告,mnode會(huì)認(rèn)為這個(gè)dnode已經(jīng)離線。如果離線時(shí)間超過(guò)一定時(shí)長(zhǎng)(時(shí)長(zhǎng)由配置參數(shù)offlineThreshold決定),該dnode將被mnode強(qiáng)制剔除出集群。該dnode上的vnodes如果副本數(shù)大于一,系統(tǒng)將自動(dòng)在其他dnode上創(chuàng)建新的副本,以保證數(shù)據(jù)的副本數(shù)。



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



-1.png)




.png)


證.png)


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



