{{< details >}}
- Tier: 基础版,专业版,旗舰版
- Offering: 私有化部署
{{< /details >}}
您可以将极狐GitLab 管理的所有仓库移动到另一个文件系统或服务器。
在极狐GitLab 实例中移动数据
极狐GitLab API 是移动 Git 仓库的推荐方法:
- 在服务器之间。
- 在不同的存储之间。
- 从单节点 Gitaly 到 Gitaly 集群。
有关更多信息,请参阅:
-
为 Gitaly 配置额外存储。此示例配置了名为
storage1
和storage2
的额外存储。 - API 文档 详细说明了查询和调度项目仓库移动的端点。
- API 文档 详细说明了查询和调度代码片段仓库移动的端点。
- API 文档 详细说明了查询和调度群组仓库移动的端点。
- 迁移到 Gitaly 集群。
移动仓库
极狐GitLab 仓库可以与项目、群组和代码片段关联。每种类型都有单独的 API 来调度相应的仓库移动。要移动极狐GitLab 实例上的所有仓库,必须为每个存储调度这些类型的移动。
每个仓库在移动期间都是只读的。仓库在移动完成之前不可写。
移动仓库的方法:
- 确保极狐GitLab 实例可以访问所有本地和集群存储。在这个例子中,这些是
<original_storage_name>
和<cluster_storage_name>
。 - 配置仓库存储权重,以便新存储接收所有新项目。这可以防止在迁移过程中在现有存储上创建新项目。
- 调度仓库移动:
- 如果启用了 Geo,则重新同步所有仓库。
移动所有项目
使用 API 移动所有项目的方法:
-
使用 API 调度存储分片上所有项目的仓库存储移动。例如:
curl --request POST --header "Private-Token: <your_access_token>" \ --header "Content-Type: application/json" \ --data '{"source_storage_name":"<original_storage_name>","destination_storage_name":"<cluster_storage_name>"}' \ "https://gitlab.example.com/api/v4/project_repository_storage_moves"
- 使用 API 查询最新的仓库移动。响应指示:
- 移动已成功完成。
state
字段是finished
。 - 移动正在进行中。重新查询仓库移动直到成功完成。
- 移动失败。大多数失败是临时的,可以通过重新调度移动来解决。
- 移动已成功完成。
-
移动完成后,使用 API 查询项目 并确认所有项目已移动。没有项目应该返回
repository_storage
字段设置为旧存储。例如:curl --header "Private-Token: <your_access_token>" --header "Content-Type: application/json" \ "https://gitlab.example.com/api/v4/projects?repository_storage=<original_storage_name>"
或者使用 rails 控制台 确认所有项目已移动。在 rails 控制台中运行以下命令:
ProjectRepository.for_repository_storage('<original_storage_name>')
- 根据需要对每个存储重复上述步骤。
移动所有代码片段
使用 API 移动所有代码片段的方法:
-
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \ --header "Content-Type: application/json" \ --data '{"source_storage_name":"<original_storage_name>","destination_storage_name":"<cluster_storage_name>"}' \ "https://gitlab.example.com/api/v4/snippet_repository_storage_moves"
-
查询最新的仓库移动。响应指示:
- 移动已成功完成。
state
字段是finished
。 - 移动正在进行中。重新查询仓库移动直到成功完成。
- 移动失败。大多数失败是临时的,可以通过重新调度移动来解决。
- 移动已成功完成。
-
移动完成后,使用 rails 控制台 确认所有代码片段已移动。对于原始存储,不应返回任何代码片段。在 rails 控制台中运行以下命令:
SnippetRepository.for_repository_storage('<original_storage_name>')
- 根据需要对每个存储重复上述步骤。
移动所有群组
{{< details >}}
- Tier: 专业版,旗舰版
- Offering: 私有化部署
{{< /details >}}
使用 API 移动所有群组的方法:
-
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \ --header "Content-Type: application/json" \ --data '{"source_storage_name":"<original_storage_name>","destination_storage_name":"<cluster_storage_name>"}' \ "https://gitlab.example.com/api/v4/group_repository_storage_moves"
-
查询最新的仓库移动。响应指示:
- 移动已成功完成。
state
字段是finished
。 - 移动正在进行中。重新查询仓库移动直到成功完成。
- 移动失败。大多数失败是临时的,可以通过重新调度移动来解决。
- 移动已成功完成。
-
移动完成后,使用 rails 控制台 确认所有群组已移动。对于原始存储,不应返回任何群组。在 rails 控制台中运行以下命令:
GroupWikiRepository.for_repository_storage('<original_storage_name>')
- 根据需要对每个存储重复上述步骤。
迁移到另一个极狐GitLab 实例
使用 API 不是迁移到新的极狐GitLab 环境的选项,例如:
- 从单节点极狐GitLab 到扩展架构。
- 从私有数据中心的极狐GitLab 实例迁移到云提供商。
本文档的其余部分探讨了一些将所有仓库从 /var/opt/gitlab/git-data/repositories
复制到 /mnt/gitlab/repositories
的方法。
我们探讨了三种情况:
- 目标目录为空。
- 目标目录包含过时的仓库副本。
- 如何处理成千上万的仓库。
{{< alert type=”warning” >}}
我们列出的每种方法都可能会或确实会覆盖目标目录 /mnt/gitlab/repositories
中的数据。不要混淆源和目标。
{{< /alert >}}
所有情况下的推荐方法
对于 Gitaly 或 Gitaly 集群目标,极狐GitLab 备份和恢复功能 应该被使用。Git 仓库由 Gitaly 作为数据库在极狐GitLab 服务器上访问、管理和存储。直接使用 rsync
等工具访问和复制 Gitaly 文件可能导致数据丢失。
没有其他方法适用于 Gitaly 集群目标。
目标目录为空:使用 tar
管道
对于 Gitaly 目标(对 Gitaly 集群目标使用推荐方法),如果目标目录 /mnt/gitlab/repositories
为空,最简单的方法是使用 tar
管道。此方法开销低,并且 tar
几乎总是已经安装在您的系统上。
但是,无法恢复中断的 tar
管道;如果发生这种情况,则必须再次复制所有数据。
sudo -u git sh -c 'tar -C /var/opt/gitlab/git-data/repositories -cf - -- . |\
tar -C /mnt/gitlab/repositories -xf -'
如果您希望看到进度,请将 -xf
替换为 -xvf
。
tar
管道到另一个服务器
对于 Gitaly 目标(对 Gitaly 集群目标使用推荐方法),您也可以使用 tar
管道将数据复制到另一台服务器。如果您的 git
用户具有作为 git@newserver
访问新服务器的 SSH 权限,则可以通过 SSH 管道传输数据。
sudo -u git sh -c 'tar -C /var/opt/gitlab/git-data/repositories -cf - -- . |\
ssh git@newserver tar -C /mnt/gitlab/repositories -xf -'
如果您希望在数据通过网络传输前压缩数据(这会消耗 CPU 周期),可以将 ssh
替换为 ssh -C
。
目标目录包含过时的仓库副本:使用 rsync
{{< alert type=”warning” >}}
使用 rsync
迁移 Git 数据可能导致数据丢失和仓库损坏。
{{< /alert >}}
如果目标目录已经包含仓库的部分或过时副本,使用 tar
复制所有数据可能很浪费。在这种情况下,最好使用 rsync
对于 Gitaly 目标(对 Gitaly 集群目标使用推荐方法)。
此实用程序已经安装在您的系统上,或者可以使用 apt
或 yum
安装。
sudo -u git sh -c 'rsync -a --delete /var/opt/gitlab/git-data/repositories/. \
/mnt/gitlab/repositories'
命令中的 /.
非常重要,没有它您可能会在目标目录中得到错误的目录结构。
如果您希望看到进度,请将 -a
替换为 -av
。
单个 rsync
到另一个服务器
{{< alert type=”warning” >}}
使用 rsync
迁移 Git 数据可能导致数据丢失和仓库损坏。
{{< /alert >}}
对于 Gitaly 目标(对 Gitaly 集群目标使用推荐方法),如果源系统上的 git
用户具有访问目标服务器的 SSH 权限,您可以使用 rsync
通过网络发送仓库。
sudo -u git sh -c 'rsync -a --delete /var/opt/gitlab/git-data/repositories/. \
git@newserver:/mnt/gitlab/repositories'