
点击蓝字关注我们
可以使用EDB Postgres for Kubernetes的持续物理备份和WAL归档功能在线备份PostgreSQL集群。可以随时从系统中的第一个备份恢复数据库(无需停机)。
备份是从集群中的主实例或指定主实例进行的。
可以使用Barman工具编排持续备份的基础架构。备份将以tar格式提供。基础备份和WAL文件可以被压缩和加密。
可以将备份文件归档到Barman云基础设施支持的任何服务中。
AWS S3
Microsoft Azure Blob Storage
Google Cloud Storage
备份前的先决条件
为了备份任何集群,首先必须为集群设置存储,以便归档备份文件和WAL文件。
请求访问Amazon AWS。
创建IAM角色,并生成ACCESS_KEY_ID和ACCESS_SECRET_KEY。
ACCESS_KEY_ID:用于将文件上传到S3的访问密钥ID
ACCESS_SECRET_KEY:上述访问密钥的密码
创建一个存储桶并授予其访问外部应用程序的权限。需要以下完整权限:
“s3:AbortMultipartUpload”
“s3:DeleteObject”
“s3:GetObject”
“s3:ListBucket”
“s3:PutObject”
“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_ID: 20 bytes
ACCESS_SECRET_KEY: 40 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 微信群 |

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