备份归档过程
当你运行 备份命令 时,备份脚本会创建一个备份归档文件来存储你的极狐GitLab 数据。
为了创建归档文件,备份脚本会执行以下操作:
- 当你执行增量备份时,提取之前的备份归档文件。
- 更新或生成备份归档文件。
- 运行所有备份子任务以:
- 将备份暂存区域归档为一个
tar
文件。 - 如果已配置,将新的备份归档上传到对象存储。
- 清理已归档的 备份暂存目录 文件。
备份数据库
为了备份数据库,db
子任务会:
备份 Git 仓库
为了备份 Git 仓库,repositories
子任务会:
- 通知
gitaly-backup
需要备份哪些仓库。 -
运行
gitaly-backup
以:- 在 Gitaly 上调用一系列远程过程调用(RPC)。
- 收集每个仓库的备份数据。
- 将收集的数据流入 备份暂存目录 的目录结构中。
下图说明了这个过程:
Gitaly 集群配置的存储与独立的 Gitaly 实例备份方式相同。
- 当 Gitaly 集群收到来自
gitaly-backup
的 RPC 调用时,它会重建自己的数据库。- 不需要单独备份 Gitaly 集群数据库。
- 每个仓库只备份一次,无论复制因子如何,因为备份是通过 RPC 操作的。
服务器端备份
服务器端仓库备份是备份 Git 仓库的一种高效方式。这种方法的优点是:
- 数据不会通过 Gitaly 进行 RPC 传输。
- 服务器端备份需要较少的网络传输。
- 不需要在运行备份 Rake 任务的机器上占用磁盘存储。
为了在服务器端备份 Gitaly,repositories
子任务会:
- 运行
gitaly-backup
为每个仓库进行一次 RPC 调用。 - 触发存储物理仓库的 Gitaly 节点将备份数据上传到对象存储。
- 使用 备份 ID 将存储在对象存储上的备份链接到创建的备份归档。
下图说明了这个过程:
备份文件
以下子任务负责备份文件:
-
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
进行归档。
备份 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 备份归档之前存储备份工件。
- 在恢复备份或创建增量备份之前提取备份归档。
备份暂存目录是创建已完成备份归档的同一目录。当创建未压缩的备份时,备份工件会保留在此目录中,并且不会创建归档。
以下是一个包含未压缩备份的备份暂存目录示例:
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