neon Pageserver 的数据模型 📅 2026/7/13 8:37:37 1. 初始状态来自 initdb.tar当创建一个新 timeline 时pageserver 通过bootstrap_timeline()(tenant.rs:5269)运行initdb生成初始数据目录将其压缩为initdb.tar.zst上传到 S3 远程存储将数据目录导入为 layer 文件image layer建立初始基线如果是从分支创建则直接复用父 timeline 已有的initdb.tar.zst避免重复运行 initdb。2. 增量更新回放 WAL之后 pageserver 的所有增量变化都通过 WALWAL receiver 从 safekeeper 拉取 WAL 流WAL 被解码后由 WalIngest 处理将页面修改写入内存中的 L0 layer当 L0 积累到一定量刷盘为 delta layer 文件定期 compaction 将 delta image 合并为更紧凑的 layer 文件3. 读取时按需回放当 compute 请求某个 LSN 的页面时pageserver 通过 layer 文件链式回放 WALimage layer LSN 100 → delta layer 100-200 → delta layer 200-300 → open in-memory layer如果需要从旧 snapshot 重建页面walredo 进程隔离的 postgres 子进程会执行实际的 WAL redo 操作。总结是的pageserver 的工作模式就是initdb.tar 作为基线 持续回放 WAL 作为增量。这与传统 PostgreSQL 的 basebackup WAL archive 模式在概念上相似但实现完全不同对比项PostgreSQL 传统模式Neon Pageserver基线basebackup/tar 文件initdb.tar.zst → layer 文件WAL顺序文件客户端回放切片存储服务端回放存储本地磁盘远程 S3 本地缓存读取直接读数据文件按 LSN 从 layer 链重建页面