暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在 OpenShift 环境中使用 CLI 方法进行云原生 Postgres 备份

新智锦绣 2025-03-21
7

点击蓝字关注我们



  • 可以使用EDB Postgres for Kubernetes的持续物理备份和WAL归档功能在线备份PostgreSQL集群。可以随时从系统中的第一个备份恢复数据库(无需停机)。

  • 备份是从集群中的主实例或指定主实例进行的。

  • 可以使用Barman工具编排持续备份的基础架构。备份将以tar格式提供。基础备份和WAL文件可以被压缩和加密。

  • 可以将备份文件归档到Barman云基础设施支持的任何服务中。

    1. AWS S3

    2. Microsoft Azure Blob Storage

    3. Google Cloud Storage


备份前的先决条件


为了备份任何集群,首先必须为集群设置存储,以便归档备份文件和WAL文件。

  • 请求访问Amazon AWS。

  • 创建IAM角色,并生成ACCESS_KEY_ID和ACCESS_SECRET_KEY。

    1. ACCESS_KEY_ID:用于将文件上传到S3的访问密钥ID

    2. ACCESS_SECRET_KEY:上述访问密钥的密码

  • 创建一个存储桶并授予其访问外部应用程序的权限。需要以下完整权限:

    1.  “s3:AbortMultipartUpload”

    2. “s3:DeleteObject”

    3.  “s3:GetObject”

    4.  “s3:ListBucket”

    5.  “s3:PutObject”

    6.  “s3:PutObjectTagging”

  • 验证外部来源的访问权限。

上述步骤将根据使用的存储类型有所不同。这里展示了一个使用AWS S3存储桶存储WAL文件和备份的示例。


设置详情


Operator:EDB Postgres for Kubernetes v1.20.1 Storage:AWS S3 Database:PostgreSQL v15.3

步骤1:要定义在S3存储桶中存储备份的权限,需要使用ACCESS_KEY_ID和ACCESS_SECRET_KEY凭据。使用的访问密钥必须具有将文件上传到存储桶的权限。

  • · 因此,必须使用以下命令创建一个包含凭据的Kubernetes secret:

            a. 创建命名空间

    swapnilsuryawanshi@LAPTOP385PNIN ~ % oc create namespace cnp
    namespace/cnp created
    复制

                b. 使用凭据创建Kubernetes secret。

      swapnilsuryawanshi@LAPTOP385PNIN ~ % kubectl create secret generic aws-creds --from-literal=ACCESS_KEY_ID=xxxxxxxxxxxxx --from-literal=ACCESS_SECRET_KEY=xxxxxxxxxxxxx -n cnp
      secret/cnp created
      复制

      注意:将xxxx替换为原始密钥。

                  c. 验证创建的secret。

        swapnilsuryawanshi@LAPTOP385PNIN ~ % oc get secret -n cnp
        NAME TYPE DATA AGE
        aws-creds Opaque 2 18s
        builder-dockercfg-dqxd9 kubernetes.io/dockercfg 1 4m11s
        builder-token-t2g6x kubernetes.io/service-account-token 4 4m12s
        default-dockercfg-rxjx9 kubernetes.io/dockercfg 1 4m11s
        default-token-qq6d7 kubernetes.io/service-account-token 4 4m12s
        deployer-dockercfg-zbcvv kubernetes.io/dockercfg 1 4m11s
        deployer-token-gljct kubernetes.io/service-account-token 4 4m12s


        swapnilsuryawanshi@LAPTOP385PNIN ~ % oc describe secrets/aws-creds -n cnp
        Name: aws-creds
        Namespace: cnp
        Labels: <none>
        Annotations: <none>
        Type: Opaque
        Data
        ====
        ACCESS_KEY_ID20 bytes
        ACCESS_SECRET_KEY40 bytes
        复制

        一旦创建了该secret,可以如下面的示例一样配置集群:

        步骤2:创建集群以测试连续的WAL归档和备份。(这里创建了集群:'cluster-sample')

          apiVersion: postgresql.k8s.enterprisedb.io/v1
          kind: Cluster
          metadata:
            name: cluster-sample
            namespace: cnp
          spec:
            logLevel: info
            startDelay: 30
            stopDelay: 30
            nodeMaintenanceWindow:
              inProgress: false
            reusePVC: true
            backup:
              barmanObjectStore:
                s3Credentials:
                accessKeyId:
                    key: ACCESS_KEY_ID
                    name: aws-creds
                  secretAccessKey:
                    key: ACCESS_SECRET_KEY
                    name: aws-creds
                inheritFromIAMRole: false
                destinationPath: 's3://swapnil-cnpg/CNP/'
                target: prefer-standby
                enableSuperuserAccess: true
            monitoring:
              disableDefaultQueries: false
              enablePodMonitor: false
            minSyncReplicas: 0
            postgresGID: 26
            replicationSlots:
              highAvailability:
                enabled: false
                slotPrefix: _cnp_
                updateInterval: 30
              primaryUpdateMethod: switchover
            bootstrap:
              initdb:
                import:
                  schemaOnly: false
                failoverDelay: 0
            postgresUID: 26
            walStorage:
              resizeInUseVolumes: true
              size: 1Gi
            maxSyncReplicas: 0
            switchoverDelay: 40000000
            storage:
              resizeInUseVolumes: true
              size: 2Gi
            primaryUpdateStrategy: unsupervised
            instances: 1
            imagePullPolicy: Always
          swapnilsuryawanshi@LAPTOP385PNIN ~ % oc apply -f cluster-sample.yaml -n cnp
          cluster.postgresql.k8s.enterprisedb.io/cluster-sample created
          swapnilsuryawanshi@LAPTOP385PNIN ~ %
          复制

          创建集群后的POD片段:cluster-sample:

            swapnilsuryawanshi@LAPTOP385PNIN ~ % oc get pods -n cnp
            NAME READY STATUS RESTARTS AGE
            cluster-sample-1-initdb-qxnb2 0/1 PodInitializing 0 68s
            swapnilsuryawanshi@LAPTOP385PNIN ~ % oc get pods -n cnp
            NAME READY STATUS RESTARTS AGE
            cluster-sample-1 1/1 Running 0 5m22s
            复制

            步骤3:为集群准备备份:cluster-sample。

              swapnilsuryawanshi@LAPTOP385PNIN ~ % cat backup-sample.yaml
              apiVersion: postgresql.k8s.enterprisedb.io/v1
              kind: Backup
              metadata:
                name: backup-sample
                namespace: cnp
              spec:
                cluster:
                  name: cluster-sample
                target: primary
              swapnilsuryawanshi@LAPTOP385PNIN ~ % oc apply -f backup-sample.yaml -n cnp
              backup.postgresql.k8s.enterprisedb.io/backup-sample created
              复制

              cluster-sample创建备份后,备份状态的片段。

                swapnilsuryawanshi@LAPTOP385PNIN ~ % oc get backup -n cnp
                NAME AGE CLUSTER PHASE ERROR
                backup-sample 9s cluster-sample running
                swapnilsuryawanshi@LAPTOP385PNIN ~ % oc get backup -n cnp 
                NAME AGE CLUSTER PHASE ERROR
                backup-sample 3m22s cluster-sample completed
                复制

                还可以验证cluster-sample日志:

                  {"level":"info","ts":"2024-12-21T07:04:10Z","msg":"Backup started","backupName":"backup-sample","backupNamespace":"backup-sample","logging_pod":"cluster-sample-1","options":["--user","postgres","--name","backup-1687331050","--cloud-provider","aws-s3","s3://swapnil-cnpg/CNP/","cluster-sample"]}
                  :
                  :
                  {"level":"info","ts":"2024-12-21T07:05:27Z","msg":"Backup completed","backupName":"backup-sample","backupNamespace":"backup-sample","logging_pod":"cluster-sample-1"}
                  复制

                  步骤4:成功备份后,在存储中验证备份文件和WAL文件:

                    swapnilsuryawanshi@LAPTOP385PNIN ~ % aws s3 ls s3://swapnil-cnpg/ --recursive --human-readable --summarize
                    2024-12-21 10:30:02 0 Bytes CNP/
                    2024-12-21 12:35:28 1.3 KiB CNP/cluster-sample/base/20241221T070412/backup.info
                    2024-12-21 12:34:15 31.0 MiB CNP/cluster-sample/base/20241221T070412/data.tar
                    2024-12-21 12:25:42 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000001
                    2024-12-21 12:30:40 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000002
                    2024-12-21 12:34:15 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000003
                    2024-12-21 12:34:32 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000004
                    2024-12-21 12:34:58 348 Bytes CNP/cluster-sample/wals/0000000100000000/000000010000000000000004.00000028.backup
                    2024-12-21 12:35:00 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000005
                    2024-12-21 12:40:00 16.0 MiB CNP/cluster-sample/wals/0000000100000000/000000010000000000000006
                    Total Objects: 10
                    Total Size: 127.0 MiB
                    swapnilsuryawanshi@LAPTOP385PNIN Downloads % cat backup.info
                    backup_label='START WAL LOCATION: 0/4000028 (file 000000010000000000000004)\nCHECKPOINT LOCATION: 0/4000060\nBACKUP METHOD: streamed\nBACKUP FROM: primary\nSTART TIME: 2024-12-21 07:04:12 UTC\nLABEL: Barman backup cloud 20241221T070412\nSTART TIMELINE: 1\n'
                    backup_name=backup-1687331050
                    begin_offset=40
                    begin_time=2024-12-21 07:04:12.561049+00:00
                    begin_wal=000000010000000000000004
                    begin_xlog=0/4000028
                    compression=None
                    config_file=/var/lib/postgresql/data/pgdata/postgresql.conf
                    copy_stats={'total_time': 73.883539, 'number_of_workers': 2, 'analysis_time': 0, 'analysis_time_per_item': {'data': 0}, 'copy_time_per_item': {'data': 72.09514}, 'serialized_copy_time_per_item': {'data': 50.509505}, 'copy_time': 72.09514, 'serialized_copy_time': 50.509505}
                    deduplicated_size=None
                    end_offset=312
                    end_time=2024-12-21 07:04:14.946463+00:00
                    end_wal=000000010000000000000004
                    end_xlog=0/4000138
                    error=None
                    hba_file=/var/lib/postgresql/data/pgdata/pg_hba.conf
                    ident_file=/var/lib/postgresql/data/pgdata/pg_ident.conf
                    included_files=['/var/lib/postgresql/data/pgdata/custom.conf', '/var/lib/postgresql/data/pgdata/postgresql.auto.conf']
                    mode=None
                    pgdata=/var/lib/postgresql/data/pgdata
                    server_name=cloud
                    size=None
                    status=DONE
                    systemid=7247029303540998162
                    tablespaces=None
                    timeline=1
                    version=150003
                    xlog_segment_size=16777216
                    复制




                    关于公司

                    感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。


                    欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!

                    Elastic 微信群

                    EDB 微信群


                    发现“分享”“赞”了吗,戳我看看吧



                    文章转载自新智锦绣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论