RDS PostgreSQL大版本升级
随着PostgreSQL社区对低版本(如9.4、10)实例的停止维护,继续使用低版本实例将存在风险,如果您需要将低版本的RDS PostgreSQL实例升级到更高版本,或者希望使用高版本的新特性,建议您进行大版本升级操作。
方案简介
PostgreSQL社区定期发布大版本,带来功能和性能提升。较低版本将逐渐不再受支持,存在性能和安全风险。为了让您享受新版本的提升,同时降低升级风险,RDS PostgreSQL支持大版本升级功能。
RDS PostgreSQL的大版本升级功能提供蓝绿部署(割接/不割接)、本地升级和零停机等升级模式。同时,支持使用DTS通过迁移实例的方式进行升级,各个升级方案的对比如下:
升级方案 | 蓝绿部署(割接) | 蓝绿部署(不割接) | 本地升级 | 零停机 | |
实现原理 | 通过云盘技术,恢复一个新实例,并使用pg_upgrade将其升级至目标版本。同时,支持自动切换原连接地址到新实例。 | 通过云盘技术,恢复一个新实例,并使用pg_upgrade将其升级至目标版本。 | 后台创建一个新实例(虚拟实例),并使用pg_upgrade将其升级到目标版本。同时,将原实例的所有元信息完整刷新到新实例中。 | 后台创建一个新实例(虚拟实例),并使用pg_upgrade将其升级到目标版本。同时,通过PostgreSQL的原生逻辑复制进行增量更新。 | 手动创建新实例,并使用异步逻辑复制进行数据迁移。 |
方案优点 |
| 提供独立的测试环境进行升级后验证。 |
|
|
|
方案缺点 | 升级期间原实例将会被设置为只读,数据库对象数越多,只读时间越长。 | 不切换连接地址,需要业务侧自行配套。 |
|
|
|
适用场景 | 可以接受升级期间实例只读,并且期望保留原实例。 |
| 可以接受升级期间实例只读,并且期望升级后的实例与原实例一致。 | 业务不接受长时间停机。 |
|
费用 | 新建实例按量付费。 | 新建实例按量付费。 | 无升级费用。 | 无升级费用。 |
|
功能特点
支持跨版本升级:例如从PostgreSQL 10.0升级到PostgreSQL 13.0。
支持升级演练:通过蓝绿部署(不割接)的方式验证升级流程,不影响原实例。
支持平滑升级:
无需修改应用:通过蓝绿部署(割接)、本地升级和零停机方式升级,无需修改应用中已配置的数据库连接地址。其中蓝绿部署(割接)结束后,系统将会自动交换原实例与新实例的连接地址,而本地升级和零停机将保持原实例的连接地址不变。
无需停机:零停机方式升级时原实例无需停机,该方案可降低业务中断带来的风险。
保留实例设置:
升级后保留原实例的白名单、参数设置、插件(新版本不支持的插件和参数除外)。
加密实例升级大版本后仍为加密实例,加密Key保持不变。
支持通过备份克隆低版本实例及数据:选择本地升级时,会在升级前后进行常规备份。如果需要获得低版本实例及数据,可以使用最新的低版本备份集克隆实例。
升级费用
本地升级和零停机不会造成费用的变化,也不会产生订单。
蓝绿部署:
升级后生成的新实例的计费方式可能会发生变化。因此在升级前,请确保账户余额大于等于100元。
原实例计费方式
新实例计费方式
包年包月/按量付费
按量付费
Serverless
Serverless
升级完成后,原实例和新实例将同时产生费用。在确保业务在新实例中稳定运行后,您可以将新实例转成包年包月,将原实例释放或退订,但需要注意以下情况:
如果您的原实例计费方式为包年包月且尚未到期,新实例无法继承原实例包月剩余时长,释放原实例可能存在费用损失。具体退订规则请参见退款说明。
如果您的原实例购买时使用了优惠,升级后新实例将不会继承此优惠,请进入实例退订页面查看具体退款金额后,再评估是否升级。
包年包月退款金额退款时间以实际退订账单为准,非实时到账。
使用限制
实例版本:PostgreSQL 16或以下版本
说明支持跨版本升级。PostgreSQL 9.4最高仅支持直接升级到PostgreSQL 14,如果您需要升级到PostgreSQL 15或以上版本,则请先升级到PostgreSQL 10、11、12、13或14,然后再升级到PostgreSQL 15或以上版本。
实例ID不是以
pg-cn
开头。实例未启用Babelfish,即小版本号后缀不带
babelfish
。如果原实例中创建了只读实例,则无法选择蓝绿部署(割接)升级。如果需要进行蓝绿部署(割接)升级,请参见具有只读实例的主实例如何升级大版本。
存储类型为本地SSD盘的实例仅支持采用蓝绿部署模式进行大版本升级。在实例的基本信息页面,可以查看实例的存储类型。
升级影响
业务影响:
通过蓝绿部署(割接)或本地升级进行升级时,在割接过程中,原实例将会被设置为只读,并会造成分钟级业务闪断,请在业务低峰期进行升级。如果选择不割接方式进行升级,则不受影响。
原实例被设置只读时间的长短与数据库对象数量相关,实例数据库对象数越多,只读时间越长,当数据库对象数达到百万级别时,只读时间可能达到十分钟级甚至小时级。您可以使用
SELECT count(1) FROM pg_class;
命令查看数据库的对象数。客户端感知的闪断时长取决于DNS缓存刷新时间。您可以尝试切换虚拟交换机,通过业务闪断时长来评估客户端的DNS缓存刷新时间。
升级过程的时间长短与实例的数据库对象数量相关,数据库对象数越多,升级时间越长。大版本升级时您可以在任务中心查看任务进度,具体请参见任务管理。
对于蓝绿部署,在割接后,如果不希望原实例被设置为只读,请在升级后将参数
rds_force_trans_ro_non_sup
设置为off
,详情请参见设置实例参数。
参数:
如果原实例使用了新版本不支持的参数,在新版本中该参数会被自动删除,如果低版本的参数取值不在高版本对应参数取值的合法区间,在新版本中该参数会被置为高版本参数模板的默认值。
只读实例:
对于蓝绿部署,自建的只读节点和复制槽在升级后仍然保留在原实例下,不会自动转移到高版本实例,需要在升级后进行重建。
对于本地升级,自建只读节点的主备关系以及复制槽在升级后会丢失,请根据实际情况谨慎选择升级模式。
当待升级的实例中创建了只读实例时,则无法直接进行升级,需要在升级前后进行以下操作:
DTS任务:
如果待升级的实例作为数据传输服务(DTS)的源实例或目标实例,则升级后需要重建DTS任务。创建DTS任务详见DTS产品文档。
数据不同步问题:
当待升级的实例中存在Replication Slots的订阅端,升级可能出现复制槽抢占导致的数据不同步问题。需要执行如下操作防止出现数据不同步的情况。对于本地升级,建议升级前关闭源实例的订阅。
对于蓝绿部署(割接),升级后新实例的虚拟IP(Virtual IP Address)与原实例不同,如果您在应用程序中配置了虚拟IP,则需要修改应用,因此,建议您在应用程序中配置实例连接地址,如何获取实例连接地址,请参见查看或修改连接地址和端口。对于本地升级和零停机,不会修改虚拟IP(Virtual IP Address)。
升级大版本将会使用最新的内核小版本,可能遇到插件兼容性问题,具体请参见升级内核小版本。
升级后暂不支持进行大版本降级操作,如需降级,请购买低版本实例后,使用DTS迁移,将实例迁移至低版本中。
升级过程中,系统会暂时将
statement_timeout
的值修改为0,并在升级完成后恢复为原值。对于本地升级和零停机,在升级前,系统将对低版本实例进行备份;在升级完成后,系统将对高版本实例进行备份,以便于后续的克隆恢复。