为 AlloyDB Omni 设置 pgBackRest

本页面介绍了如何通过将 AlloyDB Omni 配置为与开源数据库备份服务器 pgBackRest 配合使用,来保护数据。

如需了解基于 Kubernetes 的信息,请参阅在 Kubernetes 中备份和恢复

如需详细了解 pgBackRest,请参阅用户指南

准备工作

在将 AlloyDB Omni 配置为与 pgBackRest 配合使用之前,完成以下前提条件:

具有本地备份的基本配置

本部分中的步骤将引导您完成 pgBackRest 的基本设置。基本配置不支持按时间表备份。如需了解详情,请参阅设置预定备份

由于 pgBackRest 是一款与 AlloyDB Omni 兼容的灵活第三方产品,因此您可以根据自己的需求和偏好适当修改其中的任何步骤。

将备份卷装载到容器

出于组织目的,我们强烈建议您为 pgBackRest 备份创建和装载单独的卷。如需设置新卷,请完成以下步骤:

  1. 如果您的容器正在运行,请将其停止并移除。

    Docker

    docker stop CONTAINER_NAME
    docker rm CONTAINER_NAME

    Docker

    docker stop CONTAINER_NAME
    docker rm CONTAINER_NAME

    Podman

    podman stop CONTAINER_NAME
    podman rm CONTAINER_NAME

    Podman

    podman stop CONTAINER_NAME
    podman rm CONTAINER_NAME

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  2. 在容器的文件系统中创建一个备份目录。

    Docker

    mkdir -p BACKUP_DIR
    

    Docker

    mkdir -p BACKUP_DIR
    

    Podman

    mkdir -p BACKUP_DIR
    

    Podman

    mkdir -p BACKUP_DIR
    

    执行以下变量替换操作:

    • BACKUP_DIR:将存储备份的主机目录。
  3. 使用新的备份卷重新创建容器。

    Docker

    docker run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    google/alloydbomni:latest
    

    Docker

    docker run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    google/alloydbomni:latest
    

    Podman

    podman run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    docker.io/google/alloydbomni:latest
    

    Podman

    podman run -d --name CONTAINER_NAME \
    -e POSTGRES_PASSWORD=NEW_PASSWORD \
    -v DATA_DIR:/var/lib/postgresql/data \
    -v BACKUP_DIR:/var/lib/postgresql/backups \
    -p HOST_PORT:5432 \
    --restart=always \
    docker.io/google/alloydbomni:latest
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
    • NEW_PASSWORD:在创建新容器的 postgres 用户后分配给该用户的密码。请注意,只有当 DATA_DIR 是新位置时,NEW_PASSWORD 才会设置新密码。
    • DATA_DIR:存储数据的主机目录路径。
    • DATA_DIR:存储数据的主机目录路径。
    • BACKUP_DIR:将存储备份的主机目录。
    • HOST_PORT:容器应将自己的端口 5432 发布到的宿主机上的 TCP 端口。如需在宿主机上使用 PostgreSQL 默认端口,请指定 5432
  4. 使容器中的备份目录可供 postgres 读取。

    Docker

    docker exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Docker

    docker exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Podman

    podman exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    Podman

    podman exec CONTAINER_NAME chown -R postgres:postgres /var/lib/postgresql/backups
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。

配置本地备份

pgBackRest 会为每个备份创建子目录,并包含一个纯文本清单文件。

pgBackRest 使用术语“节”来指代 PostgreSQL 数据库集群的配置。节名称是任意的,无需与主机服务器、PostgreSQL 集群或数据库名称匹配。pgBackRest 文档建议在集群的函数后面命名节。

存储库是写入备份的位置。pgBackRest 支持在给定节中写入多个存储库。与存储库相关的大多数配置参数都使用数字值编入索引。例如 repo1-。与 PostgreSQL 集群相关的参数也会单独编入索引。例如 pg1-

pgBackRest 利用名为 pgbackrest.conf 的配置文件来存储全局参数和特定于节的参数。

如需构建和初始化用于备份 AlloyDB Omni 集群的配置文件,请在您在将备份卷装载到容器中创建的主机端备份目录中创建 pgbackrest.conf 文件。

[global]
# Paths (all mandatory):
repo1-path=/var/lib/postgresql/backups
spool-path=/var/lib/postgresql/backups/spool
lock-path=/var/lib/postgresql/backups

# Retention details:
repo1-retention-full=3
repo1-retention-full-type=count
repo1-retention-diff=16

# Force a checkpoint to start backup immediately:
start-fast=y

# Logging parameters:
log-path=/var/lib/postgresql/backups
log-level-console=info
log-level-file=info

# Recommended ZSTD compression:
compress-type=zst

# Other performance parameters:
archive-async=y
archive-push-queue-max=1024MB
archive-get-queue-max=256MB
archive-missing-retry=y

[global:archive-push]
process-max=2

[global:archive-get]
process-max=2

[omni]
pg1-user=postgres
pg1-socket-path=/tmp
pg1-path=/var/lib/postgresql/data

某些参数是必需的,但其他参数可根据需要进行调整,以满足您的特定要求,例如:

  • repo1-path:备份写入的目录位置。我们建议选择一个对主机服务器和容器都可见的位置。

  • log-path:日志文件写入的目录位置。如果您想将日志文件写入单独的位置,而不是与备份本身混合在一起,请调整此参数。

  • repo1-retention-full:要保留的完整备份数量。

  • repo1-retention-full-type:保留是按数量还是按时间段(天)来衡量。

  • repo1-retention-diff:要保留的差分备份数量。

配置文件中与 AlloyDB Omni 兼容的其他非关键但建议的参数设置包括:

  • log-level-console:运行 pgBackup 命令时写入屏幕 (STDOUT) 的日志记录级别。您可以在配置文件中调整此值以满足您的需求,也可以使用 --log-level-console 命令行参数替换此值。默认值为 warn

  • start-fast:强制检查点快速启动备份。默认值为 n

  • archive-async:异步推送 WAL 段文件,以提高性能。默认值为 n

  • process-max:用于压缩和传输的进程数上限。在主集群上,此值通常设置为 max_cpu/4;在备用集群上,此值通常设置为 max_cpu/2。默认值为 1

  • compress-type:要使用的压缩算法。默认值为 gz

还有许多其他 pgBackRest 配置参数,可以进行调整。本文档仅涵盖默认 AlloyDB Omni 配置所需的参数以及一些建议的参数设置。如需配置参数的完整列表,请参阅 pgBackRest 配置参考在线文档。

配置 pgBackRest 后,必须通过创建节来初始化写入备份的目标存储库,该节会使用配置文件中设置的参数。

如需对备份配置数据库,请完成以下步骤:

  1. 使用 stanza-create 命令创建节。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni stanza-create
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  2. 对备份配置数据库。

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "ALTER SYSTEM SET archive_command='pgbackrest --config-path=/var/lib/postgresql/backups --stanza=omni archive-push %p';" \
    -c "ALTER SYSTEM SET archive_mode=on;" \
    -c "ALTER SYSTEM SET max_wal_senders=10;" \
    -c "ALTER SYSTEM SET wal_level=replica;"
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  3. 重启容器。

    Docker

    docker restart CONTAINER_NAME
    

    Docker

    docker restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  4. 验证备份配置。

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Docker

    docker exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    Podman

    podman exec -u postgres CONTAINER_NAME psql \
    -c "SELECT name, setting
        FROM pg_catalog.pg_settings
        WHERE name IN ('archive_command',
                       'archive_mode',
                       'max_wal_senders',
                       'wal_level')
        ORDER BY name"
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  5. 执行 pgBackRest 检查。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    check
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。

执行备份

  1. 执行完整备份

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full \
    backup
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full \
    backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full \
    backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=full \
    backup
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  2. 执行差分备份。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff \
    backup
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff \
    backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff \
    backup
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    --type=diff \
    backup
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。
  3. 报告备份。

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    info
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。

设置预定备份

如需设置预定备份,请创建 Cron 作业,以根据需要运行 pgbackrest backup 命令。如需了解详情,请参阅安排备份

自定义配置和远程备份

基本配置正常运行后,您可以使用 pgBackRest 配置参考中记录的选项调整配置文件,以满足您的需求和偏好。

其中包括指定位于远程机器或云端的其他备份存储库。如果您定义了多个存储库,pgBackRest 会将默认备份操作同时写入所有存储库。

例如,pgBackRest 支持将 Cloud Storage 存储桶用作备份存储库,并提供多种相关的配置选项。以下部分演示了使用这些选项的一种方法。

使用 Cloud Storage 的示例配置

本部分中的步骤基于具有本地备份的基本配置中介绍的配置文件。对该文件进行的这些修改会在 Cloud Storage 存储桶中定义第二个备用存储库,并通过 Identity and Access Management (IAM) 进行访问。

此示例中的自动身份验证方式需要在 Compute Engine 虚拟机实例上运行 AlloyDB Omni 集群。如果您未在 Compute Engine 虚拟机实例上运行 AlloyDB Omni,则仍可以使用其他身份验证方法(例如保存到本地文件系统的 Google Cloud 服务账号密钥)将数据备份到 Cloud Storage 存储桶。

如需扩展之前的配置文件以定义基于 Cloud Storage 的 pgBackRest 存储库,请按照以下步骤操作:

  1. 配置存储桶权限,以允许附加到虚拟机实例的服务账号写入存储桶。为此,需要在该服务账号上设置 Storage Object User IAM 角色

  2. 将以下行添加到 pgbackrest.conf 文件的 [global] 部分:

    # Cloud Storage access details:
    repo2-type=gcs
    repo2-gcs-key-type=auto
    repo2-storage-verify-tls=n
    
    # Cloud Storage bucket and path details:
    repo2-gcs-bucket=BUCKET_NAME
    repo2-path=PATH_IN_BUCKET
    
    # Cloud Storage backup retention parameters:
    repo2-retention-full=8
    repo2-retention-full-type=count
    

    执行以下变量替换操作:

    • BUCKET_NAME:您希望 pgBackRest 将备份存储到其中的 Cloud Storage 存储桶的名称。
    • PATH_IN_BUCKET:您希望 pgBackRest 存储备份的 Cloud Storage 存储桶中的目录路径。
  3. 使用 pgbackrest stanza-create 命令初始化基于云的备份位置:

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Docker

    docker exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    Podman

    podman exec -u postgres CONTAINER_NAME pgbackrest \
    --config-path=/var/lib/postgresql/backups \
    --stanza=omni \
    stanza-create
    

    执行以下变量替换操作:

    • CONTAINER_NAME:您为容器使用的名称。

使用 pgbackrest stanza-create 命令初始化 Cloud Storage 存储桶中的备份存储库后,pgBackRest 可能会将备份存储到以下两个位置:

  • 本地文件系统中的位置,在配置文件中的其他位置定义为 repo1-path。如果未在 pgbackrest 命令中指定 --repo,则此为默认位置。

  • Cloud Storage 存储桶,使用此示例设置的 repo2-gcs-bucket 配置指令。如需使用 Cloud Storage 存储桶,请在 pgbackrest 命令中指定 --repo=2

后续步骤