通过蓝绿部署模式升级大版本

本文介绍如何通过蓝绿部署的模式升级RDS PostgreSQL数据库大版本。

前提条件

  • 实例版本为RDS PostgreSQL 16或以下版本。

  • 实例不是只读实例专属集群实例

  • 实例未启用Babelfish,即小版本号后缀不带babelfish

背景信息

在蓝绿部署模式下,原实例恢复到一个新实例,并使用pg_upgrade将其升级至目标版本。割接场景下,自动切换原连接地址到新实例。

RDS PostgreSQL控制台还支持通过零停机模式本地升级模式升级数据库大版本,不同模式的对比请参见大版本升级方案简介

升级费用

通过蓝绿部署模式升级大版本,系统会在原实例的基础上,新建一个实例,在升级完成后:

  • 原实例和新实例将同时产生费用。

  • 原实例的费用和计费方式保持不变。

  • 新实例的计费方式相比于原实例可能会发生变化。因此在升级前,请确保账户余额大于等于100元。

    原实例计费方式

    新实例计费方式

    包年包月/按量付费

    按量付费

    Serverless

    Serverless

    说明

    为节省费用,建议在新实例的业务稳定运行后,将其转成包年包月,并释放或退订原实例。但需要注意以下情况:

    • 如果您的原实例计费方式为包年包月且尚未到期,新实例无法继承原实例包月剩余时长,释放原实例可能存在费用损失。具体退订规则请参见退款说明

    • 如果您的原实例购买时使用了优惠,升级后新实例将不会继承此优惠,请进入实例退订页面查看具体退款金额后,再评估是否升级。

    • 包年包月退款金额退款时间以实际退订账单为准,非实时到账。

注意事项

  • 业务影响:通过蓝绿部署(割接)进行升级时,在割接过程中,原实例将会被设置为只读,并会造成分钟级业务闪断,请在业务低峰期进行升级。如果选择不割接方式进行升级,则不受影响。

    • 原实例只读时间的长短与数据库对象数量相关,实例数据库对象数越多,只读时间越长,当数据库对象数达到百万级别时,只读时间可能达到十分钟级甚至小时级。您可以使用SELECT count(1) FROM pg_class;命令查看数据库的对象数。

    • 客户端感知的闪断时长取决于DNS缓存刷新时间。您可以尝试切换虚拟交换机,通过业务闪断时长来评估客户端的DNS缓存刷新时间。

    • 升级过程的时间长短与实例的数据库对象数量相关,数据库对象数越多,升级时间越长。大版本升级时您可以在任务中心查看任务进度。

    • 对于蓝绿部署,在割接后,如果不希望原实例被设置为只读,请在升级后将参数rds_force_trans_ro_non_sup设置为off,详情请参见设置实例参数

  • 跨版本升级:RDS PostgreSQL 9.410高性能本地盘实例仅支持升级至云盘版实例,最高可直接升级至RDS PostgreSQL 14。如果需要升级至PostgreSQL 15或更高版本,请首先升级至中间版本(PostgreSQL 9.4可升级至10、11、12、1314;PostgreSQL 10可升级至11、12、1314),然后再进行PostgreSQL 15或更高版本的升级。

  • 复制槽(Replication Slots)

  • 虚拟IP:对于蓝绿部署(割接),升级后新实例的虚拟IP(Virtual IP Address)会变更,请自行检查网络连通性,如防火墙配置。

    • 虚拟IP变更影响:如果您在应用程序中配置了虚拟IP,则需要修改应用配置以指向新实例的虚拟IP。

    • 建议方案:为避免手动修改配置的复杂性,建议在应用程序中直接配置实例的连接地址,获取实例连接地址请参见查看或修改连接地址和端口

  • 参数变化

    • 如果原实例使用了新版本不支持的参数,在新版本中该参数会被自动删除。

    • 如果原实例的参数取值不在新版本对应参数取值的合法区间,则在新版本中,该参数将被设定为该版本参数模板的默认值。

    • 升级过程中,系统会暂时将statement_timeout的值修改为0,并在升级完成后恢复为原值。

  • DTS任务:如果待升级的实例作为数据传输服务(DTS)的源实例或目标实例,则升级后需要重建DTS任务

  • 插件兼容性问题:进行大版本升级时,系统将自动更新至最新的内核小版本,可能会遇到插件兼容性问题

  • 新实例不继承原实例的实例名称标签云监控报警规则以及备份数据

步骤一:升级前检查

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. (可选)如果待升级的实例中创建了只读实例,需要将应用程序中配置的只读实例连接地址修改为主实例连接地址,并删除只读实例。

    说明

    为保证业务稳定,建议在业务低峰期修改应用连接地址。

  3. 在左侧导航栏单击大版本升级

    说明

    如果左侧导航栏中没有大版本升级,请检查RDS PostgreSQL实例版本及配置,具体请参见前提条件

  4. 升级检查页签中,单击创建升级检查报告

  5. 择选升级版本,且升级模式选择蓝绿部署后,单击确定

    此时,实例状态变为维护实例中,待升级检查完成后,实例状态会变为运行中

    当升级检查报告结果为成功警告时,可以进行后续的大版本升级步骤;若结果为失败,则需单击查看信息,根据报告内容修复异常检查项后,再次进行升级前检查。常见的报错及原因请参见解读RDS PostgreSQL大版本升级检查报告

    重要
    • 为确保升级顺利完成,当升级检查报告的检查结果为警告时,建议根据报告内容修复异常检查项后,再次进行升级前检查,直至检查结果为成功

    • 升级检查成功后,如果在主实例中创建了插件,需重新执行检查。

步骤二:升级大版本

  1. 单击升级实例页签,阅读警告内容,然后选择升级版本,并单击创建升级任务

  2. 在弹出的窗口中,阅读提示内容,然后单击确定

  3. 创建大版本升级任务区域,升级模式蓝绿部署,并配置对应升级参数(仅列举重点参数)。

    配置

    说明

    存储类型

    • 新实例存储类型仅支持ESSD云盘和高性能云盘。选择ESSD云盘时,支持切换性能等级。

    • 新实例的存储类型需和原实例保持一致。

      说明
      • 不同性能级别的ESSD云盘最小容量不同,切换性能等级时,实例存储空间的最小值会根据所选性能等级自动调整,需确保新值满足要求。

      • 原实例为高性能本地盘时,新实例仅支持选择ESSD云盘。

    目标主可用区

    系统支持升级后将新的主备实例配置到其他可用区,请根据实际情况设置。

    目标备可用区

    目标主实例交换机

    目标备实例交换机

    割接配置

    根据实际需求选择是否将流量切换到新版本实例上。

    • 不割接:不自动切换。此选项一般用于正式升级之前测试当前业务在新版本中的兼容性。

    • 割接:自动切换。此选项一般用于在确认业务可以稳定运行在新版本之后执行正式升级。割接结束会自动连接到新实例,您无需更改应用程序里的数据库连接地址。

    说明
    • 割接后无法回退,请谨慎选择。

    • 割接过程中,原实例将会被设置为只读,并会造成分钟级业务闪断,请在业务低峰期进行升级。如果选择不割接方式进行升级,则不受影响。

    • 建议第一次执行时选则不割接,应用层完全测试验证通过后,释放新实例并重复升级操作,选择割接开始正式升级。

    存储空间

    选择新版本实例的存储空间大小。

    高性能本地盘实例升级大版本时,支持存储空间缩容。

    可选择的最小存储空间需满足以下条件:

    • 以下两者中的最小值:

      • 原实例已使用存储空间 × 120%,如果计算结果(单位需转换为GB)不是5的倍数,则向上凑为5的倍数。

        说明

        原实例已使用存储空间,可通过监控与报警功能查看监控项磁盘空间 (MB),具体方法,请参见查看增强监控

      • 原实例存储空间。

    • 大于等于ESSD云盘可购买的最小值,不足时以如下值作为可购买最小值:

      • ESSD PL1云盘:20 GB。

      • ESSD PL2云盘:500 GB。

      • ESSD PL3云盘:1500 GB。

    说明

    例如:

    • 原实例存储空间为100 GB,已使用70 GB,升级大版本时,存储类型选择为ESSD PL1云盘。

      计算方法:70 × 120% = 84,向上凑为5的倍数85 GB。因此,可购买的最小存储空间为85 GB。

    • 原实例存储空间为700 GB,已使用350 GB,升级大版本时,存储类型选择为ESSD PL2云盘。

      计算方法:350 × 120% = 420,420 GB小于ESSD PL2云盘可购买的最小值500 GB,因此,可购买的最小存储空间为500 GB。

    实例规格

    选择新版本实例的规格。有关实例规格的更多详情,请参见主实例规格列表

  4. 单击立即创建

    当实例状态变为迁移中时,表示升级任务已正式启动。

    升级所需时间与实例中的数据库对象数量密切相关,数据库对象数量越多,升级所需时间越长。在进行大版本升级时,您可以在任务中心查看升级进度。

    重要
    • 升级任务创建后不支持修改或删除

    • 原实例状态为迁移中时,该实例不支持修改参数、重启、释放等运维操作。

    • 如果创建任务时提示资源不足,请切换目标主实例可用区

  5. 查看升级结果。

    当原实例和新实例的状态为运行中时,表示实例升级成功。

    说明
    • 蓝绿部署(切割)模式,升级完成后流量自动切换到新实例(高版本)。

    • 蓝绿部署(不切割)模式,升级完成后流量不切换到新实例(高版本)。

    • 升级完成后,在升级历史页签,单击目标升级任务升级日志列的查看信息,即可查看升级过程中实例的只读时间及详细的升级过程。其中只读时间为割接时间割接结束时间之间的时段,此时间段不包括因DNS缓存未刷新而导致无法连接的时间。

    • 对于蓝绿部署(不切割),系统同样会显示割接时间割接结束时间,以便作为割接场景的参考和预估。

后续操作

  1. 对于采用蓝绿部署(割接)的模式进行升级的实例,确认业务已在新实例中稳定运行后,请及时释放原实例

    同时,建议将新实例的计费方式转成包年包月,以获得更多的优惠。

    说明
    • 如果您的原实例计费方式为包年包月且尚未到期,释放实例可能存在费用损失。具体退订规则请参见退款说明

    • 如果您的原实例购买时使用了优惠,升级后新实例将不会继承此优惠,原实例退订请以实际退订页面为准。

    • 包年包月退款金额退款时间以实际退订账单为准,非实时到账。

  2. (可选)新实例不包含只读实例,如果在升级前删除了只读实例,还需执行:

    1. 在新实例上重新创建PostgreSQL只读实例

    2. 在应用程序中,将原只读实例连接地址(已在升级前修改为主实例连接地址)修改为新的只读实例连接地址。

升级结果说明

升级过程中,升级历史页签的升级记录中,包含以下升级结果

升级结果

实例状态

含义

可执行动作

运行中

迁移中

升级任务正在运行。

无。

成功

运行中

升级任务成功。

无。

相关API

API

描述

UpgradeDBInstanceMajorVersionPrecheck

RDS PostgreSQL实例大版本升级检查。

DescribeUpgradeMajorVersionPrecheckTask

查询RDS PostgreSQL实例大版本升级检查报告。

UpgradeDBInstanceMajorVersion

RDS PostgreSQL实例升级数据库大版本。

DescribeUpgradeMajorVersionTask

查询RDS PostgreSQL实例大版本升级历史任务。

相关文档

常见问题

大版本升级期间,是否能变更实例?比如变更实例规格?

大版本升级期间不支持变更实例,必须在大版本升级完成后才能进行其他操作。

大版本是否支持自动升级?

暂不支持自动升级数据库大版本。

是否支持大版本降级?

升级后暂不支持进行大版本降级操作,如需降级,请购买低版本实例后,使用DTS迁移,将实例迁移至低版本中。

升级数据库大版本后,在新实例中创建raster_overviews视图时,提示raster_overviews冲突,如何处理?

如果PostGIS版本小于2.5.2RDS PostgreSQL版本为1011,升级插件后,再升级数据库大版本到PostgreSQL12,在新实例中创建raster_overviews视图可能会出现raster_overviews冲突的问题。

解决方法如下:

  1. 在原实例中升级PostGIS插件版本。

    如下命令需执行两遍,以确保成功。

    SELECT PostGIS_Extensions_Upgrade();
    SELECT PostGIS_Extensions_Upgrade();
  2. 根据业务判断是否使用了PostGIS Raster插件,选择对应的升级方法。

    使用了PostGIS Raster插件

    1. 在原实例中执行如下命令,修改raster_overviews视图。

      ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews;
      CREATE OR REPLACE VIEW raster_overviews AS SELECT 1;
    2. PostgreSQL实例进行大版本升级,至少升级到PostgreSQL 12或以上版本。

    3. 升级完成后,在新实例中重新创建视图。

      CREATE 
      OR REPLACE VIEW raster_overviews AS 
      SELECT 
        current_database() AS o_table_catalog, 
        n.nspname AS o_table_schema, 
        c.relname AS o_table_name, 
        a.attname AS o_raster_column, 
        current_database() AS r_table_catalog, 
        split_part(
          split_part(s.consrc, '''::name', 1), 
          '''', 
          2
        ): :name AS r_table_schema, 
        split_part(
          split_part(s.consrc, '''::name', 2), 
          '''', 
          2
        ): :name AS r_table_name, 
        split_part(
          split_part(s.consrc, '''::name', 3), 
          '''', 
          2
        ): :name AS r_raster_column, 
        trim(
          both 
          from 
            split_part(s.consrc, ',', 2)
        ): :integer AS overview_factor 
      FROM 
        pg_class c, 
        pg_attribute a, 
        pg_type t, 
        pg_namespace n, 
        (
          SELECT 
            connamespace, 
            conrelid, 
            conkey, 
            pg_get_constraintdef(oid) As consrc 
          FROM 
            pg_constraint
        ) AS s 
      WHERE 
        t.typname = 'raster' : :name 
        AND a.attisdropped = false 
        AND a.atttypid = t.oid 
        AND a.attrelid = c.oid 
        AND c.relnamespace = n.oid 
        AND c.relkind = ANY(
          ARRAY[ 'r' : :char, 'v' : :char, 'm' : :char, 
          'f' : :char ]
        ) 
        AND s.connamespace = n.oid 
        AND s.conrelid = c.oid 
        AND s.consrc LIKE '%_overview_constraint(%' 
        AND NOT pg_is_other_temp_schema(c.relnamespace) 
        AND has_table_privilege(c.oid, 'SELECT' : :text); ALTER EXTENSION PostGIS_Raster 
      ADD 
        VIEW raster_overviews;

    未使用PostGIS Raster插件

    1. 在原实例中执行如下命令删除插件。

      DROP EXTENSION PostGIS_Raster;
    2. PostgreSQL实例进行大版本升级,至少升级到PostgreSQL 12或以上版本。

如何避免在升级过程中出现复制槽抢占导致的数据不同步问题

  • 如果您需要将订阅数据保留在源端(低版本实例),那么在升级的过程中,确保源端不会因负载过大而导致宕机。否则,可能导致复制槽被目标端(高版本实例)抢占,从而出现数据不一致的情况。

    升级完成后,请使用以下SQL语句在目标端的数据库关闭订阅。

    \c your_database
    ALTER SUBSCRIPTION your_subscription_name DISABLE;
  • 如果您需要将订阅数据保存在目标端,请在升级前关闭源端的订阅,再进行大版本升级,升级完成后,请打开目标端的订阅。SQL示例如下:

    • 在源端关闭订阅。

      \c your_database
      ALTER SUBSCRIPTION your_subscription_name DISABLE;
    • 在目标端开启订阅。

      \c your_database
      ALTER SUBSCRIPTION your_subscription_name ENABLE;
说明

如何处理升级后订阅数据不一致的问题?

  1. 升级成功后,清空目标端(高版本实例)表数据,重新创建订阅并设置copy_data=true。详情请参见ALTER SUBSCRIPTION

  2. 使用CONFLICT关键字将源端(低版本实例)消费的数据导入到目标端,示例如下。

    CREATE TABLE my_tbl(id INT PRIMARY KEY, t TIMESTAMP, val TEXT);
    
    INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'a');
    INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP, 'b');
    INSERT INTO my_tbl VALUES (3, CURRENT_TIMESTAMP, 'c');
    
    -- in case with newer timestamp: do update
    INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'd') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;
    
    -- in case with older timestamp: do nothing
    INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP - '10 hours'::interval, 'e') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;
    
    -- in case with new val: just insert
    INSERT INTO my_tbl VALUES (5, CURRENT_TIMESTAMP - '10 hours'::interval, 'f') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;

为什么在进行大版本升级之前需要删除只读实例?

升级完成后,自建的只读节点和复制槽在升级后仍然保留在原实例下,不会自动转移到高版本实例。因此,在进行大版本升级前,请将应用程序中配置的只读实例连接地址修改为主实例连接地址,并删除现有的只读实例。升级完成后,请重新购买并配置新的只读实例。