六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

TDengine 2.0 執(zhí)行代碼taosd的設(shè)計

邏輯上,TDengine系統(tǒng)包含dnode, taosc和App,dnode是服務(wù)器側(cè)執(zhí)行代碼taosd的一個運行實例,因此taosd是TDengine的核心,本文對taosd的設(shè)計做一簡單的介紹,模塊內(nèi)的實現(xiàn)細(xì)節(jié)請見其他文檔。

系統(tǒng)模塊圖

taosd包含rpc, dnode, vnode, tsdb, query, cq, sync, wal, mnode, http, monitor等模塊,具體如下圖:

modules.png

taosd的啟動入口是dnode模塊,dnode然后啟動其他模塊,包括可選配置的http, monitor模塊。taosc或dnode之間交互的消息都是通過rpc模塊進(jìn)行,dnode模塊根據(jù)接收到的消息類型,將消息分發(fā)到vnode或mnode的消息隊列,或由dnode模塊自己消費。dnode的工作線程(worker)消費消息隊列里的消息,交給mnode或vnode進(jìn)行處理。下面對各個模塊做簡要說明。

RPC模塊

該模塊負(fù)責(zé)taosd與taosc, 以及其他數(shù)據(jù)節(jié)點之間的通訊。TDengine沒有采取標(biāo)準(zhǔn)的HTTP或gRPC等第三方工具,而是實現(xiàn)了自己的通訊模塊RPC。

考慮到物聯(lián)網(wǎng)場景下,數(shù)據(jù)寫入的包一般不大,因此除支持TCP連接之外,RPC還支持UDP連接。當(dāng)數(shù)據(jù)包小于15K時,RPC將采用UDP方式進(jìn)行連接,否則將采用TCP連接。對于查詢類的消息,RPC不管包的大小,總是采取TCP連接。對于UDP連接,RPC實現(xiàn)了自己的超時、重傳、順序檢查等機(jī)制,以保證數(shù)據(jù)可靠傳輸。

RPC模塊還提供數(shù)據(jù)壓縮功能,如果數(shù)據(jù)包的字節(jié)數(shù)超過系統(tǒng)配置參數(shù)compressMsgSize, RPC在傳輸中將自動壓縮數(shù)據(jù),以節(jié)省帶寬。

為保證數(shù)據(jù)的安全和數(shù)據(jù)的integrity, RPC模塊采用MD5做數(shù)字簽名,對數(shù)據(jù)的真實性和完整性進(jìn)行認(rèn)證。

DNODE模塊

該模塊是整個taosd的入口,它具體負(fù)責(zé)如下任務(wù):

  • 系統(tǒng)的初始化,包括
    • 從文件taos.cfg讀取系統(tǒng)配置參數(shù),從文件dnodeCfg.json讀取數(shù)據(jù)節(jié)點的配置參數(shù);
    • 啟動RPC模塊,并建立起與taosc通訊的server連接,與其他數(shù)據(jù)節(jié)點通訊的server連接;
    • 啟動并初始化dnode的內(nèi)部管理, 該模塊將掃描該數(shù)據(jù)節(jié)點已有的vnode,并打開它們;
    • 初始化可配置的模塊,如mnode, http, monitor等。
  • 數(shù)據(jù)節(jié)點的管理,包括
    • 定時的向mnode發(fā)送status消息,報告自己的狀態(tài);
    • 根據(jù)mnode的指示,創(chuàng)建、改變、刪除vnode;
    • 根據(jù)mnode的指示,修改自己的配置參數(shù);
  • 消息的分發(fā)、消費,包括
    • 為每一個vnode和mnode的創(chuàng)建并維護(hù)一個讀隊列、一個寫隊列;
    • 將從taosc或其他數(shù)據(jù)節(jié)點來的消息,根據(jù)消息類型,將其直接分發(fā)到不同的消息隊列,或由自己的管理模塊直接消費;
    • 維護(hù)一個讀的線程池,消費讀隊列的消息,交給vnode或mnode處理。為支持高并發(fā),一個讀線程(Worker)可以消費多個隊列的消息,一個讀隊列可以由多個worker消費;
    • 維護(hù)一個寫的線程池,消費寫隊列的消息,交給vnode或mnode處理。為保證寫操作的序列化,一個寫隊列只能由一個寫線程負(fù)責(zé),但一個寫線程可以負(fù)責(zé)多個寫隊列。

taosd的消息消費由dnode通過讀寫線程池進(jìn)行控制,是系統(tǒng)的中樞。該模塊內(nèi)的結(jié)構(gòu)體圖如下:

dnode.png

VNODE模塊

vnode是一獨立的數(shù)據(jù)存儲查詢邏輯單元,但因為一個vnode只能容許一個DB,因此vnode內(nèi)部沒有account, DB, user等概念。為實現(xiàn)更好的模塊化、封裝以及未來的擴(kuò)展,它有很多子模塊,包括負(fù)責(zé)存儲的TSDB,負(fù)責(zé)查詢的Query, 負(fù)責(zé)數(shù)據(jù)復(fù)制的sync,負(fù)責(zé)數(shù)據(jù)庫日志的的wal, 負(fù)責(zé)連續(xù)查詢的cq(continuous query), 負(fù)責(zé)事件觸發(fā)的流計算的event等模塊,這些子模塊只與vnode模塊發(fā)生關(guān)系,與其他模塊沒有任何調(diào)用關(guān)系。模塊圖如下:

vnode.png

vnode模塊向下,與dnodeVRead,dnodeVWrite發(fā)生互動,向上,與子模塊發(fā)生互動。它主要的功能有:

  • 協(xié)調(diào)各個子模塊的互動。各個子模塊之間都不直接調(diào)用,都需要通過vnode模塊進(jìn)行;
  • 對于來自taosc或mnode的寫操作,vnode模塊將其分解為寫日志(wal), 轉(zhuǎn)發(fā)(sync), 本地存儲(tsdb)子模塊的操作;
  • 對于查詢操作,分發(fā)到query模塊進(jìn)行。

一個數(shù)據(jù)節(jié)點里有多個vnode, 因此vnode模塊是有多個運行實例的。每個運行實例是完全獨立的。

vnode與其子模塊是通過API直接調(diào)用,而不是通過消息隊列傳遞。而且各個子模塊只與vnode模塊有交互,不與dnode, rpc等模塊發(fā)生任何直接關(guān)聯(lián)。

MNODE模塊

mnode是整個系統(tǒng)的大腦,負(fù)責(zé)整個系統(tǒng)的資源調(diào)度,負(fù)責(zé)meta data的管理與存儲。

一個運行的系統(tǒng)里,只有一個mnode,但它有多個副本(由系統(tǒng)配置參數(shù)numOfMnodes控制)。這些副本分布在不同的dnode里,目的是保證系統(tǒng)的高可靠運行。副本之間的數(shù)據(jù)復(fù)制是采用同步而非異步的方式,以確保數(shù)據(jù)的一致性,確保數(shù)據(jù)不會丟失。這些副本會自動選舉一個Master,其他副本是slave。所有數(shù)據(jù)更新類的操作,都只能在master上進(jìn)行,而查詢類的可以在slave節(jié)點上進(jìn)行。代碼實現(xiàn)上,同步模塊與vnode共享,但mnode被分配一個特殊的vgroup ID: 1,而且quorum大于1。整個集群系統(tǒng)是由多個dnode組成的,運行的mnode的副本數(shù)不可能超過dnode的個數(shù),但不會超過配置的副本數(shù)。如果某個mnode副本宕機(jī)一段時間,只要超過半數(shù)的mnode副本仍在運行,運行的mnode會自動根據(jù)整個系統(tǒng)的資源情況,在其他dnode里再啟動一個mnode, 以保證運行的副本數(shù)。

各個dnode通過信息交換,保存有mnode各個副本的End Point列表,并向其中的master節(jié)點定時(間隔由系統(tǒng)配置參數(shù)statusInterval控制)發(fā)送status消息,消息體里包含該dnode的CPU、內(nèi)存、剩余存儲空間、vnode個數(shù),以及各個vnode的狀態(tài)(存儲空間、原始數(shù)據(jù)大小、記錄條數(shù)、角色等)。這樣mnode就了解整個系統(tǒng)的資源情況,如果用戶創(chuàng)建新的表,就可以決定需要在哪個dnode創(chuàng)建;如果增加或刪除dnode, 或者監(jiān)測到某dnode數(shù)據(jù)過熱、或離線太長,就可以決定需要挪動那些vnode,以實現(xiàn)負(fù)載均衡。

mnode里還負(fù)責(zé)account, user, DB, stable, table, vgroup, dnode的創(chuàng)建、刪除與更新。mnode不僅把這些entity的meta data保存在內(nèi)存,還做持久化存儲。但為節(jié)省內(nèi)存,各個表的標(biāo)簽值不保存在mnode(保存在vnode),而且子表不維護(hù)自己的schema, 而是與stable共享。為減小mnode的查詢壓力,taosc會緩存table、stable的schema。對于查詢類的操作,各個slave mnode也可以提供,以減輕master壓力。

TSDB模塊

TSDB模塊是VNODE中的負(fù)責(zé)快速高并發(fā)地存儲和讀取屬于該VNODE的表的元數(shù)據(jù)及采集的時序數(shù)據(jù)的引擎。除此之外,TSDB還提供了表結(jié)構(gòu)的修改、表標(biāo)簽值的修改等功能。TSDB提供API供VNODE和Query等模塊調(diào)用。TSDB中存儲了兩類數(shù)據(jù),1:元數(shù)據(jù)信息;2:時序數(shù)據(jù)

元數(shù)據(jù)信息

TSDB中存儲的元數(shù)據(jù)包含屬于其所在的VNODE中表的類型,schema的定義等。對于超級表和超級表下的子表而言,又包含了tag的schema定義以及子表的tag值等。對于元數(shù)據(jù)信息而言,TSDB就相當(dāng)于一個全內(nèi)存的KV型數(shù)據(jù)庫,屬于該VNODE的表對象全部在內(nèi)存中,方便快速查詢表的信息。除此之外,TSDB還對其中的子表,按照tag的第一列取值做了全內(nèi)存的索引,大大加快了對于標(biāo)簽的過濾查詢。TSDB中的元數(shù)據(jù)的最新狀態(tài)在落盤時,會以追加(append-only)的形式,寫入到meta文件中。meta文件只進(jìn)行追加操作,即便是元數(shù)據(jù)的刪除,也會以一條記錄的形式寫入到文件末尾。TSDB也提供了對于元數(shù)據(jù)的修改操作,如表schema的修改,tag schema的修改以及tag值的修改等。

時序數(shù)據(jù)

每個TSDB在創(chuàng)建時,都會事先分配一定量的內(nèi)存緩沖區(qū),且內(nèi)存緩沖區(qū)的大小可配可修改。表采集的時序數(shù)據(jù),在寫入TSDB時,首先以追加的方式寫入到分配的內(nèi)存緩沖區(qū)中,同時建立基于時間戳的內(nèi)存索引,方便快速查詢。當(dāng)內(nèi)存緩沖區(qū)的數(shù)據(jù)積累到一定的程度時(達(dá)到內(nèi)存緩沖區(qū)總大小的1/3),則會觸發(fā)落盤操作,將緩沖區(qū)中的數(shù)據(jù)持久化到硬盤文件上。時序數(shù)據(jù)在內(nèi)存緩沖區(qū)中是以行(row)的形式存儲的。

而時序數(shù)據(jù)在寫入到TSDB的數(shù)據(jù)文件時,是以列(column)的形式存儲的。TSDB中的數(shù)據(jù)文件包含多個數(shù)據(jù)文件組,每個數(shù)據(jù)文件組中又包含.head、.data和.last三個文件,如(v2f1801.head、v2f1801.data、v2f1801.last)數(shù)據(jù)文件組。TSDB中的數(shù)據(jù)文件組是按照時間跨度進(jìn)行分片的,默認(rèn)是10天一個文件組,且可通過配置文件及建庫選項進(jìn)行配置。分片的數(shù)據(jù)文件組又按照編號遞增排列,方便快速定位某一時間段的時序數(shù)據(jù),高效定位數(shù)據(jù)文件組。時序數(shù)據(jù)在TSDB的數(shù)據(jù)文件中是以塊的形式進(jìn)行列式存儲的,每個塊中只包含一張表的數(shù)據(jù),且數(shù)據(jù)在一個塊中是按照時間順序遞增排列的。在一個數(shù)據(jù)文件組中,.head文件負(fù)責(zé)存儲數(shù)據(jù)塊的索引及統(tǒng)計信息,如每個塊的位置,壓縮算法,時間戳范圍等。存儲在.head文件中一張表的索引信息是按照數(shù)據(jù)塊中存儲的數(shù)據(jù)的時間遞增排列的,方便進(jìn)行折半查找等工作。.head和.last文件是存儲真實數(shù)據(jù)塊的文件,若數(shù)據(jù)塊中的數(shù)據(jù)累計到一定程度,則會寫入.data文件中,否則,會寫入.last文件中,等待下次落盤時合并數(shù)據(jù)寫入.data文件中,從而大大減少文件中塊的個數(shù),避免數(shù)據(jù)的過度碎片化。

Query模塊

該模塊負(fù)責(zé)整體系統(tǒng)的查詢處理??蛻舳苏{(diào)用該該模塊進(jìn)行SQL語法解析,并將查詢或?qū)懭胝埱蟀l(fā)送到vnode,同時負(fù)責(zé)針對超級表的查詢進(jìn)行二階段的聚合操作。在Vnode端,該模塊調(diào)用TSDB模塊讀取系統(tǒng)中存儲的數(shù)據(jù)進(jìn)行查詢處理。Query模塊還定義了系統(tǒng)能夠支持的全部查詢函數(shù),查詢函數(shù)的實現(xiàn)機(jī)制與查詢框架無耦合,可以在不修改查詢流程的情況下動態(tài)增加查詢函數(shù)。詳細(xì)的設(shè)計請參見《TDengine 2.0查詢模塊設(shè)計》。

SYNC模塊

該模塊實現(xiàn)數(shù)據(jù)的多副本復(fù)制,包括vnode與mnode的數(shù)據(jù)復(fù)制,支持異步和同步兩種復(fù)制方式,以滿足meta data與時序數(shù)據(jù)不同復(fù)制的需求。因為它為mnode與vnode共享,系統(tǒng)為mnode副本預(yù)留了一個特殊的vgroup ID:1。因此vnode group的ID是從2開始的。

每個vnode/mnode模塊實例會有一對應(yīng)的sync模塊實例,他們是一一對應(yīng)的。詳細(xì)設(shè)計請見TDengine 2.0 數(shù)據(jù)復(fù)制模塊設(shè)計

WAL模塊

該模塊負(fù)責(zé)將新插入的數(shù)據(jù)寫入write ahead log(WAL), 為vnode, mnode共享。以保證服務(wù)器crash或其他故障,能從WAL中恢復(fù)數(shù)據(jù)。

每個vnode/mnode模塊實例會有一對應(yīng)的wal模塊實例,是完全一一對應(yīng)的。WAL的落盤操作由兩個參數(shù)walLevel, fsync控制。看具體場景,如果要100%保證數(shù)據(jù)不會丟失,需要將walLevel配置為2,fsync設(shè)置為0,每條數(shù)據(jù)插入請求,都會實時落盤后,才會給應(yīng)用確認(rèn)

HTTP模塊

該模塊負(fù)責(zé)處理系統(tǒng)對外的RESTful接口,可以通過配置,由dnode啟動或停止。

該模塊將接收到的RESTful請求,做了各種合法性檢查后,將其變成標(biāo)準(zhǔn)的SQL語句,通過taosc的異步接口,將請求發(fā)往整個系統(tǒng)中的任一dnode。收到處理后的結(jié)果后,再翻譯成HTTP協(xié)議,返回給應(yīng)用。

如果HTTP模塊啟動,就意味著啟動了一個taosc的實例。任一一個dnode都可以啟動該模塊,以實現(xiàn)對RESTful請求的分布式處理。

Monitor模塊

該模塊負(fù)責(zé)檢測一個dnode的運行狀態(tài),可以通過配置,由dnode啟動或停止。原則上,每個dnode都應(yīng)該啟動一個monitor實例。

Monitor采集TDengine里的關(guān)鍵操作,比如創(chuàng)建、刪除、更新賬號、表、庫等,而且周期性的收集CPU、內(nèi)存、網(wǎng)絡(luò)等資源的使用情況(采集周期由系統(tǒng)配置參數(shù)monitorInterval控制)。獲得這些數(shù)據(jù)后,monitor模塊將采集的數(shù)據(jù)寫入系統(tǒng)的日志庫(DB名字由系統(tǒng)配置參數(shù)monitorDbName控制)。

Monitor模塊使用taosc來將采集的數(shù)據(jù)寫入系統(tǒng),因此每個monitor實例,都有一個taosc運行實例。