{{< details >}}
- Tier: 基础版, 专业版, 旗舰版
- Offering: JihuLab.com, 私有化部署
{{< /details >}}
当 POSTGRES_ENABLED
为 true
时,Auto DevOps 为您的应用程序提供一个集群内的 PostgreSQL 数据库。
用于配置 PostgreSQL 的图表版本:
- 可以设置从 0.7.1 到 8.2.1。
极狐GitLab 鼓励用户将数据库迁移到更新的 PostgreSQL 图表。
本指南提供了迁移 PostgreSQL 数据库的说明,包括:
- 进行数据的数据库转储。
- 使用新版本 8.2.1 的图表安装新的 PostgreSQL 数据库,并删除旧的 PostgreSQL 安装。
- 将数据库转储恢复到新的 PostgreSQL 中。
先决条件
- 安装
kubectl
。 - 确保您可以使用
kubectl
访问您的 Kubernetes 集群。这根据 Kubernetes 提供商而有所不同。 - 为停机时间做好准备。以下步骤包括将应用程序下线,以便在创建数据库转储后不修改集群内数据库。
- 确保没有将
POSTGRES_ENABLED
设置为false
,因为此设置会删除任何现有的频道 1 数据库。有关更多信息,请参阅 检测到现有的 PostgreSQL 数据库。
{{< alert type=”note” >}}
如果您已配置 Auto DevOps 以包含阶段,考虑先在阶段上尝试备份和恢复步骤,或者在审查应用程序上尝试。
{{< /alert >}}
将您的应用程序下线
如有必要,将您的应用程序下线,以防止在创建数据库转储后对数据库进行修改。
-
获取环境的 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,也必须将其副本数设置为零。
备份
-
获取 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 名称。在我们的示例中,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
-
连接到 pod:
kubectl exec -it production-postgres-5db86568d7-qxlxv --namespace "$APP_NAMESPACE" -- bash
-
一旦连接,使用以下命令创建转储文件。
-
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
-
-
备份转储完成后,使用
Control-D
或exit
退出 Kubernetes exec 进程。 -
使用以下命令下载转储文件:
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-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
安装新的 PostgreSQL
{{< alert type=”warning” >}}
使用更新版本的 PostgreSQL 删除旧的 0.7.1 PostgreSQL。为了防止底层数据被删除,您可以选择保留持久卷。
{{< /alert >}}
{{< alert type=”note” >}}
您还可以为 AUTO_DEVOPS_POSTGRES_CHANNEL
、AUTO_DEVOPS_POSTGRES_DELETE_V1
和 POSTGRES_VERSION
变量指定特定环境的范围,例如 staging
。
{{< /alert >}}
- 将
AUTO_DEVOPS_POSTGRES_CHANNEL
设置为2
。这会选择使用基于 8.2.1 的新 PostgreSQL,并删除基于 0.7.1 的旧 PostgreSQL。 - 将
AUTO_DEVOPS_POSTGRES_DELETE_V1
设置为非空值。此标志是防止意外删除数据库的保护措施。 - 如果您设置了
POSTGRES_VERSION
,请确保其设置为9.6.16
或更高。这是 Auto DevOps 支持的最低 PostgreSQL 版本。 - 将
PRODUCTION_REPLICAS
设置为0
。对于其他环境,请使用具有环境范围的REPLICAS
。 - 如果您设置了
DB_INITIALIZE
或DB_MIGRATE
变量,请将其删除,或将变量临时重命名为XDB_INITIALIZE
或XDB_MIGRATE
以有效禁用它们。 - 为分支运行新的 CI 流水线。在这种情况下,我们为
main
运行新的 CI 流水线。 - 流水线成功后,您的应用程序将升级并安装新的 PostgreSQL。目前存在零副本,因此不为您的应用程序提供流量(以防止新数据进入)。
恢复
-
获取新的 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
-
将备份步骤中的转储文件复制到 pod:
kubectl cp --namespace "$APP_NAMESPACE" backup.sql production-postgresql-0:/tmp/backup.sql
-
连接到 pod:
kubectl exec -it production-postgresql-0 --namespace "$APP_NAMESPACE" -- bash
-
一旦连接到 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
- 当提示输入数据库密码时,默认值为
-
恢复完成后,您可以检查数据是否正确恢复。您可以通过使用
psql
对数据进行抽查来进行验证。
恢复您的应用程序
一旦您对数据库的恢复满意,请运行以下步骤以恢复您的应用程序:
- 恢复
DB_INITIALIZE
和DB_MIGRATE
变量,如果先前已删除或禁用。 - 将
PRODUCTION_REPLICAS
或REPLICAS
变量恢复到其原始值。 - 为分支运行新的 CI 流水线。在这种情况下,我们为
main
运行新的 CI 流水线。流水线成功后,您的应用程序应像以前一样提供流量。