使用 pgBackRest 备份和恢复数据

选择文档版本:

配置开源数据库备份 和恢复解决方案 pgBackRest,以保护您的数据。AlloyDB Omni 将 pgBackRest 与 Cloud Storage 搭配使用。AlloyDB Omni 编排器通过 alloydbctl 和 Ansible 与 pgBackRest 和 Cloud Storage 进行交互,以管理备份。

AlloyDB Omni 通过自定义资源定义 (CRD) 管理备份:

  • BackupPlan:每个数据库集群都可以有一个或多个具有不同配置和时间表的 BackupPlan CRD。
  • Backup:根据您的 BackupPlan CRD 启动备份。

准备工作

在设置和配置 pgBackRest 之前,请确保您拥有以下内容:

创建备份方案

如需创建备份方案,请完成以下步骤:

  1. 使用以下格式创建 BackupPlan CRD:

    BackupPlan:
      metadata:
        name: BACKUP_PLAN_NAME
      spec:
        dbclusterRef: DBCLUSTER_NAME
        backupLocation:
          type: GCS
          gcsOptions:
            bucket: BUCKET_NAME
            key: BUCKET_FOLDER
    

    执行以下变量替换操作:

    • BACKUP_PLAN_NAME:此 BackupPlan CRD 的名称。例如,my-backup-plan-1

    • DBCLUSTER_NAME: 您在 创建集群中定义的数据库集群的名称。

    • BUCKET_NAME:您在 准备工作中创建的 Cloud Storage 存储桶的名称。

    • BUCKET_FOLDER:Cloud Storage 中备份应写入的目录的路径。您必须提供以 / 开头的绝对路径。

  2. 如果您使用的是 Ansible,请为您的 BackupPlan CRD 创建一个策略方案。

    - name: BACKUP_PLAN_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
        ansible_become: true
      roles:
        - role: google.alloydbomni_orchestrator.backup
    

    执行以下变量替换操作:

    • BACKUP_PLAN_PLAYBOOK_NAME:Ansible 策略方案的名称。例如,My BackupPlan

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  3. 应用 BackupPlan 资源。

    alloydbctl

    alloydbctl apply -d "DEPLOYMENT_SPEC" -r "BACKUP_PLAN_CRD"

    执行以下变量替换操作:

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_PLAN_CRD:您在第一步中创建的 BackupPlan CRD 的路径。

    Ansible

    ansible-playbook BACKUP_PLAN_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="BACKUP_PLAN_CRD"

    执行以下变量替换操作:

    • BACKUP_PLAN_PLAYBOOK:您在第二步中为 BackupPlan CRD 创建的策略方案的路径。

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_PLAN_CRD:您在第一步中创建的 BackupPlan CRD 的路径。

  4. 确认 BackupPlan CRD 的状态字段 status.phaseReady。如果 CRD 未准备就绪,请等待其准备就绪。

    alloydbctl

    alloydbctl get -d "DEPLOYMENT_SPEC" -t BackupPlan -n BACKUP_PLAN_NAME -o yaml

    Ansible

    ansible-playbook status.yaml -i "DEPLOYMENT_SPEC" -e resource_type=BackupPlan \
      -e resource_name=BACKUP_PLAN_NAME

删除备份方案

如需删除备份方案,请使用以下任一方法:

alloydbctl

alloydbctl delete -d "DEPLOYMENT_SPEC" -t BackupPlan -n BACKUP_PLAN_NAME

执行以下变量替换操作:

  • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

  • BACKUP_PLAN_NAME:要删除的 BackupPlan CRD 的名称。

Ansible

  1. 创建一个用于删除 BackupPlan CRD 的策略方案。

    - name: BACKUP_PLAN_DELETE_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
        ansible_become: true
      roles:
        - role: google.alloydbomni_orchestrator.delete
    

    执行以下变量替换操作:

    • BACKUP_PLAN_DELETE_PLAYBOOK_NAME:Ansible 策略方案的名称。

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  2. 运行 ansible-playbook 以删除 BackupPlan CRD。

    ansible-playbook BACKUP_PLAN_DELETE_PLAYBOOK_NAME -i "DEPLOYMENT_SPEC" -e resource_type=BackupPlan \
      -e resource_name=BACKUP_PLAN_NAME

    执行以下变量替换操作:

    • BACKUP_PLAN_DELETE_PLAYBOOK_NAME:您在上一步中为删除 BackupPlan CRD 而创建的策略方案的路径。

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_PLAN_NAME:要删除的 BackupPlan CRD 的名称。

创建备份

如需创建和启动备份,请完成以下步骤:

  1. 使用以下格式创建 Backup CRD:

    Backup:
      metadata:
        name: BACKUP_NAME
      spec:
        backupPlanRef: BACKUP_PLAN_NAME
        dbclusterRef: DBCLUSTER_NAME
    

    执行以下变量替换操作:

    • BACKUP_NAME:此 Backup CRD 的名称。例如,my-backup-1

    • BACKUP_PLAN_NAME:此 BackupPlan CRD 的名称。例如,my-backup-plan-1

    • DBCLUSTER_NAME: 您在 创建集群中定义的数据库集群的名称。

  2. 如果您使用的是 Ansible,请为您的 Backup CRD 创建一个策略方案。

    - name: BACKUP_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
        ansible_become: true
      roles:
        - role: google.alloydbomni_orchestrator.backup
    

    执行以下变量替换操作:

    • BACKUP_PLAYBOOK_NAME:Ansible 策略方案的名称。例如,My Backup

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  3. 应用 Backup CRD。

    alloydbctl

    alloydbctl apply -d "DEPLOYMENT_SPEC" -r "BACKUP_CRD"

    执行以下变量替换操作:

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_CRD:您在第一步中创建的 Backup CRD 的路径。

    Ansible

    ansible-playbook BACKUP_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="BACKUP_CRD"

    执行以下变量替换操作:

    • BACKUP_PLAYBOOK:您在第二步中为 Backup CRD 创建的策略方案的路径。

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_CRD:您在第一步中创建的 Backup CRD 的路径。

  4. 确认 Backup CRD 的状态字段 status.phaseSucceeded。如果 CRD 未成功,请等待其成功。

    alloydbctl

    alloydbctl get -d "DEPLOYMENT_SPEC" -t Backup -n BACKUP_NAME -o yaml

    Ansible

    ansible-playbook status.yaml -i "DEPLOYMENT_SPEC" -e resource_type=Backup \
      -e resource_name=BACKUP_NAME
  5. 通过在存储桶中搜索/backup/db,确认备份文件已存放在 Cloud Storage 存储桶中 。

删除备份

如需删除备份,请运行以下命令之一:

alloydbctl

alloydbctl delete -d "DEPLOYMENT_SPEC" -t Backup -n BACKUP_NAME

执行以下变量替换操作:

  • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

  • BACKUP_NAME:要删除的 Backup CRD 的名称。

Ansible

  1. 创建一个用于删除 Backup CRD 的策略方案。

    - name: BACKUP_DELETE_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
        ansible_become: true
      roles:
        - role: google.alloydbomni_orchestrator.delete
    

    执行以下变量替换操作:

    • Delete Backup:Ansible 策略方案的名称。

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  2. 运行 ansible-playbook 以删除 Backup CRD。

    ansible-playbook DELETE_BACKUP_PLAYBOOK -i "DEPLOYMENT_SPEC" -e resource_type=Backup \
      -e resource_name=BACKUP_NAME

    执行以下变量替换操作:

    • DELETE_BACKUP_PLAYBOOK:您在上一步中为删除 Backup CRD 而创建的策略方案的路径。

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • BACKUP_NAME:要删除的 Backup CRD 的名称。

使用备份进行恢复

如需将备份中的数据恢复到数据库集群中,请完成以下任一组说明:

高可用性集群

如需为高可用性数据库集群恢复数据,请完成以下说明:

  1. 如果 DBCluster 规范文件中将 availability.enableAutoFailoveravailability.enableAutoHeal 设置为 true,请将其设置为 false

    DBCluster:
      metadata: my-db-cluster
        name:
      spec:
        databaseVersion: 18.1.0
        mode: ""
        availability:
          ...
          enableAutoFailover: false
          enableAutoHeal: false
          ...
    
  2. 通过显示每个数据库节点上的 db-role 文件的内容来识别主节点。主节点包含 DATABASE_ROLE_PRIMARY

    sudo cat /var/lib/alloydbomni/nm/kvstore/db-role

    如需为多个节点自动执行此过程并将结果输出到控制节点,请参阅以下 Shell 脚本。

    SSH_USER=SSH_USER
    DB_NODES="DB_NODES"
    SSH_OPTIONS="SSH_OPTIONS"
    DB_ROLE=/var/lib/alloydbomni/nm/kvstore/db-role
    
    for node in $DB_NODES; do
      ssh $SSH_OPTIONS ${SSH_USER}@${node} "hostname ; sudo cat ${DB_ROLE}; echo"
    done
    

    执行以下变量替换操作:

    • SSH_USER:用于连接到数据库节点的 SSH 用户。
    • DB_NODES:以空格分隔的数据库节点的主机名或 IP 地址列表。
    • SSH_OPTIONS:用于连接到数据库节点的 SSH 选项。例如, "-o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=5"
  3. 停止所有数据库节点上的 AlloyDB Omni 服务。

    sudo systemctl stop alloydbomni18
  4. 在每个备用节点上,删除数据目录的内容。

    sudo rm -rf PGDATA_DIR

    PGDATA_DIR 替换为数据目录的路径。这是在名称为 DataDiskDBCluster 资源的 primarySpec.resources.disks 字段中定义的值。

  5. 在主节点上,执行 pgbackrest 命令以从备份恢复。该示例展示了如何通过切换到 postgres 用户来执行。

    sudo -u postgres pgbackrest restore \
      --log-level-console=info \
      --stanza=db \
      --delta \
      --target-action=promote \
      --type=immediate \
      --set=BACKUP_ID

    BACKUP_ID 替换为备份标识符。您可以在 Backup CRD 的 status.backupID 字段中找到此值。

  6. 在主节点上启动 AlloyDB Omni 服务。

    sudo systemctl start alloydbomni18
  7. 确认 AlloyDB Omni 服务状态为 active。如果未处于活跃状态,请等待其处于活跃状态。

    sudo systemctl status alloydbomni18
  8. 通过从 PGDATA_DIR/PG_VERSION/db/postgresql.auto.conf 中移除以下 GUC,在主节点上重置这些 GUC:

    • restore_command
    • recovery_target
    • recovery_target_action
    • recovery_target_timeline
    sudo sed -i '/^\(restore_command\|recovery_target\|recovery_target_action\|recovery_target_timeline\)/d' PGDATA_DIR/PG_VERSION/db/postgresql.auto.conf

    执行以下变量替换操作:

    • PGDATA_DIR 替换为数据目录的路径。这是在名称为 DataDiskDBCluster 资源的 primarySpec.resources.disks 字段中定义的值。
    • PG_VERSION 替换为 AlloyDB Omni 安装的主要 PostgreSQL 版本,例如 18
  9. availability.enableAutoFailoveravailability.enableAutoHeal 更新为 true,以恢复备用节点上的数据库服务,使其处于活跃状态并与主节点上的数据库服务同步。

  10. 确认每个备用节点上的 AlloyDB Omni 服务处于 active 状态。

独立集群

  1. 停止 AlloyDB Omni 服务并屏蔽它,以防止重启。

    sudo systemctl stop alloydbomni18
    sudo systemctl mask alloydbomni18
  2. 运行 pgbackrest 命令以从备份恢复。

    sudo -u postgres pgbackrest restore \
      --log-level-console=info \
      --stanza=db \
      --delta \
      --target-action=promote \
      --type=immediate \
      --set=BACKUP_ID

    BACKUP_ID 替换为备份标识符。

  3. 取消屏蔽并启动 AlloyDB Omni 服务。

    sudo systemctl unmask alloydbomni18
    sudo systemctl start alloydbomni18
  4. 验证服务是否正在运行。

    sudo systemctl status alloydbomni18

限制

存在以下限制:

  • 仅支持 Cloud Storage 存储分区来备份数据和从中恢复数据。

  • Backup CRD 支持创建类型为 "full" 的备份。不支持其他类型,即 "incr""diff"

  • 不支持计划备份。如需配置计划备份,请使用您选择的自动化系统自动创建 Backup 规范。

  • 不支持自动恢复。您必须按照手动说明恢复数据。

  • 如需删除备份,请删除 Backup CRD。

  • 删除 BackupPlan CRD 不会删除该方案已创建的 Backup CRD。如需移除这些备份,请按照删除备份中所述,单独删除每个Backup 资源。