备份与恢复

本文档解释了在 CNG 中备份和恢复的技术实现。

Toolbox pod

使用这个 pod 的用户可以使用 kubectl exec -it <pod name> -- <arbitrary command> 运行命令。

Toolbox 从 Toolbox 镜像运行一个容器。

该镜像包含一些自定义脚本,它们将被用户作为命令调用。这些脚本用于运行 Rake 任务、备份、恢复和一些用于与对象存储交互的 helper 脚本。

备份实用程序

备份实用程序是任务运行器容器中的脚本之一,顾名思义,它是一个用于备份的脚本,但也处理现有备份的恢复。

备份

备份实用程序脚本在不带任何参数的情况下运行时会创建一个备份 tar 并将其上传到对象存储。

执行顺序

按顺序使用以下步骤进行备份:

  1. 使用 GitLab 备份 Rake 任务 备份数据库(如果没有请跳过)。
  2. 使用 GitLab 备份 Rake 任务 备份仓库(如果没有请跳过)。
  3. 对于每个对象存储后端
    1. 如果对象存储后端被标记为跳过,则跳过此存储后端。
    2. 压缩对应对象存储桶中的现有数据,命名为<bucket-name>.tar
    3. 将 tar 移动到磁盘上的备份位置。
  4. 编写一个 backup_information.yml 文件,其中包含一些标识 GitLab 版本、备份时间和跳过事项的元数据。
  5. 创建一个包含单独 tar 文件及 backup_information.yml 的 tar 文件。
  6. 将生成的 tar 文件上传到对象存储 gitlab-backups 存储桶。

命令行参数

  • --skip <component>

    您可以通过对要在备份过程中跳过的每个组件使用 --skip <component> 来跳过部分备份过程。可跳过的组件是数据库(db)、仓库(repositories)和任何对象存储(registryuploadsartifactslfspackagesexternal_diffsterraform_state)。

  • -t <timestamp-override-value>

    这使您可以部分控制备份的名称:当您指定此标志时,创建的备份将命名为 <timestamp-override-value>_gitlab_backup.tar。默认值是当前的 UNIX 时间戳,后缀为格式为 YYYY_mm_dd 的当前日期。

  • --backend <backend>

    配置对象存储后端以用于备份。 可以是 s3gcs。 默认值为s3

  • --storage-class <storage-class-name>

    还可以使用 --storage-class <storage-class-name> 指定存储备份的 storage class,从而节省备份存储成本。如果未指定,这将使用存储后端的默认值。

    note 此 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 时,备份实用程序会尝试从现有备份恢复到正在运行的实例。该备份可以来自 Linux 软件包安装或 CNG Helm chart 安装,前提是备份的实例和正在运行的实例运行相同版本的极狐GitLab。恢复需要使用 -t <backup-name> 的备份存储区中的文件或使用 -f <url> 的远程 URL。

当给定一个 -t 参数时,它会在对象存储中的备份桶中查找具有此类名称的备份 tar。当给定一个 -f 参数时,它期望给定的 URL 是可从容器访问的位置中备份 tar 的有效 URI。

获取备份 tar 后,执行顺序为:

  1. 对于仓库和数据库运行 GitLab 备份 Rake 任务
  2. 对于每个对象存储后端:
    • 压缩对应对象存储桶中的现有数据,命名为 <backup-name>.tar
    • 将其上传到对象存储中的 tmp 存储桶
    • 清理对应的存储桶
    • 将备份内容恢复到对应的存储桶中
note 如果恢复失败,用户将需要使用备份桶的 tmp 目录中的数据恢复到以前的备份。目前这是一个手动过程。