同在基礎軟件領域創業,時序數據庫 InfluxDB將集群功能閉源是完全可以理解的。但 InfluxDB集群 是剛(gang)需,是核心痛點,如果核心痛點不解決,那可替代方案會很(hen)多(duo),產品(pin)本身的推廣就會大打折扣,開源的價值就大為(wei)下降。
TDengine 的(de)(de)(de)設(she)計(ji)是(shi)基(ji)(ji)于單(dan)個(ge)硬件、軟(ruan)件系統不(bu)(bu)可(ke)靠,基(ji)(ji)于任何(he)單(dan)臺(tai)計(ji)算機都(dou)無法提(ti)供足(zu)夠(gou)計(ji)算能力和(he)存儲(chu)能力處理(li)海(hai)量數據的(de)(de)(de)假設(she)進行設(she)計(ji)的(de)(de)(de)。因此 TDengine 從研發(fa)的(de)(de)(de)第一(yi)天起,就按照(zhao)分布式高可(ke)靠架構(gou)進行設(she)計(ji),是(shi)支持水平擴(kuo)展的(de)(de)(de),這樣(yang)任何(he)單(dan)臺(tai)或多臺(tai)服務器發(fa)生(sheng)硬件故障或軟(ruan)件錯誤都(dou)不(bu)(bu)影響系統的(de)(de)(de)可(ke)用(yong)性和(he)可(ke)靠性。并且(qie)和(he) InfluxDB 不(bu)(bu)同(tong)的(de)(de)(de)是(shi),TDengine 選擇(ze)將(jiang)集群功能開(kai)源。本文重點講(jiang)解(jie) TDengine 集群的(de)(de)(de)主要邏輯單(dan)元的(de)(de)(de)設(she)計(ji)。
TDengine 分布式架構的邏(luo)輯結構圖如下:

一(yi)個(ge)完整的 TDengine 系統是運行(xing)在(zai)一(yi)到多個(ge)物(wu)理節點(dian)上的,邏(luo)輯(ji)上,它包含數據節點(dian)(dnode)、TDengine 應用驅動(dong)(dong)(taosc)以及應用(app)。系統中存在(zai)一(yi)到多個(ge)數據節點(dian),這些數據節點(dian)組成一(yi)個(ge)集(ji)群(cluster)。應用通過 taosc 的 API 與 TDengine 集(ji)群進(jin)行(xing)互動(dong)(dong)。下面對每個(ge)邏(luo)輯(ji)單元進(jin)行(xing)簡要介紹(shao)。
物理節點(pnode): pnode 是一獨立運行、擁有自己的計算、存儲和網絡能力的計算機,可以是安裝有OS的物理機、虛擬機或 Docker 容器。物理節點由其配置的 FQDN (Fully Qualified Domain Name)來標識。TDengine 完全依賴 FQDN 來進行網絡通訊,如果不了解 FQDN,請看博文《一篇文章說清楚 TDengine 的 FQDN》。
數據節點(dnode): dnode 是(shi) TDengine 服(fu)務(wu)器側執行代碼 taosd 在物(wu)理(li)節(jie)(jie)點(dian)(dian)上(shang)的(de)(de)(de)(de)(de)一(yi)個(ge)運行實例(li),一(yi)個(ge)工(gong)作的(de)(de)(de)(de)(de)系統必須有(you)(you)至少(shao)一(yi)個(ge)數據(ju)(ju)節(jie)(jie)點(dian)(dian)。dnode 包含零(ling)到多(duo)(duo)(duo)個(ge)邏輯的(de)(de)(de)(de)(de)虛(xu)擬節(jie)(jie)點(dian)(dian)(vnode),零(ling)或(huo)者至多(duo)(duo)(duo)一(yi)個(ge)邏輯的(de)(de)(de)(de)(de)管理(li)節(jie)(jie)點(dian)(dian)(mnode)。dnode 在系統中的(de)(de)(de)(de)(de)唯一(yi)標識由實例(li)的(de)(de)(de)(de)(de) End Point (EP)決定。EP 是(shi) dnode 所(suo)在物(wu)理(li)節(jie)(jie)點(dian)(dian)的(de)(de)(de)(de)(de) FQDN (Fully Qualified Domain Name)和(he)系統所(suo)配置的(de)(de)(de)(de)(de)網絡端口(kou)號(Port)的(de)(de)(de)(de)(de)組合。通(tong)過配置不同的(de)(de)(de)(de)(de)端口(kou),一(yi)個(ge)物(wu)理(li)節(jie)(jie)點(dian)(dian)(一(yi)臺物(wu)理(li)機、虛(xu)擬機或(huo)容器)可以(yi)運行多(duo)(duo)(duo)個(ge)實例(li),或(huo)有(you)(you)多(duo)(duo)(duo)個(ge)數據(ju)(ju)節(jie)(jie)點(dian)(dian)。
虛擬節點(vnode): 為更好的(de)(de)(de)(de)(de)(de)支持數(shu)據(ju)(ju)(ju)分(fen)片、負載均衡,防止(zhi)數(shu)據(ju)(ju)(ju)過熱或傾(qing)斜(xie),數(shu)據(ju)(ju)(ju)節(jie)(jie)(jie)點(dian)被虛擬化成多(duo)個(ge)(ge)(ge)虛擬節(jie)(jie)(jie)點(dian)(vnode,圖中(zhong) V2, V3, V4等)。每個(ge)(ge)(ge) vnode 都(dou)是(shi)(shi)一(yi)(yi)(yi)個(ge)(ge)(ge)相對(dui)獨(du)立的(de)(de)(de)(de)(de)(de)工(gong)作單元,是(shi)(shi)時(shi)(shi)序數(shu)據(ju)(ju)(ju)存儲(chu)的(de)(de)(de)(de)(de)(de)基(ji)本(ben)單元,具有(you)(you)獨(du)立的(de)(de)(de)(de)(de)(de)運行(xing)線程、內存空(kong)間與持久化存儲(chu)的(de)(de)(de)(de)(de)(de)路徑。一(yi)(yi)(yi)個(ge)(ge)(ge) vnode 包含(han)一(yi)(yi)(yi)定數(shu)量的(de)(de)(de)(de)(de)(de)表(biao)(biao)(數(shu)據(ju)(ju)(ju)采集點(dian))。當創(chuang)建一(yi)(yi)(yi)張(zhang)新表(biao)(biao)時(shi)(shi),系統(tong)會檢(jian)查是(shi)(shi)否需要創(chuang)建新的(de)(de)(de)(de)(de)(de) vnode。一(yi)(yi)(yi)個(ge)(ge)(ge)數(shu)據(ju)(ju)(ju)節(jie)(jie)(jie)點(dian)上能創(chuang)建的(de)(de)(de)(de)(de)(de) vnode 的(de)(de)(de)(de)(de)(de)數(shu)量取決于該數(shu)據(ju)(ju)(ju)節(jie)(jie)(jie)點(dian)所(suo)(suo)(suo)(suo)在物理(li)節(jie)(jie)(jie)點(dian)的(de)(de)(de)(de)(de)(de)硬件資源。一(yi)(yi)(yi)個(ge)(ge)(ge) vnode 只屬(shu)于一(yi)(yi)(yi)個(ge)(ge)(ge) DB,但一(yi)(yi)(yi)個(ge)(ge)(ge) DB 可以有(you)(you)多(duo)個(ge)(ge)(ge) vnode。一(yi)(yi)(yi)個(ge)(ge)(ge) vnode 除存儲(chu)的(de)(de)(de)(de)(de)(de)時(shi)(shi)序數(shu)據(ju)(ju)(ju)外,也保存有(you)(you)所(suo)(suo)(suo)(suo)包含(han)的(de)(de)(de)(de)(de)(de)表(biao)(biao)的(de)(de)(de)(de)(de)(de) schema、標簽值(zhi)等。一(yi)(yi)(yi)個(ge)(ge)(ge)虛擬節(jie)(jie)(jie)點(dian)由所(suo)(suo)(suo)(suo)屬(shu)的(de)(de)(de)(de)(de)(de)數(shu)據(ju)(ju)(ju)節(jie)(jie)(jie)點(dian)的(de)(de)(de)(de)(de)(de)EP,以及所(suo)(suo)(suo)(suo)屬(shu)的(de)(de)(de)(de)(de)(de) VGroup ID 在系統(tong)內唯一(yi)(yi)(yi)標識,由管(guan)理(li)節(jie)(jie)(jie)點(dian)創(chuang)建并管(guan)理(li)。
管理節點(mnode): 一(yi)個虛擬的邏輯單元,負(fu)責(ze)所有數(shu)(shu)據(ju)(ju)節(jie)(jie)點(dian)運行狀態的監控和維護(hu),以(yi)及節(jie)(jie)點(dian)之間的負(fu)載均衡(heng)(圖中(zhong) M)。同時,管理(li)節(jie)(jie)點(dian)也負(fu)責(ze)元數(shu)(shu)據(ju)(ju)(包括用戶、數(shu)(shu)據(ju)(ju)庫、表、靜態標簽等)的存儲(chu)和管理(li),因此也稱為(wei) Meta Node。TDengine 集群(qun)中(zhong)可配(pei)置多個(最多不超過 3 個) mnode,它(ta)們自動構建成為(wei)一(yi)個虛擬管理(li)節(jie)(jie)點(dian)組(圖中(zhong) M0, M1, M2)。
mnode 間(jian)采(cai)用 master/slave 的(de)機制(zhi)進行(xing)管理,而(er)且采(cai)取強一致(zhi)方式(shi)進行(xing)數據同步, 任何數據更新操作只(zhi)能在(zai) Master 上(shang)進行(xing)。mnode 集群的(de)創(chuang)建由系統自動完成,無需人工(gong)干預(yu)。每個(ge)(ge) dnode 上(shang)至多有一個(ge)(ge) mnode,由所屬的(de)數據節點(dian)的(de)EP來唯(wei)一標(biao)識(shi)。每個(ge)(ge) dnode 通過內部消息交互自動獲取整(zheng)個(ge)(ge)集群中所有 mnode 所在(zai)的(de) dnode 的(de)EP。
虛擬節點組(VGroup): 不(bu)同數(shu)(shu)(shu)(shu)(shu)據節(jie)(jie)點(dian)上的(de)(de)(de)(de)(de) vnode 可(ke)以(yi)組成(cheng)一個(ge)(ge)虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)組(vnode group)來保證系(xi)統的(de)(de)(de)(de)(de)高(gao)可(ke)靠。虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)組內(nei)采(cai)取 master/slave 的(de)(de)(de)(de)(de)方式進(jin)(jin)行管(guan)(guan)理(li)(li)。寫操作只能在(zai) master vnode 上進(jin)(jin)行,系(xi)統采(cai)用(yong)異步(bu)復(fu)(fu)制的(de)(de)(de)(de)(de)方式將(jiang)數(shu)(shu)(shu)(shu)(shu)據同步(bu)到 slave vnode,這樣確保了一份(fen)數(shu)(shu)(shu)(shu)(shu)據在(zai)多個(ge)(ge)物(wu)理(li)(li)節(jie)(jie)點(dian)上有(you)拷貝。一個(ge)(ge) vgroup 里虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)個(ge)(ge)數(shu)(shu)(shu)(shu)(shu)就是(shi)數(shu)(shu)(shu)(shu)(shu)據的(de)(de)(de)(de)(de)副本數(shu)(shu)(shu)(shu)(shu)。如(ru)果一個(ge)(ge) DB 的(de)(de)(de)(de)(de)副本數(shu)(shu)(shu)(shu)(shu)為(wei) N,系(xi)統必須有(you)至少(shao) N 數(shu)(shu)(shu)(shu)(shu)據節(jie)(jie)點(dian)。副本數(shu)(shu)(shu)(shu)(shu)在(zai)創(chuang)建(jian)DB時通過參數(shu)(shu)(shu)(shu)(shu) replica 可(ke)以(yi)指定,缺省為(wei) 1。使(shi)用(yong) TDengine 的(de)(de)(de)(de)(de)多副本特性,可(ke)以(yi)不(bu)再需要昂(ang)貴的(de)(de)(de)(de)(de)磁盤陣(zhen)列等存(cun)儲(chu)設備,就可(ke)以(yi)獲得(de)同樣的(de)(de)(de)(de)(de)數(shu)(shu)(shu)(shu)(shu)據高(gao)可(ke)靠性。虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)組由管(guan)(guan)理(li)(li)節(jie)(jie)點(dian)創(chuang)建(jian)、管(guan)(guan)理(li)(li),并(bing)且(qie)由管(guan)(guan)理(li)(li)節(jie)(jie)點(dian)分配一個(ge)(ge)系(xi)統唯一的(de)(de)(de)(de)(de) ID,VGroup ID。如(ru)果兩個(ge)(ge)虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)的(de)(de)(de)(de)(de) vnode group ID 相同,說明他們屬于同一個(ge)(ge)組,數(shu)(shu)(shu)(shu)(shu)據互為(wei)備份(fen)。虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)組里虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)的(de)(de)(de)(de)(de)個(ge)(ge)數(shu)(shu)(shu)(shu)(shu)是(shi)可(ke)以(yi)動態改變的(de)(de)(de)(de)(de),容許只有(you)一個(ge)(ge),也就是(shi)沒有(you)數(shu)(shu)(shu)(shu)(shu)據復(fu)(fu)制。VGroup ID 是(shi)永遠(yuan)不(bu)變的(de)(de)(de)(de)(de),即使(shi)一個(ge)(ge)虛(xu)擬(ni)(ni)節(jie)(jie)點(dian)組被刪除,它的(de)(de)(de)(de)(de)ID也不(bu)會被收回重復(fu)(fu)利(li)用(yong)。
TAOSC: taosc 是 TDengine 給(gei)應(ying)(ying)用提供(gong)的(de)驅(qu)動程序(driver),負責(ze)處理(li)應(ying)(ying)用與集群(qun)的(de)接(jie)(jie)(jie)口交互,提供(gong) C/C++ 語言原(yuan)生接(jie)(jie)(jie)口,內嵌于(yu) JDBC、C#、Python、Go、Node.js 語言連接(jie)(jie)(jie)庫里。應(ying)(ying)用都是通過(guo)(guo) taosc 而不是直接(jie)(jie)(jie)連接(jie)(jie)(jie)集群(qun)中的(de)數(shu)據節(jie)點(dian)與整(zheng)個(ge)集群(qun)進(jin)行(xing)交互的(de)。這個(ge)模塊負責(ze)獲(huo)取并緩存元數(shu)據;將插(cha)入、查詢等請求轉發到正確的(de)數(shu)據節(jie)點(dian);在把結果返(fan)回給(gei)應(ying)(ying)用時(shi),還需(xu)要負責(ze)最后一級的(de)聚合、排序、過(guo)(guo)濾等操(cao)作(zuo)。對于(yu) JDBC、C/C++、C#、Python、Go、Node.js 接(jie)(jie)(jie)口而言,這個(ge)模塊是在應(ying)(ying)用所(suo)處的(de)物理(li)節(jie)點(dian)上運行(xing)。同時(shi),為支持(chi)全分布式的(de) RESTful 接(jie)(jie)(jie)口,taosc 在 TDengine 集群(qun)的(de)每個(ge) dnode 上都有一運行(xing)實例(li)。
以(yi)上就(jiu)是 TDengine 集群(qun)的主要邏輯單元,我們將會通過更(geng)多文章,向大(da)家解讀 TDengine 集群(qun)的更(geng)多設計秘籍。


























