天天看點

IoTDB-WAL解析

一、WAL 思想

先落盤再執行腳本,可以用來做崩潰恢複,保障資料不丢失

IoTDB 的wal 把非連續的寫磁盤轉換為連續追加寫磁盤以提高性能,裡面使用了雙緩沖機制,一個buffer 用來寫,另一個buffer 用來刷盤,這樣不會說一個緩沖區滿了就把系統阻塞住。

二、 WAL 總體記錄原理

   對于每一個 Memtable,都會記錄一個 WAL 檔案,當 Memtable 被 flush 完成時,WAL 會被删掉。

 WAL 記錄細節

   在 org.apache.iotdb.db.writelog.manager 中,會不斷在 nodeMap 中積累 WAL

   WAL 刷磁盤有三種方式(同時啟用)

     1、在 org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode 中會根據配置中的 wal_buffer_size 二分之一配置設定作為 WAL 的logBufferWorking 可寫緩存,另外二分之一作為刷盤緩存區,如在新增 WAL 過程中超過了logBufferWorking 大小則刷到磁盤中

     2、在 org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode 中每次寫入記錄會判斷目前 node 積累的 WAL 大小是否超過配置中的 flush_wal_threshold,如超過則刷到磁盤中

     3、在 org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager 啟動時會生成一個定時線程,每隔 force_wal_period_in_ms 時間間隔定時調用線程将記憶體中的 nodeMap 刷到磁盤中

三、wal 檔案規範

     1、wal 檔案儲存路徑

        在 data/wal 目錄下

     2、 wal 檔案命名 

       字元串 “wal” + fileId ,其中 fileId 初始值為 long fileId = 0 ,每次新增檔案,fileId++

      3、wal 檔案儲存格式

IoTDB-WAL解析

是對 PhysicalPlan的序列化,在檔案裡 多個 PhysicalPlan執行計劃 是一直追加寫,并不會按行來儲存。

為了保證資料的正确性,使用了 CRC32 循環備援校驗技術 ,使用 8 bytes  進行儲存,以便讀取的時候效驗