五分鐘掌握 TDengine 數據文件的工作原理

小?T?導讀:今天我們來探討一下——TDengine中的時序數據到底是如何存儲的?

在上一期的文章《五分鐘掌握 TDengine 時序數據的保留策略》中,我們知道了TDengine是如何按照時間段對數據進行分區來管理數據的。

接下來,我們和大家一起從產品使用者的視角繼續向前探索——TDengine中的時序數據到底是如何存儲的?

在那篇文章里,在我們第一次寫入數據并重啟數據庫服務后,在vnode xx路徑下看到了這三個文件。

圖片

這哥仨,其實就是TDengine中廣義上的數據文件,也可以說它們是一個數據文件組。

從后綴上看,仿佛.data這個文件就是數據文件組中的數據文件。而其他二位都是為它保駕護航的“輔助”。但是這個感覺是不夠準確的,因為.last文件同樣也會存儲數據。而.head文件則是存儲數據塊的索引的文件。

在了解它們之前,首先我們要知道兩個參數:

1.minRows:數據塊中記錄的最小條數,單位為條,默認值為100。

2.maxRows:數據塊中記錄的最大條數,單位為條,默認值為4096。

數據塊,是每個.data數據文件里存儲數據的單位,每一個數據塊都只能存儲一個表的數據。所以上面的參數描述的意思就是——形成一個數據塊默認的最小行數是100行,最多就是4096行。

那么,對于一張表來說,小于100行的話數據會去哪兒呢?大于4096行的話數據又去哪兒了呢?

答案是,.last文件正是表行數不足100時數據存放的位置;而大于4096行的表會生成一個新的數據塊。最終在.data文件中,數據塊的分布方式如下:

圖片

當然,這樣講會比較抽象,我們繼續用實例說明:

我們假設創建庫時使用的參數為 maxrows=1000,minrows=100。某庫中有兩張表A和B,我們向其中分別插入1000行和99行數據。然后,我們重啟taosd服務,以上數據就會從內存中落盤到存儲上。這個時候.data文件中會生成1個數據塊,它就是表A的數據塊1,里面擁有1000條數據。而表B的99條數據因為不足minrows所以就進入了.last文件。

接下來,繼續向它們分別插入1000行和99行,然后重啟taosd服務落盤。這個時候表A總共擁有2000條數據,新寫入的1000行數據會被寫入進表A的數據塊2。而表B的數據量現在已經有了198行,大于了100行。于是它們也會被寫入.data文件里面,成為表B的數據塊1。

值得注意的是,當.last文件小于32k的時候,所有數據都只會追加進來。但是當.last文件大于32k的時候,每次落盤.last文件都是重寫生成的了——這個的32k限制是為了防止數據的移動過于頻繁。

所以,我們在做測試的時候會發現:為什么當該表行數從99到100行以上時,.data文件的大小已經增加可.last文件卻沒有變小。只有當.last文件大于32k的時候,才能看到符合我們心理預期的效果——.last文件把數據移到.data文件,.last文件變小,.data文件變大。

以上場景只針對兩個表,但其實放大到100個表,1000個表都是一樣的邏輯。盡管每個vnode內存里存儲的大量數據分屬于不同的表,但是每次落盤只要這些表的行數保證大于minrows,它們都會落入到.data文件的數據塊中。不滿足上述條件的表數據被寫入.last文件后,繼續等待新數據的寫入,直到該表滿足了行數minrows的大小后,.last文件中該表的數據會被讀入到內存,之后一起寫入到.data文件中。

最后總結一下:

.data類文件存儲的是真正的時序數據,為多個數據塊構成。一個數據塊只屬于一張表,且數據塊的順序只與落盤的先后順序有關。

.last文件與.data文件一樣,也是存儲時序數據的,只不過.last文件存儲的塊中的數據條數小于minRows。

本篇文章重點講述的是.last與.data文件的關系。

關于.head文件,我們會在后面的文章中講解。在此之前,我們只要知道它是用來方便查詢數據的索引文件就可以了。.head文件的用途是什么?它會影響到哪些重要的功能?minrows和maxrows的變化會給性能帶來多大的影響呢?以上這類問題都會涉及到很廣泛的性能問題,我們將會在今后的日子慢慢討論。

如果不了解TDengine的體系架構,對于用戶來說很可能是事倍功半的。現在,濤思數據的每一期內容推送都是在為大家未來可以事半功倍而做的內容沉淀。

關于 TDengine

TDengine ?是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺,其核心模塊是高性能、集群開源、云原生、極簡的時序數據庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92382.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:研究http-parser庫相關技術

一、研究背景與意義 在當今數字化時代,網絡數據蘊含著巨大的價值。從商業決策、學術研究到社會治理,對海量網絡信息的有效采集與分析至關重要。網絡爬蟲作為數據獲取的核心工具,其性能與穩定性直接影響數據質量。然而,隨著互聯網技術的發展,網站反爬機制不斷升級,傳統爬…

Go語言實戰案例-批量重命名文件

在《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例17:批量重命名文件 的完整內容,適合初學者實踐如何使用 Go 操作文件系統并批量處理文件名。🎯 案例目標實現一個小工具,能夠批量重命名指定目錄下的所有文件,例如…

基于單片機非接觸紅外測溫系統

傳送門 👉👉👉👉其他作品題目速選一覽表 👉👉👉👉其他作品題目功能速覽 概述 本設計實現了一種基于單片機的非接觸式紅外測溫系統,適用于快速、安全測量物體表面溫…

Python 入門手札:從 0 到會--第十天Python常用的第三方庫Numpy,Pandas,Matplotlib

目錄 一、Numpy 1.NumPy 是什么? 1.1安裝numpy 1.2 導入numpy模塊 2.NumPy 的核心:ndarray 2.1 什么是 ndarray? 2.2 ndarray 的創建方式 2.3 常見屬性(用于查看數組結構) 2.4 ndarray 的切片與索引 2.5 ndarr…

mysql 性能優化之Explain講解

EXPLAIN是 MySQL 中用于分析查詢執行計劃的重要工具,通過它可以查看查詢如何使用索引、掃描數據的方式以及表連接順序等信息,從而找出性能瓶頸。以下是關于EXPLAIN的詳細介紹和實戰指南:1. EXPLAIN 基本用法在SELECT、INSERT、UPDATE、DELETE…

Redis 連接:深度解析與最佳實踐

Redis 連接:深度解析與最佳實踐 引言 Redis 作為一款高性能的內存數據結構存儲系統,在當今的互聯網應用中扮演著越來越重要的角色。高效的 Redis 連接管理對于保證系統的穩定性和性能至關重要。本文將深入探討 Redis 連接的原理、配置以及最佳實踐,幫助讀者更好地理解和應…

C語言---VSCODE的C語言環境搭建

文章目錄資源下載配置環境驗證資源下載 站內下載 配置環境 解壓壓縮包,復制以下文件的路徑 打開主頁搜索系統環境變量 點擊環境變量 選擇系統變量中的Path,點擊編輯 在最后面添加路徑。 添加完成記得關機重啟。 驗證 重啟電腦之后打開在Power…

ojdbc對應jdk版本附下載地址(截止20250722)

可以從Oracle官網查看, JDBC and UCP Downloads page

Redis為什么被設計成是單線程的?

Redis單線程模型解析 當我們說Redis是單線程時,特指"其網絡IO和鍵值對讀寫操作由單個線程完成"。實際上,Redis僅網絡請求模塊和數據操作模塊采用單線程設計,而持久化存儲、集群支持等其他模塊都采用了多線程架構。 事實上,Redis從4.0版本就開始對部分命令實現了…

基礎流程圖

一、常用符號及定義二、 畫圖基礎規則1、從上至下,從左至右流向順序。2、開始符號只能有一個出口。3、進程符號不做校驗邏輯。4、相同流程圖,符號大小應為一致。5、引用流程,不重復繪制。6、路徑符號盡量避免交叉重疊。7、同一路徑&#xff0…

C# 結構體

目錄 1.如何定義一個結構體(struct 關鍵字) 2.如何使用一個結構體 3.如何修改一個數據 4.如何讓去訪問一個學生的信息 5、結構體數組 練習 1.如何定義一個結構體(struct 關鍵字) C#中public 、private、protect的區別 結構…

在Python中操作Word

生成請假條1.準備一個文件“template.docx”,內容如下。2.安裝docxtpl庫。pip install docxtpl3.執行代碼,替換字典內容。from docxtpl import DocxTemplate# 讀取定義模板文件 tpl DocxTemplate(template.docx) # 創建子文檔 sd tpl.new_subdoc() # 添…

網絡協議(四)網絡層 路由協議

在網絡層及網絡層之上使用IP地址,IP地址放在IP數據報的首部,而MAC地址放在MAC幀的首部。通過數據封裝,把IP數據報分組封裝為MAC幀。 由于路由器的隔離,IP網絡中無法通過廣播MAC地址來完成跨網絡的尋址,因此在網絡層中只…

(后者可以節約內存/GPU顯存)Pytorch中求逆torch.inverse和解線性方程組torch.linalg.solve有什么關系

假設我們要求A的逆矩陣,正常情況下我們使用如下命令: torch.inverse(A)但是本人發現,這個函數還挺消耗顯存的。想到求逆矩陣和求線性方程組有很大關系。從而可以使用torch.linalg.solve來求解逆矩陣,關鍵是其顯存消耗小。 求解逆矩…

esp32 idf 使用http訪問json直接拼接content_length = -1

CMakeLists.txt添加網絡請求庫 REQUIRES esp_http_client效果圖D (14235) HTTP_CLIENT: content_length -1 需要直接拼接content_length才能打印#include <stdio.h> #include <string.h> #include "esp_log.h" #include "esp_system.h" #inc…

[Github】下載使用github上的源代碼

一、安裝Anoconda 二、安裝 Git &#xff08;1&#xff09;安裝 方法 1&#xff1a;通過 Git 官網安裝? 下載 Git for Windows&#xff1a;https://git-scm.com/download/win運行安裝程序&#xff0c;??確保勾選 "Add Git to PATH"??&#xff08;重要&#…

Java 邂逅 WebSocket:解鎖實時通信的無限可能?

在當今的互聯網時代&#xff0c;實時通信已經成為許多應用不可或缺的功能。從在線聊天工具到實時游戲互動&#xff0c;從股票行情推送再到物聯網數據傳輸&#xff0c;都對實時性有著極高的要求。而在 Java 技術棧中&#xff0c;WebSocket 技術的出現&#xff0c;為開發者打開了…

MySQL 核心知識點梳理(5)

目錄 事務 MySQL事務的四大特性 ACID 原子性 持久性 隔離性 事務的隔離級別 讀未提交 讀已提交 可重復讀 串行化 事務的隔離級別如何實現 MVCC 版本鏈 READVIEW 高可用 MySQL數據庫的讀寫分離 主從復制 主從同步延遲怎么處理 分庫策略 水平分庫分表的策略…

借助AI學習開源代碼git0.7之六write-tree

借助AI學習開源代碼git0.7之六write-tree write-tree.c 的作用是根據當前的索引&#xff08;cache&#xff09;內容創建一個樹&#xff08;tree&#xff09;對象&#xff0c;并將其寫入Git的對象數據庫。 樹對象代表了項目在某個時間點的目錄結構。 代碼的主要邏輯&#xff1a;…

開源 python 應用 開發(八)圖片比對

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…