天天看点

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  进行保存,以便读取的时候效验