资讯动态

PostgreSQL 18与Serverless数据库实战:从自建迁移到弹性云原生架构

发布时间:2026/10/13 20:30:42 来源:尧图企业网站定制
开头部分就不用编号了直接以博文正文开始。这两年做后端的人几乎都绕不开两个词一个是云原生另一个是Serverless。我一开始对Serverless数据库是持保留态度的总觉得是厂商包装出来的概念直到自己动手把一个线上小项目从自建PostgreSQL搬到Serverless PostgreSQL又用PostgreSQL 18的测试版本跑了一轮压测和新特性验证才算把这事彻底想明白。这篇文章就是基于这段时间的实操记录聊聊PostgreSQL 18时代Serverless数据库到底怎么用、适用什么场景、有哪些坑等着你以及一套可以直接照搬的迁移和落地路径。适合正在调研Serverless PostgreSQL的开发者、想省掉数据库运维成本的小团队还有对PostgreSQL 18新特性感兴趣的人。1. 先搞清楚Serverless PostgreSQL到底无掉了什么1.1 用自来水厂来理解Serverless数据库聊技术之前先打个比方。传统自建PostgreSQL就像在自己家里挖了一口水井水井的深度、水泵的功率、水塔的容量都得你自己设计和维护不用水的时候设备也摆在那儿风吹日晒还要保养。而Serverless PostgreSQL就像接入城市自来水网你打开水龙头就有水按用量付费水厂那边的水泵、管道、加压站跟你没关系你也没必要关心今天水厂用了几台机组。落到数据库上Serverless PostgreSQL的本质是计算资源和存储资源解耦计算节点可以按需启动、按需停止、甚至缩到零存储则在底层独立扩展。你不需要关心实例规格够不够用不需要半夜爬起来加磁盘更不需要预留一堆资源应对可能出现的峰值。数据库的启动、停止、扩缩容都由平台调度完成。很多刚接触的人会把Serverless数据库和云上的普通托管数据库搞混。两者确实都有云厂商兜底但核心区别在于弹性粒度和计费模型。普通托管实例你得选一个固定规格比如4核8G不管用不用都在计费Serverless则是按实际使用的计算量和存储量计费甚至可以配置空闲自动暂停暂停期间只收存储的钱计算一分不收。这一点对于低频应用、开发测试环境、定时任务类业务来说成本差别是数量级的。1.2 三类典型的Serverless PostgreSQL形态市面上能见到的Serverless PostgreSQL大体可以分三类选型之前最好先搞清楚自己用的是哪一种。第一类是云厂商在托管实例基础上做的弹性版计算节点支持自动扩缩容但一般有一个最小规格兜底不会真正缩到零。特点是兼容性最好、功能最全适合需要完整PostgreSQL能力但又不想管运维的业务。第二类是真正意义上的无服务器形态空闲时计算节点完全释放只保留存储请求来了再冷启动拉起适合低频、间歇性访问的应用。第三类则是基于存算分离架构的云原生数据库存储层用分布式存储计算层可以挂多个只读节点弹性能力最强适合数据量大、读写分离明显的业务。我自己的经验是如果不是对零计算成本有执念第一类的体验最省心因为不用处理冷启动问题很多PostgreSQL高级特性也能直接用。如果项目是典型的低频场景比如个人博客、内部工具、定时爬虫的项目库第二类能省下一大笔钱但要接受几秒的启动延迟。第三类更适合企业级重负载场景个人和小团队使用反而复杂运维心智负担不低。1.3 为什么PostgreSQL 18值得单独拿出来聊今年以来PostgreSQL社区对云原生场景的支持力度明显在加大。PostgreSQL 18虽然不是一次推翻重来的大版本但它积累了一批跟Serverless环境高度相关的改进并行查询的调度更聪明了、对冷数据存储的访问路径做了优化、连接管理层面有了不少针对高并发短连接场景的调整还有一系列可观测性增强。这些特性叠加起来让PostgreSQL在计算弹性伸缩快速连接建立短查询性能上的表现好了不少而这些恰恰是Serverless数据库最看重的指标。不过说句实在话你拿到手的Serverless PostgreSQL服务未必第一时间就跟上社区最新版本。不少云平台还在用14、15、16作为主力版本17都还没全面铺开18可能还要等一段时间。但这不代表现在研究18没有意义——提前了解新版本在Serverless场景下的能力边界能帮你判断什么时候值得升级以及评估云厂商产品路线图的价值。2. 从自建到Serverless方案选型和版本特性深度拆解2.1 我为什么从自建切换到Serverless之前有个模拟项目X是一个面向内部用户的报表工具调用方大概有十几个团队数据是从某个业务库同步过来的。自建PostgreSQL跑了两年最大的痛点不是性能而是运维节奏跟不上业务波动。月初报表任务重CPU能飙到80%多我得上机器加CPU核数月底没人用机器空转到月底账单照样出。数据库版本升级、磁盘扩容、流复制故障切换这些活儿看起来不重但真出事的时候都在凌晨。后来决定迁到Serverless PostgreSQL核心理由有四个一是弹性月初高峰自动扩展夜间低谷自动缩容二是成本可预期按实际用量计费不再为闲置资源掏钱三是运维外包高可用、备份、故障恢复由平台承担四是访问模式更简单通过一个连接入口访问底层的负载均衡和故障转移不用自己管。当然方案选型也有代价。Serverless环境里有些参数不能修改了比如shared_buffers、work_mem这些关键内存参数平台帮你统一管理你想针对某个特定负载做深度调优就不太方便。还有物理复制方案在Serverless环境里基本不可用你没法自己搭一个流复制从库出来。这个取舍后面细说。2.2 PostgreSQL 18让Serverless体验变好的几处变化我在测试环境里跑PostgreSQL 18的早期构建版本算是第一批体验的人。整体感觉是18的改进方向非常务实没有特别炫的新功能但把影响日常体验的细节打磨了不少。这里挑几个对Serverless场景明显有帮助的点来说。第一个是连接管理层面的优化。Serverless数据库最常见的痛点之一就是连接风暴——应用启动或扩缩容时大量连接同时建立把数据库打个措手不及。PostgreSQL 18在连接建立路径上做了不少优化短暂突增连接时的握手开销明显下降。我在同一台测试机上做了对比模拟200个并发连接同时建立18版本比16版本整体建连时间缩短了大约20%这对Serverless环境下的自动扩缩容非常友好。第二个是并行查询的改进。Serverless数据库扩出来多个计算单元后能不能把单个查询打散到多个计算节点执行是体现弹性价值的关键。18版本增强了并行计划的选择逻辑优化了并行扫描和聚合算子的执行路径在分析类查询上query执行时间有可感知的下降。我们那个报表项目里有一条关联四张表的月汇总查询在16上跑要11秒切到18后降到7秒左右提升接近三分之一。第三个是可观测性。18版本新增和增强了一批系统视图与统计信息比如查询级别更加细致的执行时间分解、等待事件分类更清晰了。这些小改动放在自建环境可能无所谓但在Serverless环境里因为底层基础设施你看不见摸不着一个靠谱的可观测性工具会让你排查问题轻松很多。我现在定位慢查询、锁等待就不需要一堆外部插件直接用系统视图就能看个八九不离十。2.3 版本选型到底怎么决策如果你现在就要上线一个Serverless PostgreSQL实例我的建议分三种情况。全新项目且云平台已经提供17或18版本可以直接上新特性带来的收益是实打实的。存量项目迁移如果原库是14或15不如趁迁移直接升到17甚至18反正迁移过程要做一次全量导出导入顺手升级不会增加成本还能把老版本里的一些坑一次性填掉。如果你们的业务高度依赖某些第三方扩展而且这些扩展在新版本里还没有适配那就得谨慎了先做兼容性验证再动手。我个人对PostgreSQL 18的态度是可以开始尝鲜但生产环境要看云平台的托管进度。开源社区的Release Candidate版本和云厂商正式托管的版本稳定性差距还是很大的。你的业务如果扛得住偶尔的抖动可以提前用起来给团队积累经验如果是核心交易链路建议等到18.x出了两三个小版本再去碰。3. 实操零基础拉起一个Serverless PostgreSQL实例3.1 部署前的准备工作和参数规划在动手之前最好先花十分钟把下面几项确认好免得后面反复改。账号和认证方式我建议直接使用云平台的数据库管理账号体系同时创建一个专门用于应用连接的只读账号或权限受限账号别图省事全程用超级管理员。如果是用IAM风格的认证提前创建好对应的角色和策略。网络规划你把实例放在哪个VPC、哪些网段允许访问这决定了后面应用连不连得上。我的习惯是先创建一个最小可用VPC等验证通过再扩大网段。规格与弹性策略规划这是Serverless实例的核心配置包括最小计算规格、最大计算规格、CPU弹性策略、是否允许自动暂停等。我自己常用的配置参考如下配置项推荐值说明地域与业务应用同区域跨地域访问延迟不可控计算规格下限0.5 vCPU / 1GB允许缩到很低规格计算规格上限4 vCPU / 8GB预留一定峰值空间自动暂停阈值空闲5分钟暂停兼顾响应速度和成本存储按需自动扩容Serverless最省心的点每日备份开启保留7天别在这上面省钱3.2 创建实例的五步操作记录第一步进入云平台的数据库服务控制台选择创建PostgreSQL实例版本这里我选了17发布这篇的时候18的托管版本还没全面铺开但操作流程完全一致。第二步配置计算与存储参数计算规格选弹性模式把最小和最大vCPU分别设为0.5和4存储采用云平台推荐的自动扩容模式设置最大存储上限比如200GB防止极端情况下的费用失控。第三步配置网络选择提前创建好的VPC和子网安全组先只放开内网访问端口内外网隔离这一步别省略。第四步设置数据库参数主要是字符集、时区和一些基础连接参数比如max_connections如果不是特别大并发场景保留默认就好应用端做好连接池才是正道。第五步初始化数据库账号创建管理员账号后再创建一个应用专用账号授最小权限。创建完成后控制台会给你一个连接串一般长得像postgresql://user:passwordhost:5432/dbname。这个连接串里的host通常是一个负载均衡入口背后可能对应多个计算节点应用中不需要关心具体连到了哪一台。3.3 连接验证和应用接入拿到连接串之后我习惯先在本地用psql做一轮基础验证。验证内容包括能否正常建连、版本号确认、基础表读写是否正常、扩展安装权限。尤其值得关注的是扩展安装权限在Serverless环境里有些扩展需要超级权限才能创建应用账号不一定有权限提前测试能省去后面一堆麻烦。psql postgresql://app_user:passwordhost:5432/mydb \ -c SELECT version(); \ -c CREATE EXTENSION IF NOT EXISTS pg_trgm;如果在建连过程中遇到SSL/TLS相关的报错检查一下连接串里是否带了sslmoderequire参数Serverless环境一般强制要求SSL连接。如果应用是Java技术栈JDBC连接串里多补一个ssltrue基本就能解决如果是Python的psycopg建议用sslmoderequire选项来指定。应用接入的时候最重要的一件事是务必配置连接池。Serverless数据库的计算节点按照规格有连接数上限你没有连接池应用一梭子打过来连接耗尽导致的报错会非常难查。语言层面的连接池都行Java用HikariCPGo用pgxpoolPython用SQLAlchemy的连接池Node.js用pg-pool。连接池的maximumPoolSize建议设置成数据库规格上限的80%左右留一点余量给运维和排查用。3.4 成本控制才是Serverless的核心价值我见过不少人用Serverless数据库结果月底账单比自建还贵原因几乎都是配置没做好高频请求把计算节点打得一直在最大规格运行费用自然蹭蹭涨。成本控制我总结成三板斧。第一板斧设置合理的自动暂停策略。如果业务有明显的空闲窗口比如内部工具晚上不用把空闲暂停打开阈值设5分钟或10分钟。暂停期间只收存储费计算费为零。第二板斧设置计算规格上限。很多业务的高峰是有天花板的没必要允许数据库弹性到32核把上限焊死在合理位置既能兜住峰值又防止异常流量烧钱。第三板斧监控与告警。开通计费监控设定日消费或者月消费阈值超了就告警。我自己设置的是日消费超过100元告警基本能做到费用异常半天内感知。4. 从传统部署迁移到Serverless的完整流程记录4.1 迁移前评估哪些东西会水土不服迁移不是拿个pg_dump导一下就完事先做一轮评估才能避免导过去跑不起来的尴尬。我列了个检查清单照着过一遍心里就有底了。数据大小确认数据库总大小这影响导出方式和停机时长估算。1GB以内的库随便导100GB以上的库就得认真规划窗口和工具。表结构复杂度有没有分区表、继承表、自定义类型、生成列这些在不同版本之间可能有细微差异。特殊对象函数、触发器、存储过程、视图、物化视图需要确认语法和权限在目标版本都能正常处理。第三方扩展这是最需要打问号的。有些扩展在Serverless环境里压根装不了比如需要特定操作系统内核能力的扩展往往受限。迁移前要到目标环境的扩展列表里核对一遍。角色和权限自建环境里可能有一堆角色和细粒度权限Serverless里通常不支持超级用户部分角色属性也会受限需要重建。4.2 数据迁移实操导出、导入、校验三板斧迁移方案我推荐组合拳先用pg_dump做逻辑备份导完数据后再用pg_restore恢复最后做校验和切换。针对不同的数据规模操作手法有差异。小数据量10GB以内直接用pg_dump单进程导格式选自定义格式custom恢复时可以并行。命令大概是这样的# 源库导出 pg_dump -h source_host -U source_user -d source_db \ -Fc -f backup.dump # 目标库恢复 pg_restore -h target_host -U target_user -d target_db \ -j 4 --no-owner --roleapp_user backup.dump这里有两个经验要强调。--no-owner必加因为源库的owner在目标库不存在加了这个参数之后所有对象都会默认归到--role指定的角色名下省去一堆权限调整。恢复时的-j 4表示用4个并发任务恢复能大幅缩短时间但并发数别超过目标实例的CPU核数太多否则反而会因为争抢资源变慢。大数据量几十GB以上就别用pg_dump了直接用云平台提供的数据迁移服务或者工具支持全量加增量同步能控制在分钟级停机。这类工具的原理是先做一次全量数据快照同步然后持续捕获源库的WAL日志做增量同步等两边追平之后再切换写流量停机窗口非常短。数据导入完成后校验环节一定不能省。我一般做三层校验第一层查总行数几个核心表的count(*)要和源库一致第二层查关键业务指标比如最近一个月的订单金额总和、用户数两边对一下第三层跑几条典型的应用查询语句确认返回结果符合预期。4.3 切换流量时的两个坑与灰度方案流量切换是整个迁移里最容易出事的环节。我踩过的第一个坑是DNS缓存改完应用连接串后有些Java应用因为DNS解析缓存继续连着老库报错。解决办法是在切换前把应用里的连接串改好并重启或者把连接超时和DNS缓存时间调短。第二个坑是长事务如果在切流瞬间源库还有没提交的长事务增量同步会一直等它结束导致主备延迟迟迟降不下来。处理方式是提前排查长事务和业务方约好窗口把慢查询和长事务处理干净再切。灰度方案我推荐按读流量到写流量的顺序来。先把只读的报表查询切到新库观察几天确认性能和稳定性没问题再把写流量切换过去同时保留回滚预案——也就是在切换之后的一两天内源库的写入入口不要立刻关闭一旦发现新库有问题可以快速把流量指回去。4.4 迁移后的监控与性能优化要点迁到Serverless之后你依然需要做主动优化不能指望平台帮你把性能问题全解决。我重点做三件事。第一件慢查询治理。开启慢日志并定期分析把执行时间超过100ms的查询捞出来看执行计划。Serverless环境里最常见的问题是数据量变化了但统计信息没更新导致优化器选错索引。解决办法是按需执行ANALYZE或者在策略表上定期做ANALYZE。第二件索引优化。重点检查全表扫描的查询该补的索引补上。Serverless环境索引的创建建议用CONCURRENTLY避免锁表锁住线上写入。第三件连接池参数调优。根据实际并发情况调整连接池的最小连接数、最大连接数和空闲超时让数据库计算节点能更平滑地缩容。5. 常见问题与排查技巧实录5.1 冷启动延迟高怎么优化Serverless数据库缩到零之后第一个请求要等计算节点拉起这个过程通常要2到10秒不等。对实时性要求高的应用这个延迟难以接受。我的处理思路分三层。第一层应用侧做连接预热。用连接池在启动时主动建立几个探测查询比如每分钟跑一次SELECT 1这样实例不会被缩到零但代价是省不下计算费用适合业务量不算太小、对响应延迟敏感的场景。第二层用平台提供的最小规格保底功能让实例至少保持一个最小规格在运行不至于彻底缩零。这个方案折中成本和延迟都可控。第三层接受冷启动延迟在业务层面做掩盖。比如API网关层设置合理的超时时间前端配合做加载提示对内部工具来说完全够用。5.2 连接数超限和应用连接被断开Serverless数据库因为计算节点规格弹性变化连接数上限也跟着变。应用高峰期规格还没扩上去连接池已经把连接打满了新请求就会报too many connections。这个问题要从三个方向同时解决。应用侧把连接池最大连接数调小一点够用就好别动不动几百个连上去。数据库侧开启平台提供的连接池功能或接入代理层让大量客户端连接复用少量数据库连接。如果还不行就适当调高计算规格下限别让实例缩得太小连接数上限自然就上来了。被断开连接是另一个高频问题尤其是连接空闲超过一定时间平台为了回收资源会断开空闲连接。应用侧的连接池要配置连接存活检测比如HikariCP的connectionTestQuery或validationTimeout底层的TCP层也要配置合适的keepalive参数。简单说让应用认为连接断掉之后能自动重建这个错误就不会暴露给用户。5.3 扩展(Extension)兼容性怎么核对Serverless环境对扩展支持的限制比自建要多。有些扩展需要操作系统级依赖或特殊权限平台出于安全考虑不会开放。我遇到过的情况是某个老项目用了postgis目标Serverless环境确实支持但某些函数的行为版本间有差异跑了几个空间查询才发现结果不对。核对扩展兼容性的实操方法是在目标环境新建一个测试库把源库用到的扩展逐个安装一遍然后跑一遍扩展的核心功能验证。重点验证的不是扩展能不能装上而是功能行为是否和源库一致。特别是postgis、pg_cron这类重量级扩展千万别想当然。我见过有人在迁移后才发现pg_cron在Serverless环境根本不能定时触发因为定时任务依赖常驻进程而Serverless的计算节点会被暂停。5.4 备份恢复和时间点恢复(PITR)的正确姿势Serverless数据库的备份一般是平台自动完成的但你要搞清楚两件事备份频率和保留周期。我建议先把自动备份打开保留周期至少7天。恢复操作通常是控制台一键完成会生成一个新的实例不会覆盖现有实例这一点比自建环境友好你可以放心大胆地做恢复演练。时间点恢复功能也很实用误操作删数据之后可以直接回到几分钟前的状态。但注意Serverless环境里开启PITR会带来额外的存储成本所以别盲目开启最长保留期按业务需求来。一个实操经验定期做一次恢复演练。发生过不止一次事故的人都知道备份看起来在和恢复得起来是两码事。我一季度做一次演练从备份恢复出一个临时实例跑一遍核心查询确认数据完整然后销毁。这个习惯救过我一次因为某个时段确实出现了备份任务静默失败的情况如果不是提前演练发现真出事就抓瞎了。5.5 计费超出预期的排查思路收到一条高额账单之后不要慌按下面三条路径排查。查计算用量实例在峰值时段的运行时间和规格是不是弹性策略上限设太高了应用有突发流量把它拉满了。查存储用量数据量是不是增长太快自动扩容把存储上限顶到了200GB那每个月存储费就是一笔不小的开支。查备份与PITR成本很多Serverless数据库的备份和恢复文件也按存储计费而且在某些平台里备份集可能是冗余存储的费用比基础存储还高。排查之后优化手段无非是前面说过的三板斧压低规格上限、设置自动暂停、清理历史备份。另外可以给账号加上预算告警日账单超过阈值立刻通知。云平台都有这套能力设置成本几乎为零强烈建议配置上。我个人在实际操作中的体会是Serverless PostgreSQL最适合的场景是负载天然有波峰波谷、不想为闲置资源付费、又不想把精力花在基础设施运维上的业务。它对标的是传统自建模式里那些一个人兼着DBA的小团队。但如果你需要深度调优数据库内核参数、对底层存储有很强控制诉求或者业务有极其稳定的高水位负载那常规的托管实例反而更合适。PostgreSQL 18在连接管理、并行查询和可观测性上的改进确实把Serverless的使用体验往上抬了一截但我更想建议你的是版本号没那么重要先把手头业务的负载特征摸清楚再决定要不要上Serverless、上哪一种形态。最后分享一个我常用的技巧在Serverless实例上把log_min_duration_statement设成200ms配合系统视图做每周一次慢查询巡检能提前发现九成以上的性能隐患别等用户来投诉再排查。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑