在 1.6.3 版上升级到 AlloyDB Omni 17.5.0 版

选择文档版本:

本页面介绍如何在 Kubernetes 上将 AlloyDB Omni 的主要版本升级到 17.5.0。

准备工作

  • 验证您的 AlloyDB Omni Kubernetes 操作器版本是否为 1.6.3。如需升级 AlloyDB Omni 操作器版本,请参阅迁移到最新版本的 AlloyDB Omni Kubernetes 操作器

  • 验证您是否至少有 5GB 的可用磁盘空间。

  • 如果您运行外部或远程备份系统,请执行完整备份并暂停所有预定备份,以免在升级过程中进行备份。

  • 对于高可用性 (HA) 和数据弹性 (DR) 环境,请先分离数据库集群,然后再进行升级。

升级 AlloyDB Omni 版本

如需使用 pg_upgrade 升级 AlloyDB Omni 版本,请执行以下操作之一:

执行脚本化升级

您可以在 GitHub 上的 AlloyDB Omni 示例中找到执行手动升级步骤的脚本。

如需使用升级脚本,请下载该脚本并运行以下命令:

./MVU.sh 17.5.0 1.6.3 NAME NAMESPACE

执行以下变量替换操作:

  • NAME:您的数据库集群的名称。
  • NAMESPACE:数据库集群的命名空间。

执行手动升级步骤

按照您从中升级的主要版本对应的说明操作。

从较低的主要版本升级

  1. 获取数据库的当前主要版本和目标主要版本。

    export OLD_PG_VERSION=$(kubectl get dbcluster.alloydbomni.dbadmin.goog NAME -n NAMESPACE -o jsonpath='{.spec.databaseVersion}' | cut -d'.' -f1)
    export NEW_PG_VERSION=$(echo '17.5.0' | cut -d'.' -f1)
    

    执行以下变量替换操作:

    • NAME:您的数据库集群的名称。
    • NAMESPACE:数据库集群的命名空间。
  2. 备份数据,以免丢失任何数据。

  3. 移除备份方案

  4. 终止所有复制过程。其中包括为了实现高可用性 (HA) 和数据弹性 (DR) 而进行的物理复制,以及所有逻辑复制流。

  5. 为数据库集群添加注解,以指定手动版本升级。

    kubectl annotate dbclusters.alloydbomni.dbadmin.goog NAME -n NAMESPACE dbs.dbadmin.goog.com/manualmvu=true
    

    执行以下变量替换操作:

    • NAME:您的数据库集群的名称。
    • NAMESPACE:数据库集群的命名空间。
  6. 停止 PostgreSQL 进程并移动数据以进行升级。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    # Shut down postgres
    supervisorctl.par stop postgres;
    
    # Check data directory and move it for upgrade if necessary
    if [ -d /mnt/disks/pgsql/data ]; then
        echo 'Found data directory at /mnt/disks/pgsql/data, moving it to /mnt/disks/pgsql/${OLD_PG_VERSION}/db'
        mkdir -p /mnt/disks/pgsql/${OLD_PG_VERSION};
        mv /mnt/disks/pgsql/data /mnt/disks/pgsql/${OLD_PG_VERSION}/db;
    elif [ ! -d /mnt/disks/pgsql/${OLD_PG_VERSION}/db ]; then
        echo 'ERROR: Neither /mnt/disks/pgsql/data nor /mnt/disks/pgsql/${OLD_PG_VERSION}/db directory found' >&2;
        exit 1;
    fi
    
    cp -r /usr/lib/postgresql/${OLD_PG_VERSION}/bin /mnt/disks/pgsql/${OLD_PG_VERSION}/.;
    cp -r /usr/lib/postgresql/${OLD_PG_VERSION}/lib /mnt/disks/pgsql/${OLD_PG_VERSION}/.;
    cp -r /usr/share/postgresql/${OLD_PG_VERSION} /mnt/disks/pgsql/${OLD_PG_VERSION}/share;
    rm -f /mnt/disks/pgsql/${OLD_PG_VERSION}/share/postgresql.conf.sample;
    cp /usr/share/postgresql/postgresql.conf.sample /mnt/disks/pgsql/${OLD_PG_VERSION}/share/postgresql.conf.sample;
    chmod 2740 /mnt/disks/pgsql/${OLD_PG_VERSION}/db
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  7. 更新补丁,将数据库集群升级到 17.5.0 版,将控制平面代理 (CPA) 升级到 1.6.3 版。

    kubectl patch dbclusters.alloydbomni.dbadmin.goog NAME -n NAMESPACE --type=merge -p '{"spec":{"databaseVersion":"17.5.0","controlPlaneAgentsVersion":"1.6.3","databaseImageOSType":"UBI9"}}'
    

    执行以下变量替换操作:

    • NAME:您的数据库集群的名称。
    • NAMESPACE:数据库集群的命名空间。
  8. 获取升级后的数据目录路径,并将其设置为环境变量。

    export POST_UPGRADE_DATA_DIR=$(kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "if [ -d /mnt/disks/pgsql/data ]; then echo /mnt/disks/pgsql/data; else echo /mnt/disks/pgsql/${NEW_PG_VERSION}/db; fi")
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  9. 为升级后的 AlloyDB Omni 版本创建一个空数据库集群。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    supervisorctl.par stop postgres;
    # Initialize a new, empty database cluster for the new version.
    rm -fr $POST_UPGRADE_DATA_DIR;
    initdb -D $POST_UPGRADE_DATA_DIR -U alloydbadmin --data-checksums --encoding=UTF8 --locale=C --locale-provider=icu --icu-locale=und-x-icu --auth-host=trust --auth-local=reject;
    cd ~
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  10. 修改现有数据库集群中的 pg_hba.conf,为升级流程提供所需的权限和连接。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    # Backup pg_hba.conf of the old postgres cluster
    cp /mnt/disks/pgsql/${OLD_PG_VERSION}/db/pg_hba.conf /mnt/disks/pgsql/${OLD_PG_VERSION}/db/pg_hba.conf.bak;
    # Update old postgres configurations
    echo 'local      all           all                      trust' >> /mnt/disks/pgsql/${OLD_PG_VERSION}/db/pg_hba.conf;
    echo 'host       all           all      127.0.0.1/32    trust' >> /mnt/disks/pgsql/${OLD_PG_VERSION}/db/pg_hba.conf
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  11. 修改新数据库集群中的 pg_hba.conf,为升级流程提供所需的权限和连接。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    rm $POST_UPGRADE_DATA_DIR/pg_hba.conf;
    echo 'local      all           all                      trust' >> $POST_UPGRADE_DATA_DIR/pg_hba.conf;
    echo 'host       all           all      127.0.0.1/32    trust' >> $POST_UPGRADE_DATA_DIR/pg_hba.conf;
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  12. 检查是否符合升级条件。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    cd /mnt/disks/pgsql;
    
    # Make sure postgres is stopped
    supervisorctl.par stop postgres;
    
    # Check to verify that data can be upgraded.
    pg_upgrade -U alloydbadmin --check -b /mnt/disks/pgsql/${OLD_PG_VERSION}/bin -B /usr/lib/postgresql/${NEW_PG_VERSION}/bin -d /mnt/disks/pgsql/${OLD_PG_VERSION}/db -D $POST_UPGRADE_DATA_DIR --link -v;
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  13. 执行数据库升级。

    kubectl exec -i POD_NAME -n NAMESPACE -c database -- /bin/bash -c "
    cd /mnt/disks/pgsql;
    pg_upgrade -U alloydbadmin -b /mnt/disks/pgsql/${OLD_PG_VERSION}/bin -B /usr/lib/postgresql/${NEW_PG_VERSION}/bin -d /mnt/disks/pgsql/${OLD_PG_VERSION}/db -D $POST_UPGRADE_DATA_DIR --link -v;
    
    # Recover old cluster configurations
    cp /mnt/disks/pgsql/${OLD_PG_VERSION}/db/pg_hba.conf.bak $POST_UPGRADE_DATA_DIR/pg_hba.conf;
    cp -r /mnt/disks/pgsql/${OLD_PG_VERSION}/db/postgresql.conf $POST_UPGRADE_DATA_DIR/.;
    cp -r /mnt/disks/pgsql/${OLD_PG_VERSION}/db/postgresql.conf.d $POST_UPGRADE_DATA_DIR/.;
    cp -r /mnt/disks/pgsql/${OLD_PG_VERSION}/db/parambackup $POST_UPGRADE_DATA_DIR/.;
    
    # Start postgres
    supervisorctl.par start postgres;
    
    # Clean up backup data
    rm -fr /mnt/disks/pgsql/${OLD_PG_VERSION}/
    "
    

    执行以下变量替换操作:

    • POD_NAME:您的 Pod 的名称。
    • NAMESPACE:数据库集群的命名空间。
  14. 成功升级后,请从数据库集群中移除手动版本升级注解。

    kubectl annotate dbclusters.alloydbomni.dbadmin.goog NAME -n NAMESPACE dbs.dbadmin.goog.com/manualmvu-
    

    执行以下变量替换操作:

    • NAME:您的数据库集群的名称。
    • NAMESPACE:数据库集群的命名空间。
  15. 恢复正常运维状态,并重新启用您在第 1-3 步中停用的所有备份、备份方案或复制过程。