开源项目
NikolayS/PGSimCity avatar
NikolayS/PGSimCity

PGSimCity:把 PostgreSQL 集群变成一座能走进去的 3D 城市

该项目围绕「An explorable 3D city that shows how Postgres actually works. PGSimCity An explorable 3D city that shows how PostgreSQL actually works.** PGSimCity turns a PostgreSQL cluster into a city you can inspect, walk through, and break.」构建,适用于实际场景的开源实践,提供可复用的工具链与集成方式。

750 个 Star61 个 ForkTypeScriptApache-2.0

秒懂

它是什么?
PGSimCity 是一个开源的教学可视化项目,把 PostgreSQL 集群的内部机制映射成一座可探索的 3D 城市。它面向没有运维经验的工程师,用直观的动画解释 checkpoint、WAL、vacuum 等概念,但项目仍处于 0.x 阶段,模型简化之处需要留意。
适合谁用?
PGSimCity 适合那些已经会用 PostgreSQL 但从未真正操作过数据库的工程师,比如后端开发、数据分析师或刚接触数据库管理的运维新人。它不适合用来学习 PostgreSQL 的精确数值行为,因为动画中的比例是经过缩放的,而且部分模型(如 buffer ring)仍是历史简化版本。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 3 天前。
用什么语言写的?
主要是 TypeScript(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

一座为不懂运维的工程师建的城市

PGSimCity 解决的问题很具体:很多工程师每天都在写 SQL,却从未真正理解数据库在底层做了什么。为什么一次 checkpoint 会让延迟突然飙升?为什么一个忘记提交的事务会让表无限膨胀?synchronous_commit 到底在收取什么代价?这些问题在文档里是一堆术语,在 PGSimCity 里变成了一座可以走进去的城市。项目面向的是「擅长本职工作但从未操作过数据库的工程师」,它用 3D 场景把 PostgreSQL 集群的各个组件映射成不同的街区,让用户像逛城市一样观察数据流。这个定位很聪明,因为数据库内部机制往往抽象且难以观察,而可视化能降低理解门槛。不过要注意,这座城是模型,不是模拟器,它不运行 PostgreSQL 源码,数字也是经过缩放以便人眼观察。

从客户端到磁盘:城市布局就是架构图

PGSimCity 的城市布局直接对应 PostgreSQL 的架构。北边是客户端天空,代表来自应用层的连接;Postmaster 是监督者,它只负责派生后端进程,从不触碰数据。后端行有 16 个进程,它们的灯光颜色就是状态,包括 idle in transaction 这种容易被忽略的状态。buffer pool 区域展示 shared_buffers 的代表帧,旁边是 wal_buffers、ProcArray、锁表和 CLOG。往下的挖掘坑是数据目录,标记了内存和存储的分界。存储区把堆文件画成 8 KiB 页面的田地,B-tree 画成真正的树,还有 TOAST、FSM 和可见性映射。东边是 WAL 区,西边是维护场,南边是备库。颜色语义全局统一:WAL 是琥珀色,脏页是红色,干净页是蓝色,vacuum 是紫色,checkpoint 是粉色。这种布局让用户一眼就能看出数据从客户端到磁盘的完整路径,比阅读架构图直观得多。

交互式教学:按 T 键开始 14 章导览,按 Enter 追踪一条语句

项目内置了多种交互方式。按 T 键启动 14 章导览,它会跟随一个连接从客户端开始,经过规划、缓存、WAL、checkpoint、vacuum 和复制。按 Enter 键可以追踪一条语句,比如选择 Non-HOT UPDATE,慢速播放会展示它如何进入 buffer pool、产生 WAL 并等待提交。场景菜单里还有几个精心设计的实验:Cache thrash 把 shared_buffers 设为 16 MiB,低于手动控制的最小值 128 MiB,让时钟扫描竞争加剧,后端进程在读取新页面前不得不先写自己的脏页。The work_mem cliff 场景固定 Sort 和 HashAggregate 节点,在 2 MiB 时溢出,4 MiB 时刚好放下,展示私有内存池和临时文件的影响。Long-running transaction 场景让 xmin 地平线下降并变红,autovacuum 仍然出发,但报告零可删除行,表持续膨胀。这些场景把抽象的参数变化变成可观察的因果链,比单纯读文档更有说服力。

运行方式:无需安装,浏览器即开即用

PGSimCity 的主页提供 live city,无需安装,直接打开浏览器就能探索。如果你想在本地跑,仓库是 TypeScript 项目,采用 Apache-2.0 许可证,默认分支是 main。要构建和运行,你需要克隆仓库,安装依赖(比如 npm install),然后启动开发服务器。具体命令在 README 中没有详细列出,但作为标准 TypeScript 项目,通常会有 npm run dev 或类似脚本。项目还包含一个可选的 Query flow 和 Machine 组件,它们可以运行 PGlite,这是一个编译为 WebAssembly 的真实内存版 PostgreSQL。这意味着虽然城市本身是模型,但你可以选择接入真实的 PostgreSQL 执行引擎来验证某些行为。对于只想快速体验的用户,直接访问 live city 是最快路径。

信任边界:模型不是模拟器,数字不能当版本证据

README 明确警告:PGSimCity 是 PostgreSQL 的模型,不是模拟器,城市里没有运行任何 PostgreSQL 源码,数字经过缩放以便人眼观察。项目针对 PostgreSQL 18 主线,18.4 是审查参考版本,机制声明遵循 REL_18_STABLE 源码。但存在已知的简化:比如 TypeScript buffer 采样仍使用固定的 32 帧环形缓冲区,这不是 PostgreSQL 18 的环形大小规则。README 明确说,动画不能用作数值版本证据,直到模型对齐。还有一个已知的失败模式:确定性测试套件在 CI 上有一个红测试,因为它固定了缩放的 WAL 触发器近似值,而 PostgreSQL 18 实际使用整段取整。cache hit ratio 的计算和 clock-sweep 的 usage_count 上限也有类似问题。这说明项目作者对准确性很认真,但你也应该清楚,任何动画展示的数值都可能与真实数据库有偏差。

替代方案:从文档到真实集群的连续谱

如果你不需要 3D 可视化,官方 PostgreSQL 文档始终是最权威的参考。项目本身也承认这一点,它引用了 postgresql.org/docs 和源码来验证机制。另一个替代方案是使用真实的 PostgreSQL 实例配合 pg_stat_statements、pg_stat_bgwriter 等视图观察实时指标,但这需要你具备一定的操作能力,而这正是 PGSimCity 想帮你建立的。还有像 pganalyze 或 pgHero 这样的监控工具,它们提供图表而不是 3D 城市,但数据来自真实集群,没有缩放。PGSimCity 的独特之处在于它把机制变成可探索的空间,而不是图表。对于理解概念,它比文档生动;对于验证精确行为,它不如真实集群。选择哪个取决于你的目标是「理解」还是「测量」。

维护与升级成本:0.x 阶段,变化快,需要关注

项目目前是 0.x 版本,最近发布频繁,比如 v0.40.0 到 v0.39.5 间隔不到一天。这反映了项目仍处于快速迭代期,新功能不断加入,比如 v0.40.0 的标题是「十九个缺陷,和一个月球」,说明连月球都画出来了。维护成本主要在两方面:一是你需要跟上版本更新,因为模型可能随着 PostgreSQL 新版本而变化;二是如果你依赖它做教学材料,需要定期检查 README 中的已知偏差列表。许可证是 Apache-2.0,这意味着你可以自由使用、修改和分发,但要注意项目与 SimCity 的商标无关,它明确声明不包含任何 SimCity 代码或资产,以免引起法律纠纷。对于个人学习或内部培训,Apache-2.0 没有额外限制。

编辑结论

PGSimCity 适合那些已经会用 PostgreSQL 但从未真正操作过数据库的工程师,比如后端开发、数据分析师或刚接触数据库管理的运维新人。它不适合用来学习 PostgreSQL 的精确数值行为,因为动画中的比例是经过缩放的,而且部分模型(如 buffer ring)仍是历史简化版本。如果你打算用它做教学或演示,先确认你讲解的版本对应的 PostgreSQL 版本(当前针对 18 主线),并查阅 README 中披露的已知偏差,比如 WAL 触发器的取整问题和 cache hit ratio 的计算方式。如果你是资深 DBA,想用它来验证某个具体参数的影响,建议直接阅读 PostgreSQL 官方文档或源码,而不是依赖动画。在采用之前,先打开 live city 试玩一下,确认 3D 交互在你的设备上流畅,尤其是触控操作目前只在 Chrome 的移动模拟中验证过。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记