APITable Docs
操作

数据库备份和还原

本文介绍bika 自建 PostgreSQLMongoDB 数据库备份与还原方案

备份工具(默认已安装):

pgBackRest: 使用 (支持全备、增量备份,并可直接备份到 S3)

Percona Backup for MongoDB: PBM,支持全备和增量备份,并可将备份存储到 S3)

备份目标: S3 存储

备份规则: 每天全备一次

还原方式: 从 S3 存储中恢复备份数据

参考:

https://docs.percona.com/percona-operator-for-postgresql/2.0/backups.html

https://docs.percona.com/percona-operator-for-mongodb/backups.html

备份

以minio 作为示例, 确保您的存储有足够的资源来存储备份,这对于大型数据库来说尤其重要。显然,您需要足够的存储空间。

s3准备

创建aws 存储, 生成 ak 和 sk

backup-s3.yaml

---
apiVersion: v1
kind: Secret
metadata:
  name: backup-s3
  annotations:
    for: "mongodb"
type: Opaque
data:
  AWS_ACCESS_KEY_ID: UkVQTEFDRS1XSVRILUFXUy1BQ0NFU1MtS0VZ
  AWS_SECRET_ACCESS_KEY: UkVQTEFDRS1XSVRILUFXUy1TRUNSRVQtS0VZ

---
apiVersion: v1
kind: Secret
metadata:
  name: backup-s3-pgrest
  annotations:
    for: "postgresql"
type: Opaque
data:
  s3.conf: W2dsb2JhbF0KcmVwbzEtczMta2V5PTx5b3VyLWFrPgpyZXBvMS1zMy1rZXktc2VjcmV0PTx5b3VyLXNrPgoKW2dsb2JhbDphcmNoaXZlLWdldF0KcHJvY2Vzcy1tYXg9MgoKW2dsb2JhbDphcmNoaXZlLXB1c2hdCnByb2Nlc3MtbWF4PTQ=
 

您可以使用以下命令从纯文本获取 base64 编码的字符串:

$ echo -n 'plain-text-string' | base64 --wrap=0

编辑完成后,创建 Kubernetes Secret 对象,如下所示:

kubectl apply -f backup-s3.yaml -n bika-app

配置备份

bika-values.yaml 填写备份信息

如下示例已创建每天定时备份任务和备份存储信息


postgres:
  backup:
    enabled: true
    pgbackrest:
      configuration:
        - secret:
            name: backup-s3-pgrest
      repos:
      - name: repo1
        # 默认保留7天备份
        schedules:
          full: "0 0 * * *"
          differential: "0 */6 * * *" 
        s3:
          bucket: "bika-postgresql"
          endpoint: http://minio:9000
          region: "local"
mongo:
  backup:
    enabled: true
    # 开启时间节点备份
    pitr:
      enabled: true
      # Number of minutes between the uploads of oplogs.
      oplogSpanMin: 60 
    tasks:
      - name: "daily-backup"
        enabled: true
        schedule: "0 0 * * *" # 每24小时
        # 默认保留7天备份
        keep: 7  
        storageName: daily-backup-s3
    storages:
      daily-backup-s3:
        type: s3
        s3:
          bucket: bika-db-backup
          region: 'local'
          credentialsSecret: backup-s3
          endpointUrl: http://minio:9000
          prefix: "bika-daily-mongo"

执行配置并生效

helm upgrade --install -f bika-values.yaml  bika-release oci://registry-1.docker.io/vikadata/bika-helm-chart -n bika-app

执行手动备份(可选)

备份postgres

要手动进行按需备份,您需要一个备份配置文件。您可以使用备份配置文件 backup-pg.yaml 的示例:

apiVersion: pgv2.percona.com/v2
kind: PerconaPGBackup
metadata:
  name: backup-full-1
spec:
  pgCluster: bika-pg
  repoName: repo1
  options:
  - --type=full
  1. 开始之前,请确保您已配置备份存储。

  2. 在 backup-pg.yaml 配置文件中,指定集群名称和用于备份的存储库名称。存储库名称必须与您在备份存储配置中定义的名称相同。它还必须与 bika-values.yaml 文件的 postgres.backups.pgbackrest.repos 子节中指定的存储库名称匹配。

  3. 如果需要,您可以添加任何 pgBackRest 命令行选项。

  4. 使用以下命令进行备份(如果您的数据库集群位于不同的命名空间中,请修改 -n bika-app 参数):

kubectl apply -f deploy/backup-pg.yaml -n bika-app
  1. 备份需要时间。您可以使用 kubectl get pg-backup 命令跟踪该过程。完成后,备份应获得成功状态:

    kubectl get pg-backup backup-full-1 -n bika-app

当备份过程结束时,它应该显示为 Succeeded 状态。

备份mongodb

要手动进行按需备份,您需要一个备份配置文件。您可以使用备份配置文件 backup-mongo.yaml 的示例:

apiVersion: psmdb.percona.com/v1
kind: PerconaServerMongoDBBackup
metadata:
  finalizers:
  - percona.com/delete-backup
  name: backup-full-1
spec:
  clusterName: bika-mongo
  storageName: daily-backup-s3
  type: logical
  1. 开始之前,请确保您已配置备份存储。

  2. 在 backup-pg.yaml 配置文件中,指定集群名称和用于备份的存储库名称。存储库名称必须与您在备份存储配置中定义的名称相同。它还必须与 bika-values.yaml 文件的 mongodb.backup.storages 子节中指定的存储库名称匹配。

  3. 使用以下命令进行备份(如果您的数据库集群位于不同的命名空间中,请修改 -n bika-app 参数):

kubectl apply -f deploy/backup-mongo.yaml -n bika-app
  1. 备份需要时间。您可以使用 kubectl get pg-backup 命令跟踪该过程。完成后,备份应获得成功状态:

    kubectl get psmdb-backup backup-full-1 -n bika-app

注: 当备份过程结束时,它应该显示为 READY 状态。

还原

还原postgres

该操作员支持对 PostgreSQL 集群执行完整恢复以及时间点恢复的功能。有两种方法可以恢复集群:

  • 使用 dataSource.postgresCluster 子部分恢复到新集群,
  • 就地恢复到现有集群(请注意,这是破坏性的)。

还原当前postgres 实例

参考: https://docs.percona.com/percona-operator-for-postgresql/2.0/backups-restore.html#restore-to-a-new-postgresql-cluster

要恢复之前保存的备份,请使用备份恢复 配置文件。备份配置文件的示例为 restore-pg.yaml:

apiVersion: pgv2.percona.com/v2
kind: PerconaPGRestore
metadata:
  name: restore1
spec:
  pgCluster: bika-pg
  repoName: repo1
  options:
  - --type=time
  - --target="2025-02-12 12:00:11+03"

以下键是最重要的:

  • pgCluster指定集群的名称,

  • repoName指定已经在小节中配置的 4 个 pgBackRest 存储库之一的名称

    backups.pgbackrest.repos
  • options传递任何pgBackRest 命令行选项

要启动恢复过程,请运行以下命令(-n bika-ap如果数据库集群位于不同的命名空间,请修改参数):

kubectl apply -f restore-pg.yaml -n bika-app

还原mongodb

参考: https://docs.percona.com/percona-operator-for-mongodb/backups-restore.html

恢复以前保存的备份需要以下内容:

  • 确保集群正在运行。

  • 找出备份集群的正确名称。可以使用以下命令列出可用的备份:

    $ kubectl get psmdb-backup -n bika-app

    以下命令将列出可用的集群:

    $ kubectl get psmdb -n bika-app

还原当前mongo 实例

  1. 在restore-mongo.yaml 中设置适当的键文件。

    • 将 key设置

      spec.clusterName

      为要恢复备份的目标集群的名称

    • 将 key设置

      spec.backupName

      为备份的名称

    • 将额外的恢复参数添加到该

      pitr

      部分:

      • typekey 可以是下列选项之一

        • date- 回滚至特定日期
        • latest- 恢复到最新的可能交易
      • datekey 与 option 一起使用

        type=date

        ,包含日期时间格式的值,生成的

        restore.yaml

        文件可能如下所示:

    apiVersion: psmdb.percona.com/v1
    kind: PerconaServerMongoDBRestore
    metadata:
      name: restore1
    spec:
      clusterName: bika-mongo
      backupName: backup1
      pitr:
        type: date
        date: YYYY-MM-DD hh:mm:ss
    

    kubectl get psmdb-backup命令提供的完整备份对象在选择要恢复的备份时有一个方便的“最新可恢复时间”信息字段。您可以按如下方式轻松查询备份以获取此信息:

    $ kubectl get psmdb-backup <backup_name> -o jsonpath='{.status.latestRestorableTime}' -n bika-app
  2. 运行实际的恢复过程:

    $ kubectl apply -f deploy/backup/restore-mongo.yaml

    可以通过将其内容传递给命令来替换将备份设置存储在单独的文件中,kubectl apply如下所示:

    $ cat <<EOF | kubectl apply -f-
    apiVersion: psmdb.percona.com/v1
    kind: PerconaServerMongoDBRestore
    metadata:
      name: restore1
    spec:
      clusterName: bika-mongo
      backupName: backup1
      pitr:
        type: date
        date: YYYY-MM-DD hh:mm:ss
    EOF

\

On this page