java wal实现原理,IoTDB-WAL解析

java wal实现原理,IoTDB-WAL解析一、WAL思想先落盘再执行脚本,可以用来做崩溃恢复,保障数据不丢失IoTDB的wal把非连续的写磁盘转换为连续追加写磁盘以提高性能,里面使用了双缓冲机制,一个buffer用来写,另一个buffer用来刷盘,这样不会说一个缓冲区满了就把系统阻塞住。二、WAL总体记录原理对于每一个Memtable,都会记录一个WAL文件,当Memtable被flush完成时,WAL会被删…

大家好,欢迎来到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 文件保存格式

f774608684f84fba19f888155f9b8f15.png

是对 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

(0)
上一篇 2024-02-15 15:45
下一篇 2024-02-15 17:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信