Disk can lie to you when you write to it
5 months ago
- #database
- #WAL
- #durability
- 预写日志(WAL)对数据库持久性至关重要,但磁盘可能出现静默故障
- 常见问题包括:页面缓存问题、磁盘虚假成功报告、写入顺序混乱以及单点故障
- 健壮WAL的五层防御机制:校验和、双WAL文件、O_DIRECT+O_DSYNC、链式I/O排序、同步后验证读取
- 校验和(CRC32C)可检测硬件或固件错误导致的静默数据损坏
- 双WAL文件通过维护冗余副本防范潜在扇区错误(LSEs)
- O_DIRECT和O_DSYNC确保数据绕过内核页面缓存直接写入磁盘
- 链式I/O排序(Linux中的io_uring)保证写入和fsync操作按正确顺序完成
- 同步后验证读取通过重新读取和校验已写入数据立即捕获静默故障
- 恢复流程包括:扫描双WAL文件、合并有效记录、重放操作以恢复一致状态
- 实际案例凸显这些防护层的重要性,如静默损坏和页面缓存异常
- 生产级WAL必须包含校验和、冗余、直接写入、操作排序和验证机制,才能履行其持久性契约