TSDB 模塊是 VNODE 中的負責(zé)快速高并發(fā)地存儲和讀取屬于該 VNODE 的表的元數(shù)據(jù)及采集的時間序列數(shù)據(jù)的引擎。除此之外,TSDB 還提供了表結(jié)構(gòu)的修改、表標簽值的修改等功能。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 就相當于一個全內(nèi)存的 KV 型數(shù)據(jù)庫,屬于該 VNODE 的表對象全部在內(nèi)存中,方便快速查詢表的信息。除此之外,TSDB 還對其中的子表,按照 tag 的第一列取值做了全內(nèi)存的索引,大大加快了對于標簽的過濾查詢。TSDB 中的元數(shù)據(jù)的最新狀態(tài)在落盤時,會以追加(append-only)的形式,寫入到 meta 文件中。meta 文件只進行追加操作,即便是元數(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)存索引,方便快速查詢。當內(nèi)存緩沖區(qū)的數(shù)據(jù)積累到一定的程度時(達到內(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ù)文件組是按照時間跨度進行分片的,默認是 10 天一個文件組,且可通過配置文件及建庫選項進行配置。分片的數(shù)據(jù)文件組又按照編號遞增排列,方便快速定位某一時間段的時序數(shù)據(jù),高效定位數(shù)據(jù)文件組。時間序列數(shù)據(jù)在 TSDB 的數(shù)據(jù)文件中是以塊的形式進行列式存儲的,每個塊中只包含一張表的數(shù)據(jù),且數(shù)據(jù)在一個塊中是按照時間順序遞增排列的。在一個數(shù)據(jù)文件組中,.head文件負責(zé)存儲數(shù)據(jù)塊的索引及統(tǒng)計信息,如每個塊的位置,壓縮算法,時間戳范圍等。存儲在.head文件中一張表的索引信息是按照數(shù)據(jù)塊中存儲的數(shù)據(jù)的時間遞增排列的,方便進行折半查找等工作。.head和.last文件是存儲真實數(shù)據(jù)塊的文件,若數(shù)據(jù)塊中的數(shù)據(jù)累計到一定程度,則會寫入.data文件中,否則,會寫入.last文件中,等待下次落盤時合并數(shù)據(jù)寫入.data文件中,從而大大減少文件中塊的個數(shù),避免數(shù)據(jù)的過度碎片化。



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



-1.png)










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



