PostgreSQL 9.5:WAL 新格式与 wal_compression 源码级解析及9.5→18演进
·
PostgreSQL 9.5:WAL 新格式与 wal_compression 源码级解析及9.5→18演进
本文围绕 PostgreSQL 9.5 引入的“新的 WAL 记录格式”与“WAL 压缩(wal_compression)”两项内核改动,提供从设计动机、行为语义到源码路径的系统性认知,并概览后续版本的相关演进。内容覆盖:概述、背景、名词解释、源码映射、执行流程与恢复、性能与配置、兼容性与迁移、Mermaid 图(配色优化)、参考资料与“速记口”总结。
简介与项目背景
WAL(Write-Ahead Logging)是 PostgreSQL 持久化与崩溃恢复的基石。9.5 在 WAL 层做了两项关键增强:
- 新的 WAL 记录格式:提升 WAL 记录组织与可扩展性。
- WAL 压缩:为 Full Page Images(FPI,全页镜像)提供 PGLZ 压缩,降低 I/O 与存储占用。
动机:
- 在高写入负载与大页镜像(FPI)场景中,WAL 数据量显著增大,影响归档与复制链路的吞吐与延迟。
- 新的记录格式与压缩机制降低冗余,提高恢复读写效率与可维护性。
名词解释
- WAL:预写日志,记录事务与数据页变更,用于崩溃恢复与流复制。
- FPI(Full Page Image):在检查点之后某页第一次被修改时,写入该页的完整镜像到 WAL,以防 torn page 导致恢复失败。
- wal_compression:GUC 参数,开启后对 FPI 进行 PGLZ 压缩(默认关闭)。
- PGLZ:PostgreSQL 自带的轻量压缩算法库。
- Checkpoint:将脏页刷新到磁盘、推进系统恢复点的过程。
- WAL 归档与流复制:将 WAL 段文件归档或通过复制协议发送到备库用于重放。
源码映射与实现要点
文件与目录位置(路径级引用):
- 新 WAL 记录格式头文件:
src/include/access/xlogrecord.h - WAL 写入与插入:
src/backend/access/transam/xloginsert.c - WAL 主控与记录:
src/backend/access/transam/xlog.c - WAL 读取与解析:
src/backend/access/transam/xlogreader.c - PGLZ 压缩实现:
src/common/pg_lzcompress.c - GUC 参数注册与解析:
src/backend/utils/misc/guc.c
说明:
- 9.5 引入的“新 WAL 记录格式”在上述头文件与插入路径中生效,读取端相应调整以识别新的记录布局。
- FPI 压缩由插入路径在构造 WAL 记录时决定是否调用 PGLZ,对应参数由 GUC 控制。
行为与执行流程(简化)
- 普通写入:
- 数据页被修改 → 生成对应 WAL 记录(非 FPI)。
- FPI 触发条件:
- 在检查点完成后,该页第一次被修改 → 记录完整页镜像到 WAL(FPI)。
- wal_compression 行为:
- 当 wal_compression = on 时,对 FPI 执行 PGLZ 压缩后再写入 WAL。
- wal_compression 仅影响 FPI,不影响普通逻辑记录。
- 恢复与重放:
- 读取端识别新格式 → 对压缩 FPI 解压 → 按顺序将变更重放到数据页。
与 9.5 文档对应的变化条目
根据 9.5 资料:
- 新 WAL 格式与 FPI 压缩属于“架构级改动与参数新增”,对应章节见本地文档索引(Architecture → WAL compression、New WAL format)。
配置项与联动
- wal_compression(默认 off):
- 开启后压缩 FPI,降低写入体积,但会增加 CPU 开销。
- 参数定义与解析:
src/backend/utils/misc/guc.c
- full_page_writes(常见默认 on):
- 控制是否在检查点后首次修改时写入 FPI;与 wal_compression 联动。
- wal_level(minimal|replica|logical):
- 控制 WAL 记录的详细程度;在流复制/逻辑复制场景通常为 replica 或 logical。
- max_wal_size/min_wal_size、checkpoint_timeout:
- 影响 WAL 段滚动与检查点频率,间接影响 FPI 发生与 WAL 数据量。
性能与资源权衡
- 压缩收益:
- 在写入高峰、页镜像频繁(如大量脏页在 checkpoint 后被首次修改)的场景,可显著降低 WAL 占用与归档带宽。
- CPU 开销:
- 压缩/解压占用 CPU,在多核与 I/O 受限场景通常收益明显;CPU 紧张场景需评估。
- 恢复时间:
- 压缩记录在恢复时需解压,恢复时间与压缩比/CPU 性能相关。
- 实践建议:
- 结合业务写入模式、I/O 与 CPU 资源评估是否开启。
- 在备库或归档链路压力较大的环境更优先考虑开启。
兼容性与迁移
- 版本兼容:
- 主库/备库需匹配或支持新格式记录;升级过程中遵循官方升级路径。
- 归档/备份链路:
- 压缩后 WAL 段体积变小,有利于网络传输与存储;关注压缩/解压端的 CPU。
- 监控与观测:
- 关注 WAL 产生速率、归档延迟、备库重放滞后等指标,校验压缩收益。
Mermaid:WAL 写入与恢复流程(配色与样式优化)
采用柔和配色与边框样式,突出 FPI 的压缩路径与恢复解压节点:
从 9.5 到 18 的相关演进概览(与 WAL 关联的方向)
- 9.5:引入新 WAL 记录格式与 FPI 压缩;归档与复制链路受益。
- 9.6:并行查询与系统层面优化;WAL 子系统稳定性增强。
- 10:声明式分区引入(数据布局变化对 WAL 产生模式有影响);复制框架持续完善。
- 11~12:存储/索引与优化器改进,间接影响写入模式与 WAL 产生特征。
- 13~14:B-Tree 与 I/O 优化(如页面管理与去重),降低写放大,改善 WAL 压力。
- 15~18:稳定性、观测性提升,WAL 管线更加成熟;与逻辑复制/备份生态配合更好。
注:上述为与 WAL 改动关联的宏观方向;具体版本细节以各版本 Release Notes 与文档为准。
参考资料与权威链接
- PostgreSQL 9.5 Release Notes(官方):https://www.postgresql.org/docs/9.5/release-9-5.html
- WAL 文档(官方):https://www.postgresql.org/docs/current/wal-intro.html
- FPI 与 full_page_writes(官方):https://www.postgresql.org/docs/current/runtime-config-wal.html
- 源码位置:
速记口(面试/设计复盘快速记忆)
- 关键词:WAL、FPI、wal_compression、PGLZ、Checkpoint、归档/复制。
- 行为骨架:检查点后首次修改 → FPI;wal_compression=on → PGLZ 压缩 FPI;恢复端按新格式识别并解压。
- 源码定位:记录头
src/include/access/xlogrecord.h→ 插入src/backend/access/transam/xloginsert.c/ 主控src/backend/access/transam/xlog.c→ 读取解析src/backend/access/transam/xlogreader.c→ 压缩src/common/pg_lzcompress.c→ 参数src/backend/utils/misc/guc.c。 - 性能要点:压缩显著降低 WAL 体积;评估 CPU 与恢复时间;结合 full_page_writes 与检查点参数。
- 迁移提示:升级匹配新格式;监控归档与复制链路;在 I/O 受限环境优先考虑开启压缩。
附注:本文通过路径级引用标注源码位置以保持跨版本稳定性与可溯源性;如需结构体或函数级细节,可在上述路径内检索具体实现(记录布局、插入构造、读取解析与压缩过程)。
更多推荐




所有评论(0)