A Seamless Upgrade: Cloud-Native PostgreSQL Database Version 15 to 16

A Seamless Upgrade: Cloud-Native PostgreSQL Database Version 15 to 16

January 12, 2024

Introduction

In the ever-evolving landscape of cloud-native technologies, staying up-to-date with the latest software versions is crucial for ensuring optimal performance, security, and access to new features. This blog post will guide you through the process of upgrading a PostgreSQL database instance from version 15 to version 16 in a cloud-native environment.

Before You Begin

Before diving into the upgrade process, it’s essential to perform a few preliminary steps to ensure a smooth transition:

Backup Your Database

Begin by creating a comprehensive backup of your PostgreSQL database. This step is critical in case anything goes wrong during the upgrade process, allowing you to restore your database to its previous state.

Check Compatibility

Verify that your applications and any other dependencies are compatible with PostgreSQL 16. Review release notes and documentation to identify any potential issues that may arise.

Update Extensions and Dependencies

Make sure that all extensions and dependencies are compatible with PostgreSQL 16. Update them as needed to avoid compatibility issues after the upgrade.

Upgrading Cloud-Native PostgreSQL Database

Review Release Notes

Start by carefully reviewing the release notes for PostgreSQL 16. Take note of any changes, new features, and potential issues that may affect your database.

Stop Database Activity

Before initiating the upgrade, stop all database activity to prevent any data inconsistencies or corruption during the process. Notify users in advance to minimize disruptions.

Upgrading PostgreSQL Cluster

This post doesn’t cover in-place upgrades; instead, it will require you to spin a newer postgresql cluster with version 16 and bootstrap from another cluster.

  • Use the new Postgres version 16 as the cluster image

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: upgrade-cluster-16
    spec:
      instances: 3
      imageName: ghcr.io/cloudnative-pg/postgresql:16.1-13
  • Add external cluster configuration to perform a monolith import using the version 15 cluster as the connection parameters.

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: upgrade-cluster-16
    spec:
      instances: 3
      imageName: ghcr.io/cloudnative-pg/postgresql:16.1-13
      externalClusters:
        - name: cluster-pg96
          connectionParameters:
            # Use the correct IP or host name for the source database
            host: pg96.local
            user: postgres
            dbname: postgres
          password:
            name: cluster-pg96-superuser
            key: password
  • Configure bootstrap source with cluster name from above

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: upgrade-cluster-16
    spec:
      instances: 3
      imageName: ghcr.io/cloudnative-pg/postgresql:16.1-13
      externalClusters:
        - name: cluster-pg96
          connectionParameters:
            # Use the correct IP or host name for the source database
            host: pg96.local
            user: postgres
            dbname: postgres
          password:
            name: cluster-pg96-superuser
            key: password
      bootstrap:
        initdb:
          import:
            type: monolith
            databases:
              - "*"
            roles:
              - "*"
            source:
              externalCluster: cluster-pg96
  • Add configuration to perform backup after the bootstrap import to an object store

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: upgrade-cluster-16
    spec:
      instances: 3
      imageName: ghcr.io/cloudnative-pg/postgresql:16.1-13
      externalClusters:
        - name: cluster-pg96
          connectionParameters:
            # Use the correct IP or host name for the source database
            host: pg96.local
            user: postgres
            dbname: postgres
          password:
            name: cluster-pg96-superuser
            key: password
      bootstrap:
        initdb:
          import:
            type: monolith
            databases:
              - "*"
            roles:
              - "*"
            source:
              externalCluster: cluster-pg96
      backup:
        barmanObjectStore:
          destinationPath: "<destination path here>"
          serverName: upgrade-cluster-16
          s3Credentials:
            accessKeyId:
              name: aws-creds
              key: ACCESS_KEY_ID
            secretAccessKey:
              name: aws-creds
              key: ACCESS_SECRET_KEY
        retentionPolicy: "30d"
  • Apply changes to the cluster and wait for the cluster to be in a healthy state

    kubectl apply -f upgrade-cluster-16.yaml
  • Finally, swap the bootstrap recovery source to the new backup generated from earlier steps

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: main
    spec:
      instances: 3
      imageName: ghcr.io/cloudnative-pg/postgresql:16.1-13
      bootstrap:
        recovery:
          source: upgrade-cluster-16
  • Delete the cluster created in steps 1-4

    kubectl delete -f upgrade-cluster-16.yaml

Conclusion

Upgrading a cloud-native PostgreSQL database instance from version 15 to 16 requires careful planning and execution. By following the steps outlined in this blog post, you can ensure a seamless transition, taking advantage of the latest features and improvements while maintaining the integrity of your data. Keep in mind that each cloud provider may have specific guidelines or tools for managing PostgreSQL upgrades, so consult their documentation for additional guidance.

Last updated on