35 选择一个你能离开的服务商
两家服务商,同样的 4 vCPU 和 32 GB RAM,同样的基准测试。一家厂商公布的结果是自己每秒处理 18,000 次查询,对手则是 12,000 次。即便照单全收,这些数字也不能说明哪家的 PostgreSQL 更好。其中一家把页面放在机器内部的硬盘上,另一家则把它们放在网络另一端的存储上,而数据集大小是内存的十五倍。
服务商之间的差异大多如此。在缓冲区缓存之上,大家运行的是同一个引擎。在它之下以及周围,各家的选择不同:页面放在哪里,谁掌握超级用户权限,哪些东西要收费,以及离开有多难。
先决定购买多少托管,再决定向谁购买;能负担多少托管,就购买多少托管一节阐述了理由。之后我们的建议很简单:按你现有的工作负载选择,而且要选一个你能离开的服务。
厂商资料来自各服务商截至 2026 年 10 月的文档、价格页或博客,链接随文给出;据此设计方案前,请先检查链接。排列顺序不是排名,我们的观点会明确标出。版本方面:PostgreSQL 18 是最新正式版;19 在 2026 年 9 月 24 日发布了 Beta 4,项目表示正式版“也可能在 10 月发布”(PostgreSQL)。这里还没有服务商提供可用于生产的 19。
了解架构形态,就了解了取舍
每个选项都属于五种架构之一,或者是它们的混合;还没读功能清单,架构形态就能告诉你大部分取舍。
| 形态 | 页面存放位置 | 长处 | 代价 | 示例 |
|---|---|---|---|---|
| 传统托管 | VM 加网络卷 | 熟悉、可迁移 | 每次未命中都要走一趟网络 | RDS、Cloud SQL、Azure |
| 本地 NVMe | 机器内的硬盘 | 超出内存后仍然快 | 持久性由副本承担 | PlanetScale Metal |
| 存算分离 | 以 WAL 为输入的存储 | 副本共享存储,自动扩容 | 专有存储 | Aurora、AlloyDB |
| 无服务器 | 存算分离,可缩容至零 | 空闲成本低,支持分支 | 冷启动,繁忙时账单高 | Neon |
| 平台套装 | 上述任一种 | 认证、API、存储 | 应用的更多部分依赖同一家厂商 | Supabase |
大多数专业服务商也采用传统托管架构。
在虚拟机或 Kubernetes 上自行管理是第六个选项,可以采用前三种形态中的任一种。
存储决定基准测试结果
一家服务商在相同 vCPU 和内存下公布了另一家两倍的吞吐量时,先看磁盘。一旦工作集(working set)无法全部放入内存,页面的位置就决定了速度。
延迟一章列出了这个阶梯:内存是纳秒级,本地 NVMe 是几十微秒,网络存储则是几百微秒或更长。这个阶梯只在缓存未命中时才有意义(shared_buffers 是页的数组)。如果热点页面都能放进内存,这三种存储设计表现就差不多。
网络块存储:每次未命中都要一次往返
RDS、Cloud SQL、Azure 和大多数专业服务商把数据目录放在网络卷上,因此一次未命中内存的读取,就会变成发往数据中心其他位置的存储服务器的请求。卷有 IOPS 上限,而前面的实例往往有一个更低的上限:EC2 r8g.xlarge(4 vCPU、32 GiB)的突发额度耗尽后,只能持续提供 6,000 IOPS,不管你买的是什么卷(两个上限,你会撞上其中较低的那个)。
即便如此,它仍然有理由成为默认选择。卷的寿命不依赖实例,主机坏了只需重新挂载,无需重建。快照便宜,存储和计算可以独立扩缩容,甚至单个实例也能承受磁盘故障,因为底层存储会进行复制(但并非永远可靠:AWS 给 gp3 标出的年持久性是 99.8% 到 99.9%)。
本地 NVMe:快,但会随主机一起消失
实例存储就是同一台机器里的硬盘。AWS 给 i8g.xlarge 标出的性能是:同样的 4 vCPU、32 GiB,单块 937 GB 硬盘提供 150,000 随机读 IOPS,是网络路径 6,000 IOPS 的二十五倍。
代价是持久性。AWS 表示:“实例停止、休眠或终止后,数据不会保留。”因此,本地 NVMe 上的数据库要通过复制获得持久性,这会带来一些后果。一次提交必须到达另一个可用区的副本才算安全,这需要一次往返。丢失的节点要靠复制整个数据库来重建,TB 级数据需要数小时。而磁盘大小也与实例大小绑定:硬盘装不下了,就得迁移到更大的节点。
深入阅读:AWS 和 Google 公布的卷与实例数据
截至 2026 年 10 月,AWS 给出的数据如下:
- gp3 包含 3,000 IOPS 的基线(托管一章展示了触及该上限时的表现),最高可预置 80,000 IOPS 和 2,000 MiB/s,没有突发能力(AWS)。持久性标为“99.8% - 99.9%”(AWS)。
- io2 Block Express“设计目标是在 16KiB I/O 操作下提供低于 500 微秒的平均延迟”,在 Nitro 实例上可达 256,000 IOPS,标称持久性为“99.999%”,按预置 IOPS 收费。
r8g.xlarge的基线为 6,000 IOPS 和 156.25 MB/s,最高为 40,000 IOPS 和 1,250 MB/s;该档位的实例“每 24 小时至少能以最高性能持续运行 30 分钟,此后恢复到基线性能”(AWS)。i8g.xlarge在 4 KiB、满队列深度下,标称随机读 IOPS 为 150,000,写 IOPS 为 82,500(AWS)。AWS 提醒:“不要依靠实例存储卷保存有价值的长期数据”(AWS)。
Google 的 Local SSD“物理连接到服务器”,但“只能提供临时存储”(Google)。AWS 也会把本地 NVMe 用于更有限的用途:RDS Optimized Reads 将临时表放在本地存储上,使“查询性能最高提升 50%”,而数据仍留在 EBS 上(AWS)。
日志结构存储:发送 WAL,而非页面
Aurora、AlloyDB、Neon 和 Azure 的 HorizonDB(预览版)把 WAL 发送给据此构建页面的存储服务,因此写入要等待网络上达到法定人数的节点确认;读取未命中则要从网络获取数据,本地缓存能缓解这一开销。这会怎样影响调优,参见分离式存储改变了部分规则。选型时的差异在账单上:Aurora Standard 按每百万次 I/O 请求收费,AlloyDB 不收 I/O 费用,Neon 的本地缓存则可以溢出到 NVMe。
最知名的基准测试用十五倍于内存的数据测试存储
最知名的对比来自 PlanetScale,随其 Postgres 产品于 2025 年 7 月 1 日发布,截至 2026 年 10 月仍在它的基准测试页面上。在 32 GB 的机器上,用大约 500 GB 的数据库进行类 TPCC 测试,它报告自己在本地 NVMe 上约为 18,000 QPS,而 Aurora 约为 12,000。所有这些都是厂商公布的结果;我们没有复现过。
架构解释了这种表现。数据集是内存的十五倍,大部分读取无法命中内存:NVMe 上是一次本地读取,其他架构则要在 IOPS 限制之下走一次网络往返。PlanetScale 反过来在每次提交时承担网络开销,等待另一个可用区的副本,却省下了每次读取未命中的网络开销。竞争对手的回应也印证了这个物理事实:把热点页面放到本地闪存或内存中,网络的影响就会减小。
深入阅读:PlanetScale 的基准测试、方法和各方回应
根据其方法说明文章:
- **被测系统:**PlanetScale 的
M-320,一个i8g节点(4 vCPU、32 GB RAM、937 GB 本地 NVMe),以一个主库和两个副本的形式分布在三个可用区;只有主库承载测试。 - **其他系统:**vCPU 和内存与之相当或更多的单实例,例如使用
db.r8g.xlarge的 Aurora 和 8 个计算单元的 Neon,它们都“使用网络附加存储”。 - **工作负载:**Percona 的类 TPCC sysbench 脚本,规模设为“产生约 500 GB 的 Postgres 数据库”,分别以 32 和 64 个连接运行 5 分钟;在“约 300 GB”的数据集上运行 sysbench 只读测试;以及反复执行
SELECT 1测量往返延迟。除连接数限制和超时外,设置“保持各平台的默认值”;成本对比则用它自己的三节点价格,与各对手加上副本后的价格比较。
PlanetScale 公布的主要类 TPCC 结果:自身约 18,000 QPS,Aurora 约 12,000(Aurora 页面),Neon 约 12,500(Neon 页面),AlloyDB、Crunchy Data、Supabase、TigerData 和 Heroku 则更低。只读测试中,PlanetScale 和 Aurora 都“约为 35,000 QPS”,PlanetScale 的 p99 更稳定。它的架构页面表示,变更会“由至少一个副本确认”。
- Xata(2025 年 7 月 16 日)在自己的 NVMe-over-Fabrics 网络存储上运行了这项测试,为本次测试调优 Postgres 后,8 vCPU、64 个连接下报告约 25,000 QPS,4 vCPU 下约 20,000。它称自己的图表“不是同等条件下的比较”,并批评了测试方法:运行前没有执行检查点或清理,默认配置未经调优,工作负载“写入非常密集”。PlanetScale 回应称 Xata 针对该工作负载做了调优,并拒绝提供访问权限让 PlanetScale 复现。
- Neon(2025 年 7 月 11 日)使用 NVMe 上 500 GB 的本地缓存重新测试,报告 17,030 QPS,而默认设置下为 12,512;若将缓存设为与工作集相当的 180 GB,峰值 QPS 低约 10%。它的反驳是:固定大小的本地磁盘会迫使你购买更高一档的实例。
读基准测试数字前,先问是谁跑的
这些问题适用于所有厂商的基准测试,包括那些让你喜欢的服务显得很好的测试:
- **谁跑的?**厂商会调优自己的产品,却测试对手的默认配置;每个数字旁都该写上“厂商公布”。
- **什么工作负载?**Percona 的 README 表示其脚本“不是 TPCC 工作负载的实现”,并要求厂商在对比中说明这一点(Percona)。
- **数据集与内存的比例?**十五倍于内存的数据集测试的是存储。生产环境通常会按工作集能装进内存的原则配置。
- **持久性和调优相同吗?**同步副本、基于法定人数的存储确认和单个卷提供的承诺不同,服务商的默认设置也有很大差异。
- **是否统一比较口径,能否复现?**每次查询的价格取决于档位、地域和副本数;公开脚本能让结论可验证。
用一天时间,在两个候选服务上运行你的模式和十条最重的查询,能获得比所有公开图表更多的信息(如何进行测试)。
迁移之前,先证明问题出在磁盘
基准测试能告诉你有更快的磁盘,只有自己的数据才能告诉你是否需要。对比工作集和内存(根据工作集配置内存)。采样等待事件:会话主要处于 IO / DataFileRead 等待,意味着读取已经离开了内存。在 pg_stat_statements 中按 shared_blks_read 排序(四种排名);通常是一条查询读取了大部分页面。还要寻找上限的迹象:IOPS 持平,延迟却不断上升(如何判断)。
然后依次尝试便宜的修复:减少读页、增加内存、预置 IOPS、更大的实例(先用数据证明,该换更大的机器了)。做完这些,存储读取仍占主导时,再换架构。
超大规模云厂商胜在覆盖面,代价是复杂度
每家大云厂商都销售传统托管服务和存算分离服务。它们胜在覆盖面:地域、合规计划,以及通往你在同一云上运行的其他一切服务的私有网络。代价是复杂度:账单上项目众多,大版本落后时还要支付延长支持费用。
深入阅读:逐一查看 RDS、Aurora、Cloud SQL、AlloyDB 和 Azure
截至 2026 年 10 月:
**Amazon RDS for PostgreSQL。**使用 EBS 的虚拟机,容量最高 64 TiB(AWS)。标准支持涵盖 14 到 18,当前版本为 18.6;19 仅出现在预览环境中,而且“不能将预览版本用于生产”(发布日历、预览);目标是在社区新大版本的第一个小版本发布后 30 天内提供该大版本。支持的扩展很多(AWS);可以选择“不承担读流量”的 Multi-AZ 备库,或具有两个可读半同步备库的集群(AWS);最多 15 个只读副本。没有超级用户时,通过 pg_dumpall --globals-only --no-role-passwords 导出角色,再手动重置密码。旧大版本转入付费 Extended Support,按 vCPU 小时收费,最长三年,备库也收费(AWS)。按实例小时、存储、额外 IOPS 和备份存储计价(AWS)。
**Amazon Aurora PostgreSQL。**一个跨三个可用区的共享卷,“可增长至 256 TiB”,最多承载 15 个副本(AWS)。2026 年 6 月 11 日开始提供 PostgreSQL 18;大版本的目标是在社区第一个小版本发布后的八个月内提供(AWS)。Global Database 可扩展到“最多 10 个只读的辅助 AWS 地域”,延迟“通常不到一秒”(AWS)。Aurora serverless 可“从 0 ACU 扩展至 256 ACU”,每个 ACU 约 2 GiB;13.15、14.12、15.7、16.3 及更高版本支持自动暂停(AWS、自动暂停)。Limitless Database 自 2024 年 10 月正式可用,提供分片(托管分片 Postgres)。迁出只能走逻辑方式,由 Aurora 充当发布者(AWS)。I/O-Optimized 不再按 I/O 请求计费,“每 30 天”可以切换一次(AWS;何时划算)。
**Aurora DSQL 是另一种数据库。**自 2025 年 5 月正式可用,基于 PostgreSQL 16,但隔离级别“固定为 PostgreSQL 的可重复读”,发生冲突会报错而不是等待,也没有临时表、触发器和 PL/pgSQL(AWS)。和那些分布式 SQL 数据库一样,采用它需要做一次迁移。
Google Cloud SQL。“每个 Cloud SQL 实例由一台虚拟机提供支持”,使用网络磁盘(Google);提供 9.6 到 18,默认为 18.6(Google)。从 16 起默认使用 Enterprise Plus,它增加了本地 SSD 缓存、读取池、“停机不到一秒”的维护、“最长 35 天”的 PITR 日志(Enterprise 为 7 天)和 99.99% 的 SLA(Google)。高可用模式会同步写入两个可用区的磁盘(Google)。延长支持自 2025 年 5 月 1 日起收费(Google)。按 vCPU 和内存计费,高可用价格翻倍(价格)。
AlloyDB。“跨多个可用区的存算分离架构”(Google),附有分析用的列式引擎(Google)。18 于 2026 年 3 月 18 日正式可用;大版本在社区正式发布后“五个月内”提供(Google)。连续备份保留 1 到 35 天,“RPO 为零”(Google);不收 I/O 费用(价格)。AlloyDB Omni 在你自己的数据中心、任意公有云或笔记本上运行同一套引擎,按 vCPU 授权(Google)。迁出要通过 pglogical 或 pg_dump 等逻辑方式(扩展、导出)。
Azure flexible server。“数据库引擎运行在 Linux 虚拟机内的容器中”,数据有“三份本地冗余的同步副本”(Microsoft)。存储最高 64 TiB(Microsoft);当前版本为 18.6(Microsoft)。提供“零数据丢失”的可用区冗余高可用、五个只读副本(Microsoft),以及“开源 Citus 扩展的托管服务”弹性集群(Microsoft)。在 18 上,“不能将服务器配置为使用新的异步 I/O io_method = io_uring”。Microsoft 表示,11 到 13 的延长支持自“2026 年 9 月 1 日”开始计费,且无法退出(Microsoft)。按 vCore 加存储计费(Microsoft)。Azure HorizonDB“目前处于预览阶段”,它才是存算分离的服务:“数据页不会从计算副本写入存储层”(Microsoft)。
专业服务商提供更贴近需求的支持,但地域更少
这些公司主要销售 Postgres,其他业务不多。我们的看法是:这种专注带来了 Postgres 专属功能和更贴近需求的支持,代价是可选地域较少,以及服务背后的公司规模较小。
仔细阅读高可用和备份条款;这里的差异远大于超大规模云厂商之间的差异:PITR 从 2 天到 30 天不等,备库也从热备到可能丢失最近提交的异步备库不等。在明确说明权限的服务商中,只有 Crunchy Bridge 提供超级用户。
深入阅读:逐一查看十种专业服务
截至 2026 年 10 月:
**Crunchy Bridge 和 Snowflake Postgres。**Snowflake 于 2025 年 6 月 2 日宣布计划收购 Crunchy Data;其后续博客表示“2025 年 6 月,Snowflake 收购了 Crunchy Data”(新闻稿、博客)。Crunchy Bridge 在 AWS、Google Cloud 和 Azure 上运行虚拟机,提供 15 到 18(2026 年 5 月起新集群不再提供 15),并给予“你的 Postgres 超级用户账户”(版本、用户);每 60 秒归档一次 WAL,保留 10 天;高可用“使集群价格翻倍”(HA、套餐)。Snowflake Postgres 于 2026 年 2 月 24 日正式可用,运行 16 到 18,提供 10 天 PITR,但其管理员“不是完整的 Postgres 超级用户”(Snowflake、角色)。
**Aiven。**运行在各大云上的虚拟机,提供 13 到 18,上游结束支持时相应版本也退役(Aiven);Business 有一个备库,Premium 有两个(Aiven)。“除少数例外,无法安装仅超级用户可用或不受信任的扩展”;按套餐保留 2 到 30 天的备份(Aiven);有免费档(Aiven)。
**EDB Postgres AI Cloud Service。**EDB“将不再向新客户提供 Hosted Cloud Service 选项”;继续提供在客户自己的云账户中管理集群的服务(EDB)。Advanced Server 现名为“Enterprise Postgres (Oracle Compatible)”(EDB),每 vCPU 小时的价格是社区 PostgreSQL 的三倍(EDB);它的 Oracle 功能无法迁移到社区 Postgres。
**Fly.io Managed Postgres。**每个套餐都包括“一个主库和副本、PgBouncer 和备份”,提供 16 和 17,容量最高 1 TB(Fly.io);Fly.io 将“安全补丁和版本升级”列为“开发中”。旧的非托管 Fly Postgres“已不再维护”(Fly.io)。
**PlanetScale Postgres。**2025 年 9 月 22 日正式可用:一个主库和两个副本跨可用区部署,可使用本地 NVMe(“Metal”)或网络存储,提供 17 和 18(正式发布、版本),通过逻辑复制提供 CDC(PlanetScale)。Metal“存储容量由实例大小固定”;备份默认“保留 2 天”(PlanetScale);Neki 分片“目前处于 Platform Preview”(PlanetScale);按集群大小定价(PlanetScale)。
Tiger Cloud。“Timescale 现已更名为 Tiger Data”(2025 年 6 月 17 日,Tiger Data):在 16 到 18 上运行 TimescaleDB(Tiger Data),面向超出建模一章中 BRIN 和分区能力范围的事件数据。“Tiger Cloud 不提供超级用户访问”(Tiger Data);PITR 为 3 或 14 天;按计算小时加存储收费(Tiger Data)。
**DigitalOcean。**提供 14 到 18(DigitalOcean),PITR 可回到“过去七天内”(DigitalOcean),没有超级用户。对新账户自 2026 年 10 月 15 日起,对全部账户自 11 月 30 日起,新建的 Standard Edition 集群“不能使用超过 4 GiB 内存的套餐,也不能添加备库或只读节点”;高可用移到更贵的 Advanced Edition。
**Render。**提供 13 到 18(Render);高可用由异步备库在 30 秒后接管(Render),这可能丢失最后几笔提交;PITR 为 3 或 7 天(Render);免费数据库“创建 30 天后到期”(Render)。
**Heroku Postgres。**Advanced 档采用“计算与存储解耦”架构,容量最高 100 TB,目前处于“有限正式可用”阶段(Heroku、Advanced);默认版本为 18(Heroku)。所有者“比超级用户低一级”(Heroku);故障切换可能丢失“少量但有明确上限的最近已提交数据”(Heroku)。2026 年 2 月 6 日,Heroku 表示正在“转向以维护为主的工程模式……而不是引入新功能”(Heroku)。
无服务器平台围绕开发者的日常工作优化
它们的卖点是:数据库空闲时不花钱,每个拉取请求都能创建一个分支,有时还提供围绕数据库的一整套后端。代价是冷启动、难以预测的按单位用量计费,以及在平台套装中,应用更多部分与同一家厂商绑定。
深入阅读:逐一查看 Neon、Supabase、Xata、Nile 和 Railway
截至 2026 年 10 月:
**Neon。**计算与存储由“一条预写式日志(WAL)记录流”连接,现在以 Lakebase Postgres 为品牌(Neon);Databricks 于 2025 年 5 月 14 日宣布计划收购 Neon,而 Neon“已是 Databricks 平台的一部分”(Databricks)。提供 14 到 18(Neon)。空闲 5 分钟后缩容至零,“几百毫秒内”唤醒(Neon);可“从当前或过去的状态”创建分支(Neon);恢复窗口按套餐最长为 30 天。大版本升级意味着新建项目;保持连接的逻辑复制订阅者会使计算实例保持唤醒,非活动的复制槽约 40 小时后会被删除(Neon)。按计算单元小时计费,有免费套餐(Neon)。
**Supabase。**每个项目一个 Postgres 实例,配上一套平台服务:Auth、通过 PostgREST 提供的 REST API、Realtime、Storage 和 Edge Functions(Supabase),运行 PostgreSQL 15 或 17(Supabase)。基于行级安全构建,有文档说明如何通过逻辑复制向外传输数据(Supabase)。分支“默认不含数据”(Supabase);PITR 是附加服务,至少需要 Small 计算规格;无需清理的存储引擎 OrioleDB“处于公开测试阶段”(Supabase)。套餐加计算加用量计费(Supabase)。
Xata。“原生支持分支的 Postgres”:每个分支都是“底层逻辑卷的写时复制快照”(Xata),支持匿名化克隆;提供 14 到 18(Xata);可运行在 Xata 的云、你的云,或自托管环境中(Xata)。只能原地进行小版本升级;Xata 的公开文档没有描述备份或 PITR。
**Nile。**面向多租户 SaaS 的 Postgres:每个存储页属于一个租户,租户可以放在共享或专用计算实例上(Nile),也就是分片一章里手动完成的事情。只提供 PostgreSQL 15,而且租户表上不支持用户定义函数、触发器和序列(Nile)。
**Railway。**不是托管服务:它的模板是“非托管服务”,备份、调优、安全和监控“由你负责”(Railway)。可选 Patroni 高可用(Railway);备份是卷快照,并非基于 WAL 的恢复(Railway)。
还有规模更小的服务,例如按操作次数计费的 Prisma Postgres(Prisma)。
自行管理,超级用户和值班电话都归你
在虚拟机或 Kubernetes 上自行管理,意味着你有超级用户、能用所有扩展、可以在发布当天使用任意版本,而且在规模大且稳定时成本最低。代价是值班轮换,复制和备份章节中的所有工作都归你。标准组件是用 Patroni 做高可用,用 pgBackRest、WAL-G 或 Barman 做备份,在 Kubernetes 上使用 CloudNativePG 等 Operator。
深入阅读:自行管理的工具箱及其许可证
截至 2026 年 10 月:
- Patroni:“一个用于构建 PostgreSQL 高可用(HA)集群的 Python 模板”,用 etcd、Consul、ZooKeeper 或 Kubernetes 进行领导者选举;MIT,支持 PostgreSQL 9.3 到 18(GitHub)。
- **pgBackRest:**向 S3、Azure 或兼容 GCS 的存储执行全量、差异和增量备份,支持 PITR(pgbackrest.org)。维护者于 2026 年 4 月 27 日宣布“不再维护”,随后在 5 月 18 日宣布“一个赞助商联盟已联合起来,资助后续开发”(新闻)。
- WAL-G(Apache-2.0)和 Barman(GPL-3.0)(WAL-G、Barman)。
- **CloudNativePG:**一个“直接与 Kubernetes API 集成”而不使用 Patroni 的 Operator;Apache-2.0,自 2025 年 1 月起成为 CNCF Sandbox 项目,通过其 Barman Cloud 插件执行备份(GitHub、CNCF)。
- **Crunchy Postgres for Kubernetes(PGO):**Patroni 加 pgBackRest,Apache-2.0;其默认镜像受 Crunchy Data Developer Program 条款约束,所以先读这些条款(GitHub)。
- **Zalando postgres-operator:**通过 Spilo 镜像使用 Patroni,MIT,支持 PostgreSQL 14 到 18(GitHub)。
- **StackGres:**AGPL-3.0,基于 Patroni,带有 Web 控制台和大量扩展(StackGres)。Percona Operator for PostgreSQL“基于 Crunchy Data 开发的 Postgres Operator”,Apache-2.0(GitHub)。
超级用户权限和保留期限可以排除一批服务
下面把主要服务列在一张表中,时间截至 2026 年 10 月,来源见各服务条目。“版本”指新建数据库可选的大版本。重点看那些能帮你排除服务的列:只有一家给你超级用户,备份保留期限则从两天到五周不等。
| 服务 | 形态 | 版本 | 超级用户 | PITR 窗口 |
|---|---|---|---|---|
| RDS | 传统 | 14 到 18 | 无 | 0 到 35 天 |
| Aurora | 存算分离 | 14 到 18 | 无 | 1 到 35 天 |
| Cloud SQL | 传统 | 9.6 到 18 | 无 | 7 或 35 天 |
| AlloyDB | 存算分离 | 14 到 18 | 无 | 1 到 35 天 |
| Azure | 传统 | 14 到 18 | 无 | 7 到 35 天 |
| Crunchy Bridge | 传统 | 15 到 18 | 有 | 10 天 |
| PlanetScale | NVMe 或网络 | 17、18 | 无 | 默认 2 天 |
| Neon | 无服务器 | 14 到 18 | 无 | 最长 30 天 |
| Supabase | 套装 | 15、17 | 无 | 附加服务 |
Supabase 的每个套餐都有每日备份;时间点恢复是附加服务。Azure 仍然为现有服务器运行 11 到 13,但属于付费延长支持。
用排除法选择
按顺序回答这些问题。前几个答案就会排除列表中的大多数服务。
- **多大,增长多快?**检查存储上限(Fly.io Managed Postgres 为 1 TB,RDS 和 Azure 为 64 TiB,Aurora 为 256 TiB)、磁盘是否与实例大小绑定,以及你的工作集与能负担的内存之间的关系。
- **写入多少?**写入关注提交延迟和 WAL 量;读取关注副本和缓存未命中。
- **需要超级用户或某个特定扩展吗?**核对确切版本和脚注。需要超级用户,选项就缩小到 Crunchy Bridge、你自己的容器,或自行管理。
- **有什么合规要求?**认证和数据驻留情况随服务商和地域而异。索要报告,不要只看一墙的标志。
- **哪个地域?**应用所在的地域。跨地域往返会抵消本书中其他一切优化(往返的成本比查询更高)。
- **RPO 和 RTO 是多少?**先写下来:异步高可用可能丢失最近的提交,2 天的 PITR 窗口也无法挽回第 3 天才发现的错误。
- **采用哪种预算模型?**固定实例的费用可预测;按用量计费的计算资源空闲时便宜、忙碌时可能令人意外;按 I/O 定价的存储会让你为缺失的索引付费。
- **如何离开?**签约前先回答下一节的问题。
我们的看法是:今天起步的大多数团队,选择应用所在云上的传统托管服务,并配置足够内存容纳工作集,就能用得很好。只有能明确说出本地 NVMe、存算分离或无服务器替你解决什么问题时,再去选择它们。
在需要退出之前规划退出
每个服务商都让迁出成为可能,但很少有服务商让它变得容易。成本取决于你的系统有多少部分使用了 PostgreSQL 之外的东西。
社区 Postgres 能干净地迁走
只要坚持使用社区 PostgreSQL 和社区扩展,模式、数据、角色(大部分)和 SQL 都能跟你走。有两条迁移路径。
pg_dump(pg_dump)在哪里都能工作,但在它所需的数小时内,数据库要么只读,要么两边的数据开始分歧(逻辑备份);角色可能需要脚本处理,因为 pg_dumpall 需要超级用户。
逻辑复制,然后切换(逻辑复制),只需停机几分钟而不是几小时,前提是原服务商允许你发布数据。RDS、Aurora、Cloud SQL、AlloyDB(通过 pglogical)、Azure、Neon、Supabase 和 PlanetScale 都有相应文档;注意它的限制。
专有存储、功能和配套集成带不走
- **专有存储。**Aurora、AlloyDB 和 HorizonDB 在你带不走的存储上运行 Postgres,只能通过逻辑方式迁出。AlloyDB Omni 是部分例外,它把同一套引擎授权给你在自己的机器上运行。Neon 的存储是开源的,但自行运行它本身就是一项工程。
- **专有功能。**EDB 的 Oracle 兼容语法、AlloyDB 用于分析的列式引擎、Aurora 的 Babelfish(SQL Server 协议兼容),以及 Aurora Limitless Database 的分片表。使用它们没有问题,但每一项都要计为将来重做的工作。
- **平台服务。**Supabase Auth、Storage 和自动生成的 API;Heroku 的附加服务集成;Nile 按租户存储的模型。数据可以用
pg_dump导出,围绕它构建的应用却不能。 - **服务商扩展、角色和配套集成。**某家服务专属的扩展、
rds_superuser之类的角色、仪表盘、IAM 认证、私有网络、备份策略。这些不是代码,却要花数周来处理。
留好退路
- 坚持使用社区 PostgreSQL 功能,除非某项专有功能值得付出退出成本,并且要把这个决定写下来。
- 定期进行逻辑导出,存到服务商账户无法删除的位置,每季度在别处恢复一次。这样既演练了退出,也获得了经过验证的备份。
- **现在就检查发布支持:**让一台由你控制的原生 PostgreSQL 服务器订阅预发布环境。
- **保持大版本更新。**每个大版本支持五年:13 于 2025 年 11 月 13 日结束支持,14 将于 2026 年 11 月 12 日结束支持(PostgreSQL)。延长支持会向落后的版本收费,而较新的版本会让你有更多迁移去处。
本章要点
- 在缓冲区缓存之上,各服务商运行的是同一个 PostgreSQL。在它之下,一旦工作集超过内存,页面的位置就会主导基准测试结果。
- 网络存储每次未命中都要一次往返,但不会随主机故障消失;本地 NVMe 每次读取要快得多,却会随主机一起消失。
- 把每个公开基准测试都视作厂商公布的结果,并用自己的查询跑自己的测试。
- 为更快的存储而迁移之前,先证明读取占主导:对比工作集与内存,检查
IO等待和shared_blks_read。先修查询,再加内存。 - 超大规模云厂商胜在覆盖面,专业服务商胜在专注 Postgres,无服务器平台胜在空闲成本和分支。选定之前,找出各家文档中的限制。
- 依次按数据大小、写入量、扩展与超级用户需求、合规、地域、RPO 与 RTO,以及预算模型进行选择。
- 提前规划退出:能向外进行逻辑复制,定期执行由你控制的
pg_dump,并列出所依赖的全部专有功能。
延伸阅读
- Amazon EBS volume types,AWS 文档。各类网络卷的 IOPS、吞吐量、延迟和持久性。
- Amazon EBS-optimized instance types,AWS 文档。往往最先限制性能的各实例存储性能上限与突发窗口。
- Data persistence for instance store volumes,AWS 文档。本地 NVMe 数据究竟在什么时候消失。
- Benchmarking Postgres,PlanetScale 博客。最常被引用的服务商对比背后的方法;阅读时要带上前面提到的注意事项。
- Reaction to the PlanetScale PostgreSQL benchmarks,Xata 博客。竞争对手对同一方法的批评,以及支持高速网络存储的论据。
- sysbench-tpcc README,Percona。按作者自己的说法,这个最常用的类 TPCC 脚本是什么,又不是什么。
- Logical replication,PostgreSQL 文档。选择任何服务商时都应核对的退出路径。
- Versioning policy,PostgreSQL。每个大版本五年;各服务商的支持日程都依赖这些日期。