{{< details >}}

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署

{{< /details >}}

POSTGRES_ENABLEDtrue 时,Auto DevOps 为您的应用程序提供一个集群内的 PostgreSQL 数据库

用于配置 PostgreSQL 的图表版本:

  • 可以设置从 0.7.1 到 8.2.1。

极狐GitLab 鼓励用户将数据库迁移到更新的 PostgreSQL 图表。

本指南提供了迁移 PostgreSQL 数据库的说明,包括:

  1. 进行数据的数据库转储。
  2. 使用新版本 8.2.1 的图表安装新的 PostgreSQL 数据库,并删除旧的 PostgreSQL 安装。
  3. 将数据库转储恢复到新的 PostgreSQL 中。

先决条件

  1. 安装 kubectl
  2. 确保您可以使用 kubectl 访问您的 Kubernetes 集群。这根据 Kubernetes 提供商而有所不同。
  3. 为停机时间做好准备。以下步骤包括将应用程序下线,以便在创建数据库转储后不修改集群内数据库。
  4. 确保没有将 POSTGRES_ENABLED 设置为 false,因为此设置会删除任何现有的频道 1 数据库。有关更多信息,请参阅 检测到现有的 PostgreSQL 数据库

{{< alert type=”note” >}}

如果您已配置 Auto DevOps 以包含阶段,考虑先在阶段上尝试备份和恢复步骤,或者在审查应用程序上尝试。

{{< /alert >}}

将您的应用程序下线

如有必要,将您的应用程序下线,以防止在创建数据库转储后对数据库进行修改。

  1. 获取环境的 Kubernetes 命名空间。它通常看起来像 <project-name>-<project-id>-<environment>。在我们的示例中,命名空间称为 minimal-ruby-app-4349298-production

    $ kubectl get ns
    
    NAME                                                  STATUS   AGE
    minimal-ruby-app-4349298-production                   Active   7d14h
    
  2. 为了方便使用,导出命名空间名称:

    export APP_NAMESPACE=minimal-ruby-app-4349298-production
    
  3. 使用以下命令获取应用程序的部署名称。在我们的示例中,部署名称为 production

    $ kubectl get deployment --namespace "$APP_NAMESPACE"
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    production            2/2     2            2           7d21h
    production-postgres   1/1     1            1           7d21h
    
  4. 为了防止数据库被修改,将部署的副本数设置为 0,使用以下命令。我们使用上一步中的部署名称 (deployments/<DEPLOYMENT_NAME>)。

    $ kubectl scale --replicas=0 deployments/production --namespace "$APP_NAMESPACE"
    deployment.extensions/production scaled
    
  5. 如果您有任何 worker,也必须将其副本数设置为零。

备份

  1. 获取 PostgreSQL 的服务名称。服务名称应以 -postgres 结尾。在我们的示例中,服务名称为 production-postgres

    $ kubectl get svc --namespace "$APP_NAMESPACE"
    NAME                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
    production-auto-deploy   ClusterIP   10.30.13.90   <none>        5000/TCP   7d14h
    production-postgres      ClusterIP   10.30.4.57    <none>        5432/TCP   7d14h
    
  2. 使用以下命令获取 PostgreSQL 的 pod 名称。在我们的示例中,pod 名称为 production-postgres-5db86568d7-qxlxv

    $ kubectl get pod --namespace "$APP_NAMESPACE" -l app=production-postgres
    NAME                                   READY   STATUS    RESTARTS   AGE
    production-postgres-5db86568d7-qxlxv   1/1     Running   0          7d14h
    
  3. 连接到 pod:

    kubectl exec -it production-postgres-5db86568d7-qxlxv --namespace "$APP_NAMESPACE" -- bash
    
  4. 一旦连接,使用以下命令创建转储文件。

    • SERVICE_NAME 是在前一步获取的服务名称。
    • USERNAME 是您为 PostgreSQL 配置的用户名。默认值为 user
    • DATABASE_NAME 通常是环境名称。

    • 当提示输入数据库密码时,默认值为 testing-password

      ## 格式为:
      # pg_dump -h SERVICE_NAME -U USERNAME DATABASE_NAME > /tmp/backup.sql
      
      pg_dump -h production-postgres -U user production > /tmp/backup.sql
      
  5. 备份转储完成后,使用 Control-Dexit 退出 Kubernetes exec 进程。

  6. 使用以下命令下载转储文件:

    kubectl cp --namespace "$APP_NAMESPACE" production-postgres-5db86568d7-qxlxv:/tmp/backup.sql backup.sql
    

保留持久卷

默认情况下,用于存储 PostgreSQL 底层数据的持久卷在使用该卷的 pod 和 pod 声明被删除时标记为 Delete

这很重要,因为当您选择使用更新的 8.2.1 PostgreSQL 时,旧的 0.7.1 PostgreSQL 被删除,导致持久卷也被删除。

您可以使用以下命令验证这一点:

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Delete           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Delete           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

为了保留持久卷,即使旧的 0.7.1 PostgreSQL 被删除,我们可以将保留策略更改为 Retain。在这个例子中,我们通过查看声明名称来找到持久卷名称。因为我们对保留 minimal-ruby-app-4349298 应用程序的阶段和生产的卷感兴趣,这里的卷名称是 pvc-0da80c08-5239-11ea-9c8d-42010a8e0096pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096

$ kubectl patch pv  pvc-0da80c08-5239-11ea-9c8d-42010a8e0096 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
persistentvolume/pvc-0da80c08-5239-11ea-9c8d-42010a8e0096 patched
$ kubectl patch pv  pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
persistentvolume/pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096 patched
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                     STORAGECLASS   REASON   AGE
pvc-0da80c08-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Retain           Bound    minimal-ruby-app-4349298-staging/staging-postgres         standard                7d22h
pvc-9085e3d3-5239-11ea-9c8d-42010a8e0096   8Gi        RWO            Retain           Bound    minimal-ruby-app-4349298-production/production-postgres   standard                7d22h

安装新的 PostgreSQL

{{< alert type=”warning” >}}

使用更新版本的 PostgreSQL 删除旧的 0.7.1 PostgreSQL。为了防止底层数据被删除,您可以选择保留持久卷

{{< /alert >}}

{{< alert type=”note” >}}

您还可以为 AUTO_DEVOPS_POSTGRES_CHANNELAUTO_DEVOPS_POSTGRES_DELETE_V1POSTGRES_VERSION 变量指定特定环境的范围,例如 staging

{{< /alert >}}

  1. AUTO_DEVOPS_POSTGRES_CHANNEL 设置为 2。这会选择使用基于 8.2.1 的新 PostgreSQL,并删除基于 0.7.1 的旧 PostgreSQL。
  2. AUTO_DEVOPS_POSTGRES_DELETE_V1 设置为非空值。此标志是防止意外删除数据库的保护措施。
  3. 如果您设置了 POSTGRES_VERSION,请确保其设置为 9.6.16 或更高。这是 Auto DevOps 支持的最低 PostgreSQL 版本。
  4. PRODUCTION_REPLICAS 设置为 0。对于其他环境,请使用具有环境范围REPLICAS
  5. 如果您设置了 DB_INITIALIZEDB_MIGRATE 变量,请将其删除,或将变量临时重命名为 XDB_INITIALIZEXDB_MIGRATE 以有效禁用它们。
  6. 为分支运行新的 CI 流水线。在这种情况下,我们为 main 运行新的 CI 流水线。
  7. 流水线成功后,您的应用程序将升级并安装新的 PostgreSQL。目前存在零副本,因此不为您的应用程序提供流量(以防止新数据进入)。

恢复

  1. 获取新的 PostgreSQL 的 pod 名称,在我们的示例中,pod 名称为 production-postgresql-0

    $ kubectl get pod --namespace "$APP_NAMESPACE" -l app=postgresql
    NAME                      READY   STATUS    RESTARTS   AGE
    production-postgresql-0   1/1     Running   0          19m
    
  2. 将备份步骤中的转储文件复制到 pod:

    kubectl cp --namespace "$APP_NAMESPACE" backup.sql production-postgresql-0:/tmp/backup.sql
    
  3. 连接到 pod:

    kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" -- bash
    
  4. 一旦连接到 pod,运行以下命令以恢复数据库。

    • 当提示输入数据库密码时,默认值为 testing-password
    • USERNAME 是您为 PostgreSQL 配置的用户名。默认值为 user
    • DATABASE_NAME 通常是环境名称。
    ## 格式为:
    # psql -U USERNAME -d DATABASE_NAME < /tmp/backup.sql
    
    psql -U user -d production < /tmp/backup.sql
    
  5. 恢复完成后,您可以检查数据是否正确恢复。您可以通过使用 psql 对数据进行抽查来进行验证。

恢复您的应用程序

一旦您对数据库的恢复满意,请运行以下步骤以恢复您的应用程序:

  1. 恢复 DB_INITIALIZEDB_MIGRATE 变量,如果先前已删除或禁用。
  2. PRODUCTION_REPLICASREPLICAS 变量恢复到其原始值。
  3. 为分支运行新的 CI 流水线。在这种情况下,我们为 main 运行新的 CI 流水线。流水线成功后,您的应用程序应像以前一样提供流量。