Upgrading PostgreSQL for Auto DevOps

原文:https://docs.gitlab.com/ee/topics/autodevops/upgrading_postgresql.html

Upgrading PostgreSQL for Auto DevOps

Auto DevOps 为您的应用程序提供集群内 PostgreSQL 数据库 .

用于配置 PostgreSQL 的图表的版本:

  • 在 GitLab 12.8 及更早版本中为 0.7.1.
  • 在 GitLab 12.9 及更高版本中可以设置为 0.7.1 至 8.2.1.

GitLab 鼓励用户将其数据库迁移到较新的 PostgreSQL 图表.

本指南提供有关如何迁移 PostgreSQL 数据库的说明,其中包括:

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

Prerequisites

  1. Install kubectl.
  2. 确保您可以使用kubectl访问 Kubernetes 集群. 这取决于 Kubernetes 提供者.
  3. 准备停机. 下面的步骤包括使应用程序脱机,以便在创建数据库转储后不修改集群内数据库.
  4. 确保尚未将POSTGRES_ENABLED设置为false ,因为此设置将删除任何现有的通道 1 数据库. 有关更多信息,请参见检测到现有的 PostgreSQL 数据库 .

提示:如果已将 Auto DevOps 配置为具有暂存,请考虑先尝试暂存并还原备份和还原步骤,或者在审阅应用程序中尝试此步骤.

Take your application offline

如果需要,请使应用程序脱机,以防止在创建数据库转储后修改数据库.

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

    1. $ kubectl get ns
    2. NAME STATUS AGE
    3. minimal-ruby-app-4349298-production Active 7d14h
  2. 为了易于使用,请导出名称空间名称:

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

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

    1. $ kubectl scale --replicas=0 deployments/production --namespace "$APP_NAMESPACE"
    2. deployment.extensions/production scaled
  5. 如果有的话,还需要将 worker 的副本设置为零.

Backup

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

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

    1. $ kubectl get pod --namespace "$APP_NAMESPACE" -l app=production-postgres
    2. NAME READY STATUS RESTARTS AGE
    3. production-postgres-5db86568d7-qxlxv 1/1 Running 0 7d14h
  3. 通过以下方式连接到吊舱:

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

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

    • 系统将要求您输入数据库密码,默认testing-passwordtesting-password .

    1. ## Format is:
    2. # pg_dump -h SERVICE_NAME -U USERNAME DATABASE_NAME > /tmp/backup.sql
    3. pg_dump -h production-postgres -U user production > /tmp/backup.sql
  5. 备份转储完成后,使用Control-D exit Kubernetes exec 进程或exit .

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

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

Retain persistent volumes

默认情况下,当Delete使用该卷的 Pod 和 Pod 声明时,用于存储 PostgreSQL 基础数据的持久卷将标记为Delete .

这很重要,因为当您选择使用较新的 8.2.1 PostgreSQL 时,会删除较旧的 0.7.1 PostgreSQL,从而导致永久卷也被删除.

您可以使用以下命令进行验证:

  1. $ kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pvc-0da80c08-5239-11ea-9c8d-42010a8e0096 8Gi RWO Delete Bound minimal-ruby-app-4349298-staging/staging-postgres standard 7d22h
  4. 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

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

Install new PostgreSQL

注意:使用较新版本的 PostgreSQL 将删除较旧的 0.7.1 PostgreSQL. 为了防止基础数据被删除,您可以选择保留持久卷 .提示:您还可以将AUTO_DEVOPS_POSTGRES_CHANNELAUTO_DEVOPS_POSTGRES_DELETE_V1POSTGRES_VERSION变量的作用域设置为特定环境,例如staging .

  1. AUTO_DEVOPS_POSTGRES_CHANNEL设置为2 . 选择使用较新的基于 8.2.1 的 PostgreSQL,并删除较旧的基于 0.7.1 的 PostgreSQL.
  2. AUTO_DEVOPS_POSTGRES_DELETE_V1设置为非空值. 此标志是防止意外删除数据库的保护措施.
  3. POSTGRES_VERSION设置为11.7 . 这是支持的最低 PostgreSQL 版本.
  4. PRODUCTION_REPLICAS设置为0 . 对于其他环境, REPLICAS环境范围内使用REPLICAS .
  5. 如果已设置DB_INITIALIZEDB_MIGRATE变量,请删除变量,或将变量临时重命名为XDB_INITIALIZEXDB_MIGRATE以有效地禁用它们.
  6. Run a new CI pipeline for the branch. In this case, we run a new CI pipeline for master.
  7. 一旦管道成功,您的应用程序现在将安装新的 PostgreSQL 进行升级. 复制品也将为零,这意味着将不为您的应用程序提供任何流量(以防止新数据进入).

Restore

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

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

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

    1. kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" bash
  4. 连接到 Pod 后,运行以下命令来还原数据库.

    • 系统将要求您输入数据库密码,默认testing-passwordtesting-password .
    • USERNAME是您为 PostgreSQL 配置的用户名. 默认值为user .
    • DATABASE_NAME通常是环境名称.
    1. ## Format is:
    2. # psql -U USERNAME -d DATABASE_NAME < /tmp/backup.sql
    3. psql -U user -d production < /tmp/backup.sql
  5. 现在,您可以检查还原完成后是否已正确还原数据. 您可以使用psql对数据进行抽查.

Reinstate your application

对数据库已还原感到满意后,请运行以下步骤来恢复您的应用程序:

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