Upgrading PostgreSQL for Auto DevOps
原文:https://docs.gitlab.com/ee/topics/autodevops/upgrading_postgresql.html
- Prerequisites
- Take your application offline
- Backup
- Retain persistent volumes
- Install new PostgreSQL
- Restore
- Reinstate your application
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 数据库的说明,其中包括:
- 对数据进行数据库转储.
- 使用图表的较新版本 8.2.1 安装新的 PostgreSQL 数据库,并删除旧的 PostgreSQL 安装.
- 将数据库转储还原到新的 PostgreSQL 中.
Prerequisites
- Install
kubectl
. - 确保您可以使用
kubectl
访问 Kubernetes 集群. 这取决于 Kubernetes 提供者. - 准备停机. 下面的步骤包括使应用程序脱机,以便在创建数据库转储后不修改集群内数据库.
- 确保尚未将
POSTGRES_ENABLED
设置为false
,因为此设置将删除任何现有的通道 1 数据库. 有关更多信息,请参见检测到现有的 PostgreSQL 数据库 .
提示:如果已将 Auto DevOps 配置为具有暂存,请考虑先尝试暂存并还原备份和还原步骤,或者在审阅应用程序中尝试此步骤.
Take your application offline
如果需要,请使应用程序脱机,以防止在创建数据库转储后修改数据库.
获取环境的 Kubernetes 命名空间. 它通常看起来像
<project-name>-<project-id>-<environment>
. 在我们的示例中,名称空间称为minimal-ruby-app-4349298-production
.$ kubectl get ns
NAME STATUS AGE
minimal-ruby-app-4349298-production Active 7d14h
为了易于使用,请导出名称空间名称:
export APP_NAMESPACE=minimal-ruby-app-4349298-production
使用以下命令获取应用程序的部署名称. 在我们的示例中,部署名称为
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
为了防止数据库被修改,请使用以下命令将副本的副本数设置为 0. 我们使用上一步中的部署名称(
deployments/<DEPLOYMENT_NAME>
).$ kubectl scale --replicas=0 deployments/production --namespace "$APP_NAMESPACE"
deployment.extensions/production scaled
如果有的话,还需要将 worker 的副本设置为零.
Backup
获取 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
使用以下命令获取 PostgreSQL 的 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
通过以下方式连接到吊舱:
kubectl exec -it production-postgres-5db86568d7-qxlxv --namespace "$APP_NAMESPACE" bash
连接后,使用以下命令创建转储文件.
SERVICE_NAME
是在上一步中获得的服务名称.USERNAME
是您为 PostgreSQL 配置的用户名. 默认值为user
.DATABASE_NAME
通常是环境名称.系统将要求您输入数据库密码,默认
testing-password
是testing-password
.
## Format is:
# pg_dump -h SERVICE_NAME -U USERNAME DATABASE_NAME > /tmp/backup.sql
pg_dump -h production-postgres -U user production > /tmp/backup.sql
备份转储完成后,使用
Control-D
exit
Kubernetes exec 进程或exit
.使用以下命令下载转储文件:
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,从而导致永久卷也被删除.
您可以使用以下命令进行验证:
$ 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-42010a8e0096
和pvc-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
Install new PostgreSQL
注意:使用较新版本的 PostgreSQL 将删除较旧的 0.7.1 PostgreSQL. 为了防止基础数据被删除,您可以选择保留持久卷 .提示:您还可以将AUTO_DEVOPS_POSTGRES_CHANNEL
, AUTO_DEVOPS_POSTGRES_DELETE_V1
和POSTGRES_VERSION
变量的作用域设置为特定环境,例如staging
.
- 将
AUTO_DEVOPS_POSTGRES_CHANNEL
设置为2
. 选择使用较新的基于 8.2.1 的 PostgreSQL,并删除较旧的基于 0.7.1 的 PostgreSQL. - 将
AUTO_DEVOPS_POSTGRES_DELETE_V1
设置为非空值. 此标志是防止意外删除数据库的保护措施. - 将
POSTGRES_VERSION
设置为11.7
. 这是支持的最低 PostgreSQL 版本. - 将
PRODUCTION_REPLICAS
设置为0
. 对于其他环境,REPLICAS
在环境范围内使用REPLICAS
. - 如果已设置
DB_INITIALIZE
或DB_MIGRATE
变量,请删除变量,或将变量临时重命名为XDB_INITIALIZE
或XDB_MIGRATE
以有效地禁用它们. - Run a new CI pipeline for the branch. In this case, we run a new CI pipeline for
master
. - 一旦管道成功,您的应用程序现在将安装新的 PostgreSQL 进行升级. 复制品也将为零,这意味着将不为您的应用程序提供任何流量(以防止新数据进入).
Restore
获取新 PostgreSQL 的容器名称,在我们的示例中,容器名称为
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
将转储文件从备份步骤复制到 Pod:
kubectl cp --namespace "$APP_NAMESPACE" backup.sql production-postgresql-0:/tmp/backup.sql
连接到吊舱:
kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" bash
连接到 Pod 后,运行以下命令来还原数据库.
- 系统将要求您输入数据库密码,默认
testing-password
是testing-password
. USERNAME
是您为 PostgreSQL 配置的用户名. 默认值为user
.DATABASE_NAME
通常是环境名称.
## Format is:
# psql -U USERNAME -d DATABASE_NAME < /tmp/backup.sql
psql -U user -d production < /tmp/backup.sql
- 系统将要求您输入数据库密码,默认
现在,您可以检查还原完成后是否已正确还原数据. 您可以使用
psql
对数据进行抽查.
Reinstate your application
对数据库已还原感到满意后,请运行以下步骤来恢复您的应用程序:
- 如果先前已删除或禁用了
DB_INITIALIZE
和DB_MIGRATE
变量,则将其还原. - 将
PRODUCTION_REPLICAS
或REPLICAS
变量恢复为其原始值. - 为分支运行新的 CI 管道. 在这种情况下,我们为
master
运行新的 CI 管道. 管道成功后,您的应用程序应该像以前一样提供流量.