大家好,欢迎来到IT知识分享网。
一、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 进行保存,以便读取的时候效验
四、IoTDB WAL 最佳实践
IotDB 的wal 默认 是 开启了 wal ( enableWal = true ),每 隔 100 毫秒 (forceWalPeriodInMs = 100) 刷盘一次,其中 flushWalThreshold = 10000 ,也就是说,默认情况下有可能丢失flushWalThreshold 10000 个操作 ,如果需要确保数据不丢失,可以将 forceWalPeriodInMs 设置为 0 ,让每次更新都 执行 channel.force(true) 强制刷盘操作。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15670.html