一、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 檔案儲存格式

是對 PhysicalPlan的序列化,在檔案裡 多個 PhysicalPlan執行計劃 是一直追加寫,并不會按行來儲存。
為了保證資料的正确性,使用了 CRC32 循環備援校驗技術 ,使用 8 bytes 進行儲存,以便讀取的時候效驗