前言

在现代互联网系统中,数据的可靠性与一致性至关重要。尤其在数据库、分布式系统和文件系统中,为了防止系统崩溃后数据丢失,Write-Ahead Logging(预写日志)机制成为确保持久化与崩溃恢复的重要手段。

定义

Wiki 定义如下:

In computer science, a write-ahead log (WAL) is a technique for providing atomicity and durability (two of the ACID properties) in database systems.

简而言之:Write-Ahead Log 是一种在修改实际数据前,先将操作记录写入日志的机制,用以实现崩溃恢复和持久化保障。

工作原理

一句话:先写日志,再执行数据写入,确保崩溃后可通过日志回放恢复数据。

基本流程如下:

  1. 应用对数据进行写操作;
  2. 系统先将操作记录写入 WAL;
  3. WAL 持久化后,才进行实际数据页更新;
  4. 系统崩溃时,根据 WAL 重放操作,恢复一致状态;
  5. 操作完成后,可异步清理 WAL。

属性与指标

关注 WAL 的核心属性如下:

  1. Durability(持久性):操作写入日志后即被认为已“成功”;
  2. Atomicity(原子性):通过 WAL 确保事务要么全部执行、要么不执行;
  3. 写放大:写操作需要额外的日志 IO;
  4. 吞吐量(write throughput):受磁盘写入影响;
  5. 恢复时间(recovery latency):依赖于日志回放效率;
  6. 日志压缩与归档:长时间运行需周期性 checkpoint;
  7. 顺序写性能:相比随机写,顺序写日志更高效。

类型

按使用粒度分类:

  1. Page-Level WAL 针对数据页(如数据库页)级别的变更记录。

  2. Logical-Level WAL 记录操作语义(如“插入一行”),便于重放与复制。

  3. Hybrid WAL 同时记录逻辑与物理变更,兼顾恢复速度与灵活性。

按组织结构分类:

  1. 单文件线性日志 顺序写入,周期性 truncate。

  2. 段式日志(Segmented WAL) 划分为多个段,便于归档与清理,常用于大规模系统。

  3. 多通道并发日志 支持并发事务提交,提高吞吐量,常见于现代分布式数据库。

应用场景

WAL 广泛应用于以下系统中:

  1. 关系型数据库:如 PostgreSQL、MySQL(InnoDB)、SQL Server;
  2. NoSQL 数据库:如 RocksDB、LevelDB、Cassandra、HBase;
  3. 分布式系统:如 Raft 共识协议中的日志记录;
  4. 文件系统:如 ext4、XFS 的 journaling;
  5. 消息队列:如 Kafka 使用 WAL 实现高可靠队列;
  6. 缓存系统:如 Redis AOF 模式本质即 WAL;
  7. 区块链系统:用于交易数据写入前备份与验证。

常见实现与产品

以下是使用或实现 WAL 的典型系统和工具:

  1. PostgreSQL:基于 WAL 的强一致性事务管理;
  2. RocksDB:Log-Structured Merge Tree(LSM)架构中的 WAL;
  3. Kafka:高吞吐分布式日志系统,核心即 WAL;
  4. MySQL (InnoDB):采用 redo log 和 undo log 实现 WAL 机制;
  5. HBase:基于 HLog 提供持久化保障;
  6. etcd:Raft 协议 WAL 日志驱动状态复制;
  7. Redis:AOF 模式作为 Write-Ahead Logging 的一种形式;
  8. Apache Pulsar:消息日志亦为 WAL 驱动;