PIGSTY

备份策略

根据您的需求设计备份策略。

  • 何时:备份策略
  • 何地:备份仓库
  • 如何:备份方法

何时备份

第一个问题是何时备份您的数据库——在备份频率和恢复时间之间做权衡。 由于您需要回放 WAL 日志到从上次备份以来的恢复目标, 备份越频繁,需要回放的 WAL 日志就越少,恢复就越快。

每日全量备份

对于生产数据库,建议从最简单的每日全量备份策略开始。 这是 Pigsty 中的默认备份策略,通过 crontab 实现。

每日凌晨1点全量备份
node_crontab: [ '00 01 * * * postgres /pg/bin/pg-backup full' ]
pgbackrest_method: local          # 选择备份仓库方法,`local` 或 `minio` 或任何其他用户定义的仓库
pgbackrest_repo:                  # pgbackrest 仓库:https://pgbackrest.org/configuration.html#section-repository
  local:                          # 使用本地 POSIX 文件系统的默认 pgbackrest 仓库
    path: /pg/backup              # 本地备份目录,默认为 `/pg/backup`
    retention_full_type: count    # 按数量保留全量备份
    retention_full: 2             # 保留 2 个,使用本地文件系统仓库时最多 3 个全量备份

当使用默认的 local 文件系统备份仓库时,它提供 24~48 小时的恢复窗口。

假设您的数据库大小为 100GB,每天写入 10GB,您的备份大小将是:

它将消耗数据库大小的 2 ~ 3 倍,加上 2 天的 WAL。 因此在实践中,您可能需要准备至少数据库大小 3 ~ 5 倍 的备份磁盘 来使用默认备份策略。

全量 + 增量备份

您可以通过更改这些参数来优化备份空间使用。

如果您使用 MinIO / S3 作为集中式备份仓库,您可以使用比磁盘限制更多的空间。 那么考虑使用 2 周保留策略的全量 + 增量备份:

node_crontab:  # 周一凌晨 1 点进行全量备份,工作日进行增量备份
  - '00 01 * * 1 postgres /pg/bin/pg-backup full'
  - '00 01 * * 2,3,4,5,6,7 postgres /pg/bin/pg-backup'
pgbackrest_method: minio
pgbackrest_repo:                  # pgbackrest 仓库:https://pgbackrest.org/configuration.html#section-repository
  minio:                          # pgbackrest 的可选 minio 仓库
    type: s3                      # minio 兼容 s3,所以使用 s3
    s3_endpoint: sss.pigsty       # minio 端点域名,默认为 `sss.pigsty`
    s3_region: us-east-1          # minio 区域,默认为 us-east-1,对 minio 无用
    s3_bucket: pgsql              # minio 存储桶名称,默认为 `pgsql`
    s3_key: pgbackrest            # pgbackrest 的 minio 用户访问密钥
    s3_key_secret: S3User.Backup  # pgbackrest 的 minio 用户秘密密钥
    s3_uri_style: path            # 对 minio 使用路径样式 URI 而不是主机样式
    path: /pgbackrest             # minio 备份路径,默认为 `/pgbackrest`
    storage_port: 9000            # minio 端口,默认为 9000
    storage_ca_file: /etc/pki/ca.crt  # minio ca 文件路径,默认为 `/etc/pki/ca.crt`
    block: y                      # 启用块增量备份
    bundle: y                     # 将小文件打包成单个文件
    bundle_limit: 20MiB           # 文件包的限制,对象存储为 20MiB
    bundle_size: 128MiB           # 文件包的目标大小,对象存储为 128MiB
    cipher_type: aes-256-cbc      # 为远程备份仓库启用 AES 加密
    cipher_pass: pgBackRest       # AES 加密密码,默认为 'pgBackRest'
    retention_full_type: time     # 在 minio 仓库上按时间保留全量备份
    retention_full: 14            # 保留最近 14 天的全量备份

当使用内置的 minio 文件系统备份仓库时,它提供有保证的 1 周 PITR 窗口。

假设您的数据库大小为 100GB,每天写入 10GB,您的备份大小将如下所示:


备份位置

默认情况下,Pigsty 有两个默认备份仓库定义:localminio 备份仓库。

  • local默认,使用本地 /pg/backup 目录(软链接指向 pg_fs_backup/data/backups
  • minio:使用 SNSD 1 节点 MinIO 集群(由 Pigsty 支持,但默认未启用)
pgbackrest_method: local          # 选择备份仓库方法,`local` 或 `minio` 或任何其他用户定义的仓库
pgbackrest_repo:                  # pgbackrest 仓库:https://pgbackrest.org/configuration.html#section-repository
  local:                          # 使用本地 POSIX 文件系统的默认 pgbackrest 仓库
    path: /pg/backup              # 本地备份目录,默认为 `/pg/backup`
    retention_full_type: count    # 按数量保留全量备份
    retention_full: 2             # 保留 2 个,使用本地文件系统仓库时最多 3 个全量备份
  minio:                          # pgbackrest 的可选 minio 仓库
    type: s3                      # minio 兼容 s3,所以使用 s3
    s3_endpoint: sss.pigsty       # minio 端点域名,默认为 `sss.pigsty`
    s3_region: us-east-1          # minio 区域,默认为 us-east-1,对 minio 无用
    s3_bucket: pgsql              # minio 存储桶名称,默认为 `pgsql`
    s3_key: pgbackrest            # pgbackrest 的 minio 用户访问密钥
    s3_key_secret: S3User.Backup  # pgbackrest 的 minio 用户秘密密钥
    s3_uri_style: path            # 对 minio 使用路径样式 URI 而不是主机样式
    path: /pgbackrest             # minio 备份路径,默认为 `/pgbackrest`
    storage_port: 9000            # minio 端口,默认为 9000
    storage_ca_file: /etc/pki/ca.crt  # minio ca 文件路径,默认为 `/etc/pki/ca.crt`
    block: y                      # 启用块增量备份
    bundle: y                     # 将小文件打包成单个文件
    bundle_limit: 20MiB           # 文件包的限制,对象存储为 20MiB
    bundle_size: 128MiB           # 文件包的目标大小,对象存储为 128MiB
    cipher_type: aes-256-cbc      # 为远程备份仓库启用 AES 加密
    cipher_pass: pgBackRest       # AES 加密密码,默认为 'pgBackRest'
    retention_full_type: time     # 在 minio 仓库上按时间保留全量备份
    retention_full: 14            # 保留最近 14 天的全量备份