无码人妻精品一区二区三18禁,影音先锋男人AV橹橹色,污污污污污污www网站免费,日韩成人av无码一区二区三区,欧美性受xxxx狂喷水

8 分鐘了解 TDengine 的 WAL 機制

Yu Chen

2022-02-17 / ,

WAL(Write Ahead Log),是 TDengine Database 的一(yi)個重要的功(gong)能模塊,它可以實現數據的容錯能力(li),保證數據的高可用。

聽著復雜,其實也很簡單。對于關系型數據庫的使用者來說,它大概就相當于 Oracle 中的 redolog ,MySQL 中的 binlog 和 redolog,里面記錄的是一切關于數據庫的更新修改操作。

Write Ahead Log 翻譯一(yi)下(xia)是(shi)“預寫(xie)日(ri)志(zhi)”,含義就(jiu)是(shi):在(zai)數(shu)(shu)據(ju)寫(xie)入存(cun)儲之前(qian),先(xian)按照時間(jian)順(shun)序在(zai)日(ri)志(zhi)中做一(yi)下(xia)記錄,這樣就(jiu)可(ke)以確(que)保應用能夠通過(guo)這個(ge)日(ri)志(zhi)將(jiang)數(shu)(shu)據(ju)庫(ku)恢復到任意的某個(ge)狀(zhuang)態,即使數(shu)(shu)據(ju)庫(ku)因為斷電(dian)等意外事(shi)故宕(dang)機,也能避(bi)免數(shu)(shu)據(ju)的丟失。

目前,TDengine Database 的社區(qu)版尚(shang)不支持將數據(ju)回滾(gun)到(dao)指定時間,如有需要,可以(yi)聯系我們的企業版團隊來解決。

TDengine 中的 WAL 實現機制稍有特殊。它把 WAL 分為兩部分,一種是 mnode 目錄下的 WAL,一種是 vnode 目錄下的 WAL。(為了方便本文的閱讀,這里需要大家首先了解 TDengine 的基礎架構:管理節點(mnode)和虛擬數據節點(vnode)的概念

在 TDengine 的(de)數據文件路徑下(默認為/var/lib/taos),就(jiu)可以看到上述目錄結構。

目錄結構

mnode 的(de) WAL 內容是持久化(hua)在硬盤上的(de),作為最(zui)重(zhong)要的(de)管理(li)節點,它的(de) WAL 記錄著所有關于數(shu)據庫(ku)的(de) DDL 操(cao)作(比如創(chuang)建刪除(chu)操(cao)作:create dnode,create account,create mnode,create user,create table, drop dnode ,drop table等,或者修改操(cao)作:alter database,alter table ,alter user等)

而 vnode 目錄下的 WAL 則主要負責記錄著寫入數據的操作,與此同時也記錄著對表的 DDL 操作,在觸發落盤后會清零。(這就是我們在之前的文章——比如《存儲成本僅為OpenTSDB的1/10,TDengine的最大殺手锏竟然是什么?》——中經(jing)常(chang)提(ti)及的(de)部分(fen),大(da)家(jia)可以結合此文閱讀(du),以加深(shen)理解。)

之后,寫入 vnode 的時序數據會落盤到數據文件目錄 /vnode/vnodeX/tsdb/data 下面。而對于表的(de) DDL 操作(也就(jiu)是表的(de)元(yuan)數據(ju))則會落盤到數據(ju)文(wen)件目(mu)錄/vnode/vnodeX/tsdb/meta文(wen)件中(zhong),如下所示:

落盤文件
vnode工作流程

上面的第二張圖(tu)是 vnode 的工作流程,從這里我們可以更清楚地(di)看到時序(xu)數據(ju)和元數據(ju)是如何在寫滿三分之一的 buffer pool 后落地(di)到磁盤的(一個 meta 文件,一個數據(ju)文件組:.data、.head、.last文件)。

總結而言,mnode 通過 WAL 記錄了集群、用戶、數據庫以及表的元數據等信息。而 vnode 通過 WAL 記錄了數據和表的元數據,并且會在落盤觸發后清零,而其記錄的表的元數據會被寫入到 meta 文件,時序數據會被寫入到 data 目錄。

在了(le)解(jie)了(le) WAL 的(de)作用后,接下來會衍生出細節的(de)場(chang)景:

首先,WAL 是將數(shu)據(ju)庫數(shu)據(ju)更(geng)新操(cao)作(zuo)(zuo)按照時間順序追(zhui)加更(geng)新的(de)日志文(wen)件。數(shu)據(ju)庫進程(cheng) taosd 在啟(qi)動的(de)時候會逐行讀取 mnode 下的(de) WAL 文(wen)件并操(cao)作(zuo)(zuo),直到最(zui)后一(yi)行,才能順利(li)啟(qi)動服務。

這(zhe)樣的(de)構造下,可能會導致這(zhe)個問題出(chu)現:

1. 當累計的 DDL 操作過多時,TDengine 的啟動會變慢——那么要如何避免這種情況的發生呢?

首先,當子表數(shu)量絕(jue)(jue)對(dui)大的(de)時候(hou),這(zhe)(zhe)個情況(kuang)是沒法避免(mian)的(de)。但是這(zhe)(zhe)是一個很大的(de)數(shu)量級,對(dui)于絕(jue)(jue)大多數(shu)用(yong)戶都是達不到的(de)。

更容易(yi)出現的(de)(de)(de)(de)是(shi)(shi)(shi)這種(zhong)情(qing)況:這個(ge)(ge)(ge)環境(jing)表(biao)(biao)數(shu)量并不(bu)是(shi)(shi)(shi)很多,但是(shi)(shi)(shi)卻充滿了頻繁的(de)(de)(de)(de)刪庫刪表(biao)(biao)重(zhong)建(jian)表(biao)(biao)等操(cao)(cao)作。比如(ru),創建(jian)一個(ge)(ge)(ge)十(shi)萬(wan)子表(biao)(biao)的(de)(de)(de)(de)超級表(biao)(biao)后刪掉,然后再重(zhong)建(jian)這個(ge)(ge)(ge)超級表(biao)(biao)。等到(dao)數(shu)據庫啟(qi)動(dong)加載(zai) WAL 的(de)(de)(de)(de)時候,即便(bian)前面的(de)(de)(de)(de) create table 和 drop table 都是(shi)(shi)(shi)無(wu)效的(de)(de)(de)(de)操(cao)(cao)作,但是(shi)(shi)(shi)還會(hui)被操(cao)(cao)作一遍,而且刪表(biao)(biao)操(cao)(cao)作本身(shen)在加載(zai)的(de)(de)(de)(de)時候也會(hui)更慢一些,從而大幅拖慢 TDengine 的(de)(de)(de)(de)啟(qi)動(dong)速(su)度。

因此,為了避免這種情況,生產環境上一定要慎重。尤其是要盡量杜絕刪庫、刪除超級表這些重大操作,如果是為了調試,反復重建的測試操作一定要在測試環境進行,生產環境不可延用測試環境直接建庫建表投入使用,除非該服務器的 TDengine 已經卸載干凈。

2. 那如果是使用時間太久,或者各種更改表結構的操作無可避免,導致 mnode 下的 WAL 過大,是不是無解了呢?

對于這種情況,在 2.1.5 版本之(zhi)后,我們提(ti)供了離線壓縮 Mnode WAL 的方(fang)案來解決:

1)單機:

  1. systemctl stop taosd。
  2. taosd –compact-mnode-wal,如果執行正常的話,會在數據文件目錄下生成 mnode_bak 目錄,用于保存原數據。
  3. systemctl start taosd,這樣 TDengine 就會使用壓縮過的 wal 日志來啟動數據庫服務進程。

2)集群:

  1. show mnodes ,確認 mnode 節點所在的服務器,并且區分 mnode 的 master 和 slave。
  2. systemctl stop taosd,停止集群所有節點。
  3. 【可選】移出所有mnode 節點上的 mnode_bak目錄。
  4. 在 mnode master 服務器上,以 root 權限執行 taosd –compact-mnode-wal 。
  5. 將 mnode master 壓縮后的 mnode/wal/* 文件復制到其他 slave 節點對應目錄。
  6. 重啟集群。

值得注意的是,taosd –compact-mnode-wal 命令第一次的運行時間與壓縮前集群啟動時間基本相同,要等到下次再啟動的時候速度才會變快。

此(ci)外,在(zai)未來的(de)(de)(de)(de)(de) TDengine 3.0 版(ban)本中,這也(ye)(ye)會(hui)(hui)(hui)是我們(men)的(de)(de)(de)(de)(de)重大的(de)(de)(de)(de)(de)優(you)化(hua)項(xiang)。由于(yu)(yu) WAL 也(ye)(ye)會(hui)(hui)(hui)變成(cheng)分布式(shi)的(de)(de)(de)(de)(de)存儲,屆時(shi),即使是在(zai)億(yi)級別(bie)表(biao)(biao)數(shu)量的(de)(de)(de)(de)(de)情況下,TDengine 的(de)(de)(de)(de)(de)啟停速度也(ye)(ye)都(dou)不再會(hui)(hui)(hui)是問題。而且這項(xiang)優(you)化(hua)不過是 3.0 版(ban)本諸多(duo)(duo)特性的(de)(de)(de)(de)(de)冰山一角。這項(xiang)調整(zheng)的(de)(de)(de)(de)(de)背后代表(biao)(biao)著 TDengine 對(dui)于(yu)(yu)很多(duo)(duo)重要模塊的(de)(de)(de)(de)(de)優(you)化(hua)重構,穩定性和性能都(dou)會(hui)(hui)(hui)大幅提高,多(duo)(duo)項(xiang)重磅功(gong)能也(ye)(ye)會(hui)(hui)(hui)上線(xian)。

從 1.0 時代跟過來的老用戶(hu)應該會(hui)對 2.0 的版本的進步深有(you)感(gan)觸,3.0 版本可以說更是(shi)青(qing)出于藍。

讓我們一起期待。