pgrust 存储引擎解析:磁盘级兼容 PostgreSQL 的底层设计

发布时间:2026/10/8 9:08:19

pgrust 存储引擎解析:磁盘级兼容 PostgreSQL 的底层设计 pgrust 存储引擎解析磁盘级兼容 PostgreSQL 的底层设计【免费下载链接】pgrustPostgres rewritten in Rust, now faster than Postgres and Clickhouse项目地址: https://gitcode.com/GitHub_Trending/pg/pgrustpgrust 是一个用 Rust 重写 PostgreSQL 的开源项目它最大的卖点不是“更快”而是磁盘级兼容它能直接从一个现成的 PostgreSQL 18.3 数据目录启动无需任何迁移。这背后是一整套精心移植的存储引擎代码——页Page布局、缓冲管理器、WAL 日志乃至空闲空间映射全部在 Rust 中按 PostgreSQL 的原生字节格式复刻。本文带你深入 pgrust 存储引擎的底层设计看看“磁盘级兼容”到底是怎么做到的。磁盘级兼容比协议兼容难得多很多数据库“兼容 PostgreSQL”只是兼容了 SQL 语法和客户端协议wire protocol但 pgrust 追求的是更高一层的目标磁盘格式兼容。这意味着可以直接挂载并启动已有的 PostgreSQL 数据目录已落盘的堆表、索引、提交日志clog无需重建现有备份、复制、归档工具照常工作。要做到这一点pgrust 必须把 PostgreSQL 存储层的一切细节——从 8KB 数据页的每个字节偏移到 1GB 段文件的切分方式——都原样复刻。这是一条更难但价值更大的路线也让它能借用 PostgreSQL 原生的 46,000 条回归测试作为“标准答案”。数据页布局字节级复刻的起点一切存储的基础是页Page。PostgreSQL 把每个表和索引切成 8KB 大小的页每页有一个 24 字节的页头PageHeaderData。pgrust 的页面代码直接对应 C 源码里的bufpage.c以[u8]形式保存整页数据在固定偏移处读写字段做到与 C 的 struct 覆盖overlay完全一致偏移字段含义0pd_lsn最近一次修改该页的 WAL 位置8pd_checksum页校验和10pd_flags页标志位如全可见12pd_lower空闲空间起始偏移14pd_upper空闲空间结束偏移16pd_special特殊空间起始偏移18pd_pagesize_version页大小与布局版本号20pd_prune_xid可修剪的最老事务号页头之后是每项 4 字节的行指针ItemIdData数组指向页内实际的元组数据。pgrust 在 page/src/lib.rs 中实现了全部页面操作函数同时提供校验和计算对应checksum.c与页校验相关工具保证写出去的每一个字节都与 PostgreSQL 一致。存储管理器1GB 段文件的 Rust 移植磁盘上的物理文件由**存储管理器Storage Manager**负责。PostgreSQL 的md.c会把每个关系表/索引的每个 fork数据、空闲空间映射、可见性映射拆成最大 1GB 的段文件并通过虚拟文件描述符VFD池统一管理打开的文件句柄。pgrust 在 smgr/md/src/lib.rs 中 1:1 移植了md.c的全部逻辑段文件编号换算、EXTENSION_*扩展行为、errno 处理、以及ENOENT/ENOSPC等分支甚至连“文件可能被并发删除”这类边界情况都保持一致。fsync 请求则交给 sync/src/lib.rs对应sync.c由 checkpointer 进程统一消化确保崩溃恢复时的持久性语义与 PostgreSQL 相同。缓冲管理器共享缓冲池与页替换策略读写不能每次都直接访问磁盘于是有了缓冲管理器Buffer Manager。PostgreSQL 的共享缓冲池在 pgrust 中对应 buffer/bufmgr/src/ 目录mgr.rs缓冲池的申请、读取、扩展与刷新read.rs预读与异步 IO 接入buf_flush.rs脏页刷盘策略配套的 support/src/freelist.rs、buf_table.rs 实现空闲链表与页哈希表。正是这套与 PostgreSQL 行为对齐的缓冲层让 pgrust 在处理同样数据时产生同样的缓存命中/驱逐顺序从而在回归测试中输出一致结果。WAL 与事务崩溃恢复的基石磁盘兼容的另一个硬骨头是预写日志WAL与事务子系统。PostgreSQL 用 WAL 保证崩溃安全任何数据修改先写日志再落盘。pgrust 在 access/transam/ 目录下完整移植了这套体系xlog/WAL 记录写入与恢复主逻辑xloginsert/WAL 记录的构造与缓冲xlogreader/日志回放读取clog/、multixact/、subtrans/事务状态与多事务记录slru/简单 LRU 缓冲支撑 clog 等日志页的缓存。此外freespace/src/lib.rs 移植了空闲空间映射FSM决定新元组该插入哪个数据块——这些细节共同保证了 pgrust 写的 WAL 与数据页可以被 PostgreSQL 自身的恢复流程理解。如何证明“磁盘级兼容”pgrust 的可信度来自回归测试项目内置了 PostgreSQL 18.3 的完整测试文件位于 vendor/postgres-18.3通过 run-regression 脚本驱动 pgrust 运行目前已在超过46,000 条回归查询上与 PostgreSQL 输出完全一致。README 中也给出了直接体验磁盘兼容的方式用--initdb创建数据目录后用 psql 连接执行select version()。不止兼容Rust 重写带来的存储想象力磁盘级兼容只是起点。README 的路线图透露了更激进的想法无 vacuum 存储设计、多线程内核、内置连接池、快速分支工作流。由于内核已用 Rust 重写未来可以绕过 PostgreSQL “每次连接一个进程”的模型而无需迁移任何历史数据——这才是“磁盘兼容 新内核”组合的真正价值旧数据无缝继承新架构自由发挥。如果你是 PostgreSQL 深度用户关心的是数据库存储引擎原理或想观察“Rust 重写 PostgreSQL”的可行性pgrust 的存储层源码storage/ 目录是目前最值得研读的活教材它证明了一件事——字节级兼容不是口号而是可以逐文件验证的工程事实。【免费下载链接】pgrustPostgres rewritten in Rust, now faster than Postgres and Clickhouse项目地址: https://gitcode.com/GitHub_Trending/pg/pgrust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/6 6:35:55

Vue2 学习笔记系列:从 Vue Router 路由到 Vuex 状态管理

Vue2 学习笔记系列:从 Vue Router 路由到 Vuex 状态管理Vue2 项目里绕不开的两块:**路由(Vue Router)**管页面跳转,**状态管理(Vuex)**管跨组件数据共享。本文把最常用、最容易混的知识点串一遍…

2026/10/8 9:03:30

保姆级教程:Windows下MySQL 9.1.0安装全流程解析

MySQL 9.1.0 发布之后,这段时间经常有人来问我同一个问题:不是问它跟 8.4 LTS 到底差多少,而是问“怎么装”。也确实,MySQL 官网的下载页对新手来说就是一本天书,一堆版本号横七竖八地排在那里,下面还有 ZI…

2026/10/8 9:03:30

HDMI2.1与eDP TX接口设计实战:从眼图测试到信号完整性排查

一块板子拿到手,第一次插上显示器就花屏或者直接黑屏,这种场景做硬件的人应该都不陌生。HDMI2.1、eDP这类高速视频TX接口,说难其实不算难,但坑的位置非常固定:高速差分信号怎么走、AC耦合电容放哪边、阻抗控制到多少、…

2026/10/8 9:03:30

双碳大模型实战:碳核算报告生成与CCUS比选

简介:一份聚焦大模型技术在碳排放与碳回收(双碳)领域应用的系统方案,内容从全球碳排放现状背景讲起,梳理工业化、能源消耗、交通、农业等主要驱动因素,并详细介绍化学吸收法、膜分离法、生物固定法、物理吸…

2026/10/8 9:03:30

OpenClaw(龙虾)部署实战:从Windows、安卓到腾讯云免费算力

说实话,我一开始看到“龙虾”OpenClaw全国巡装、腾讯云免费装机这种消息,第一反应是:这又是什么圈子里的新梗?结果顺着关键词一查,才发现这压根不是玩梗,而是一个正在快速升温的AI个人助理开发项目在往线下…

2026/10/8 9:03:30

Canal启动报错:Could not find first log file name 根因排查与解决

最近在帮团队搭建数据同步管道,启动Canal时报了一个看起来挺唬人的错误:Could not find first log file name in binary log index file。这个错误估计不少用过Canal的朋友都撞上过,第一次看到的时候我还愣了一下,毕竟Canal已经配…

2026/10/8 8:58:29

蠕虫病毒传播链与分层防御:从应急响应到内网加固实战指南

周五晚上十点,我正在家看球赛,手机突然连震三次。值班同事在群里发消息:核心交换机流量异常,内网大量主机互相发包,OA系统已经打不开了。紧接着远程连服务器,ssh敲下去卡了十几秒才出提示符,upt…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑