备份与恢复
本文档解释了在 CNG 中备份和恢复的技术实现。
Toolbox pod
使用这个 pod 的用户可以使用 kubectl exec -it <pod name> -- <arbitrary command>
运行命令。
Toolbox 从 Toolbox 镜像运行一个容器。
该镜像包含一些自定义脚本,它们将被用户作为命令调用。这些脚本用于运行 Rake 任务、备份、恢复和一些用于与对象存储交互的 helper 脚本。
备份实用程序
备份实用程序是任务运行器容器中的脚本之一,顾名思义,它是一个用于备份的脚本,但也处理现有备份的恢复。
备份
备份实用程序脚本在不带任何参数的情况下运行时会创建一个备份 tar 并将其上传到对象存储。
执行顺序
按顺序使用以下步骤进行备份:
- 使用 GitLab 备份 Rake 任务 备份数据库(如果没有请跳过)。
- 使用 GitLab 备份 Rake 任务 备份仓库(如果没有请跳过)。
- 对于每个对象存储后端
- 如果对象存储后端被标记为跳过,则跳过此存储后端。
- 压缩对应对象存储桶中的现有数据,命名为
<bucket-name>.tar
。 - 将 tar 移动到磁盘上的备份位置。
- 编写一个
backup_information.yml
文件,其中包含一些标识 GitLab 版本、备份时间和跳过事项的元数据。 - 创建一个包含单独 tar 文件及
backup_information.yml
的 tar 文件。 - 将生成的 tar 文件上传到对象存储
gitlab-backups
存储桶。
命令行参数
-
--skip <component>
您可以通过对要在备份过程中跳过的每个组件使用
--skip <component>
来跳过部分备份过程。可跳过的组件是数据库(db
)、存储库(repositories
)和任何对象存储(registry
、uploads
、artifacts
、lfs
、packages
、external_diffs
或terraform_state
)。 -
-t <timestamp-override-value>
这使您可以部分控制备份的名称:当您指定此标志时,创建的备份将命名为
<timestamp-override-value>_gitlab_backup.tar
。默认值是当前的 UNIX 时间戳,后缀为格式为YYYY_mm_dd
的当前日期。 -
--backend <backend>
配置对象存储后端以用于备份。 可以是
s3
或gcs
。 默认值为s3
。 -
--storage-class <storage-class-name>
还可以使用
--storage-class <storage-class-name>
指定存储备份的 storage class,从而节省备份存储成本。如果未指定,这将使用存储后端的默认值。此 storage class 名称按原样传递给指定后端的 storage class 参数。
GitLab 备份存储桶
将用于存储备份的存储桶的默认名称是 gitlab-backups
。 这可以使用 BACKUP_BUCKET_NAME
环境变量进行配置。
备份到 Google Cloud Storage
默认情况下,备份实用程序使用 s3cmd
从对象存储上传和下载产物。虽然这可以与 Google Cloud Storage (GCS) 一起使用,但它需要使用互操作性 API,这会对身份验证和授权造成不利影响。 使用 Google Cloud Storage 进行备份时,您可以将备份实用程序脚本配置为使用 Cloud Storage 原生 CLI gsutil
,通过将 BACKUP_BACKEND
环境变量设置为 gcs
来上传和下载您的产物。
恢复
当给定参数--restore
时,备份实用程序会尝试从现有备份恢复到正在运行的实例。该备份可以来自 Omnibus GitLab 或 CNG Helm chart 安装,前提是备份的实例和正在运行的实例运行相同版本的 GitLab。恢复需要使用 -t <backup-name>
的备份存储区中的文件或使用 -f <url>
的远程 URL。
当给定一个 -t
参数时,它会在对象存储中的备份桶中查找具有此类名称的备份 tar。当给定一个 -f
参数时,它期望给定的 URL 是可从容器访问的位置中备份 tar 的有效 URI。
获取备份 tar 后,执行顺序为:
- 对于仓库和数据库运行 GitLab 备份 Rake 任务
- 对于每个对象存储后端:
- 压缩对应对象存储桶中的现有数据,命名为
<backup-name>.tar
- 将其上传到对象存储中的
tmp
存储桶 - 清理对应的存储桶
- 将备份内容恢复到对应的存储桶中
- 压缩对应对象存储桶中的现有数据,命名为
tmp
目录中的数据恢复到以前的备份。目前这是一个手动过程。