Help us learn about your current experience with the documentation. Take the survey.

备份存档流程

当您运行备份命令时,备份脚本会创建一个备份存档文件来存储您的 GitLab 数据。

为了创建存档文件,备份脚本会执行以下操作:

  1. 如果您正在进行增量备份,则会提取之前的备份存档文件。
  2. 更新或生成备份存档文件。
  3. 运行所有备份子任务以:
  4. 将备份暂存区归档为一个 tar 文件。
  5. 如果已配置,则将新的备份存档上传到对象存储。
  6. 清理已归档的备份暂存目录中的文件。

备份数据库

为了备份数据库,db 子任务会:

  1. 使用 pg_dump 创建一个 SQL 转储
  2. pg_dump 的输出通过管道传递给 gzip,并创建一个压缩的 SQL 文件。
  3. 将该文件保存到备份暂存目录

备份 Git 仓库

为了备份 Git 仓库,repositories 子任务会:

  1. 通知 gitaly-backup 需要备份哪些仓库。

  2. 运行 gitaly-backup 以:

    • 在 Gitaly 上调用一系列远程过程调用 (RPC)。
    • 收集每个仓库的备份数据。
  3. 将收集的数据流式传输到备份暂存目录中的目录结构里。

下图说明了此流程:

%%{init: { "fontFamily": "GitLab Sans" }}%%
sequenceDiagram
    box Backup host
        participant Repositories sub-task
        participant gitaly-backup
    end

    Repositories sub-task->>+gitaly-backup: List of repositories

    loop Each repository
        gitaly-backup->>+Gitaly: ListRefs request
        Gitaly->>-gitaly-backup: List of Git references

        gitaly-backup->>+Gitaly: CreateBundleFromRefList request
        Gitaly->>-gitaly-backup: Git bundle file

        gitaly-backup->>+Gitaly: GetCustomHooks request
        Gitaly->>-gitaly-backup: Custom hooks archive
    end

    gitaly-backup->>-Repositories sub-task: Success/failure

已配置的 Gitaly Cluster (Praefect) 存储的备份方式与独立的 Gitaly 实例相同。

  • 当 Gitaly Cluster (Praefect) 收到来自 gitaly-backup 的 RPC 调用时,它会重建自己的数据库。
    • 无需单独备份 Gitaly Cluster (Praefect) 数据库。
  • 由于备份通过 RPC 进行操作,因此无论复制因子如何,每个仓库都只会备份一次。

服务器端备份

服务器端仓库备份是一种高效的 Git 仓库备份方式。 这种方法的优点是:

  • 数据不会通过 RPC 从 Gitaly 传输。
  • 服务器端备份需要更少的网络传输。
  • 运行备份 Rake 任务的机器不需要磁盘存储。

为了在服务器端备份 Gitaly,repositories 子任务会:

  1. 运行 gitaly-backup,为每个仓库进行一次 RPC 调用。
  2. 触发存储物理仓库的 Gitaly 节点将备份数据上传到对象存储。
  3. 使用备份 ID将存储在对象存储上的备份链接到已创建的备份存档。

下图说明了此流程:

%%{init: { "fontFamily": "GitLab Sans" }}%%
sequenceDiagram
    box Backup host
        participant Repositories sub-task
        participant gitaly-backup
    end

    Repositories sub-task->>+gitaly-backup: List of repositories

    loop Each repository
        gitaly-backup->>+Gitaly: BackupRepository request

        Gitaly->>+Object-storage: Git references file
        Object-storage->>-Gitaly: Success/failure

        Gitaly->>+Object-storage: Git bundle file
        Object-storage->>-Gitaly: Success/failure

        Gitaly->>+Object-storage: Custom hooks archive
        Object-storage->>-Gitaly: Success/failure

        Gitaly->>+Object-storage: Backup manifest file
        Object-storage->>-Gitaly: Success/failure

        Gitaly->>-gitaly-backup: Success/failure
    end

    gitaly-backup->>-Repositories sub-task: Success/failure

备份文件

以下子任务用于备份文件:

  • uploads:附件
  • builds:CI/CD 作业输出日志
  • artifacts:CI/CD 作业产物
  • pages:页面内容
  • lfs:LFS 对象
  • terraform_state:Terraform 状态
  • registry:容器镜像
  • packages:软件包
  • ci_secure_files:项目级安全文件
  • external_diffs:合并请求差异(当外部存储时)

每个子任务都会在特定于任务的目录中识别一组文件,然后:

  1. 使用 tar 工具为识别出的文件创建一个存档。
  2. 通过 gzip 压缩存档,但不保存到磁盘。
  3. tar 文件保存到备份暂存目录

由于备份是从运行中的实例创建的,因此在备份过程中文件可能会被修改。 在这种情况下,可以使用备用策略来备份文件。rsync 工具会创建待备份文件的副本,然后将其传递给 tar 进行归档。

如果您使用此策略,那么运行备份 Rake 任务的机器必须有足够的存储空间来存放文件副本和压缩后的存档。

备份 ID

备份 ID 是备份存档的唯一标识符。当您需要恢复 GitLab 并且有多个备份存档可用时,这些 ID 至关重要。

备份存档保存在 config/gitlab.yml 文件中 backup_path 设置指定的目录中。 默认位置是 /var/opt/gitlab/backups

备份 ID 由以下部分组成:

  • 备份创建时的时间戳
  • 日期 (YYYY_MM_DD)
  • GitLab 版本
  • GitLab 版本类型

以下是一个备份 ID 示例:1493107454_2018_04_25_10.6.4-ce

备份文件名

默认情况下,文件名遵循 <backup-id>_gitlab_backup.tar 的结构。例如,1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar

备份信息文件

备份信息文件 backup_information.yml 用于保存所有未包含在备份中的备份输入项。该文件保存在备份暂存目录中。 子任务使用此文件来确定如何恢复备份中的数据,以及如何将其与服务器端仓库备份等外部服务进行链接。

备份信息文件包含以下内容:

  • 备份创建的时间。
  • 生成该备份的 GitLab 版本。
  • 其他指定的选项。例如,被跳过的子任务。

备份暂存目录

备份暂存目录是在备份和恢复过程中使用的临时存储位置。 该目录:

  • 在创建 GitLab 备份存档之前存储备份产物。
  • 在恢复备份或创建增量备份之前解压备份存档。

备份暂存目录与创建已完成备份存档的目录是同一个。 当创建未打包(untarred)的备份时,备份产物会保留在此目录中,而不会创建存档文件。

以下是一个包含未打包备份的备份暂存目录示例:

backups/
├── 1701728344_2023_12_04_16.7.0-pre_gitlab_backup.tar
├── 1701728447_2023_12_04_16.7.0-pre_gitlab_backup.tar
├── artifacts.tar.gz
├── backup_information.yml
├── builds.tar.gz
├── ci_secure_files.tar.gz
├── db
│   ├── ci_database.sql.gz
│   └── database.sql.gz
├── lfs.tar.gz
├── packages.tar.gz
├── pages.tar.gz
├── repositories
│   ├── manifests/
│   ├── @hashed/
│   └── @snippets/
├── terraform_state.tar.gz
└── uploads.tar.gz