Write-ahead logging(WAL)详解

682 阅读2分钟

1、什么是 WAL

WAL(Write-ahead logging预写日志)是数据库用于实现事务原子性和持久性的技术。

所有的修改在提交之前,系统将其先可靠的写入到 WAL 管理的 Log 文件中,再通过 Log 文件中记录的日志执行真正的操作。如果遵循这种过程,则无需在每个事务的提交时等待系统落盘,因为无论何时何种情况,都可以使用日志进行数据库的恢复。

Log 文件通常包括 redo 和 undo 的信息,Repeating history during Redo,在数据库 crash 之后重启时,通过重新执行数据库在 crash 之前的行为,使数据库恢复到它 crash 之前那一刻的状态,然后 undo 掉 crash 时还在执行的事务;Logging changes during Undo,将 undo 事务时对数据库所做的变更记录日志,保证在重复重启时不会重做。

2、WAL 的优点和缺点

优点

  • 使用 WAL 可以显著的降低磁盘的写次数

当事务提交时,仅需要将所关联的日志文件刷入磁盘,而被事务所改变的数据文件无需刷出,日志文件按顺序进行写入,其同步的代价要远低于刷写数据文件。 例如hudi的requested文件,只需要读其中记录的文件即可,不需要关注所有的文件。

  • 可实现在线备份以及时间点恢复

通过归档的 WAL 数据,可以回转数据至任何一个可用 WAL 数据的操作时间

  • 操作数据的顺序读写

缺点

  • 性能降低

对于非常大的事务,WAL 的性能将会降低。例如,对于 Hbase 的 WAL 写入操作涉及到 HDFS 的 flush 操作,这个操作需要进行 2 次网络连接(第一次连接 NameNode 确定要写入的 DataNode 队列,第二次连接DataNode发送数据),比较耗时,会严重影响 HBase 的写入性能,因此采用了异步提交的写入模式

当并发较大时,WAL 的性能会明显下降,这是因为对于同一台 RegionServer,所有的 WAL 记录在 flush 之前都放在同一个队列中,队列的并发性能对 WAL 的写性能会有较大影响,虽然 WAL 是一个高性能选项,但是非常大或运行时间非常长的事务会引入额外的开销

实际WAL运用很多,hudi和hbase都有利用:待补充。。。

参考链接:juejin.cn/post/713835…