在计算机科学中,预写式日志(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID属性中的两个)的一系列技术。在使用WAL的系统中,所有的修改在生效之前都要先写入log文件中。
WAL允许用in-place方式更新数据库。另一种用来实现原子更新的方法是shadow paging,它并不是in-place方式。用in-place方式做更新的主要优点是减少索引和块列表的修改。ARIES是WAL系列技术常用的算法。在文件系统中,WAL通常称为journaling。PostgreSQL也是用WAL来提供point-in-time恢复和数据库复制特性。
log文件是存储在磁盘中,即持久化,所以WAL一个核心功能就是保证数据不丢,故障后可以启动恢复。
参考这张图,很好说明了WAL的位置:(sync成本高,append说明是顺序写,同时做批量)
1. 数据库系统中的redo log和undo log。
可以看下本人以前总结过的redo log刷盘策略
2. Zookeeper的更新操作先写事务日志WAL。
3. Elasticsearch 的 translog ,或者叫事务日志,在每一次对 Elasticsearch 进行操作时写入。
4. etcd的wal,数据修改写入wal日志。
5. Hbase的HLog,每次的数据修改都会写入Hlog,同时写入MemStore。
可以参考下如下Hlog和MemStore的关系。
6. Cassandra等等各种其他数据库基本都用到WAL
数据持久性:提高写入效率,会先写入内存,但内存数据不安全,借助WAL落盘
绕过IO瓶颈:避免随机磁盘读写,WAL是顺序日志,提升IO吞吐
数据随机写入会导致脏页较多,导致更多的fsync,将更新转换成顺序的日志,批量刷盘,效率能提升几个量级
高并发:增强写入和读取的并发能力,同时请求时数据写入和最终数据落盘是可以并行执行