备份存档流程
当您运行备份命令时,备份脚本会创建一个备份存档文件来存储您的 GitLab 数据。
为了创建存档文件,备份脚本会执行以下操作:
- 如果您正在进行增量备份,则会提取之前的备份存档文件。
- 更新或生成备份存档文件。
- 运行所有备份子任务以:
- 将备份暂存区归档为一个
tar文件。 - 如果已配置,则将新的备份存档上传到对象存储。
- 清理已归档的备份暂存目录中的文件。
备份数据库
为了备份数据库,db 子任务会:
备份 Git 仓库
为了备份 Git 仓库,repositories 子任务会:
-
通知
gitaly-backup需要备份哪些仓库。 -
运行
gitaly-backup以:- 在 Gitaly 上调用一系列远程过程调用 (RPC)。
- 收集每个仓库的备份数据。
-
将收集的数据流式传输到备份暂存目录中的目录结构里。
下图说明了此流程:
%%{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 子任务会:
- 运行
gitaly-backup,为每个仓库进行一次 RPC 调用。 - 触发存储物理仓库的 Gitaly 节点将备份数据上传到对象存储。
- 使用备份 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:合并请求差异(当外部存储时)
每个子任务都会在特定于任务的目录中识别一组文件,然后:
- 使用
tar工具为识别出的文件创建一个存档。 - 通过
gzip压缩存档,但不保存到磁盘。 - 将
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