Help us learn about your current experience with the documentation. Take the survey.
通过直接传输进行群组迁移
要使用直接传输,请确保您的 GitLab 安装可以从 GitLab IP 地址 访问,并且具有公共 DNS 条目。
通过直接传输进行群组迁移 是使用文件导出迁移群组和项目的演进版本。目标是让用户能够更轻松地将整个群组(包括项目)从一个 GitLab 实例迁移到另一个实例。
设计决策
下图架构图说明了群组迁移如何利用一组 ETL 管道和当前的 GitLab APIs 工作。
ETL
ETL 是 extract(提取)、transform(转换)和 load(加载)的缩写,是一种数据集成过程, 它将来自多个数据源的数据合并到一个单一的、一致的数据存储中, 然后加载到数据仓库或其他目标系统中。
使用 ETL 架构使代码更加明确,更易于理解、测试和扩展。我们的想法是为每个要导入的关系设置一个 ETL 管道。
API
当前的 项目 和 群组 导入是基于文件的, 因此它们需要一个导出步骤来生成要导入的文件。
通过直接传输进行群组迁移利用 GitLab API 来加速迁移过程。
而且,因为我们正在迈向 GraphQL 的道路, 通过直接传输进行群组迁移有助于扩展 GraphQL API 的覆盖范围,这对 GitLab 及其用户都有益处。
Namespace
迁移过程始于创建一个 BulkImport
记录来跟踪迁移状态。从此,所有与 GitLab 群组迁移相关的代码都可以在所有应用层的新 BulkImports 命名空间下找到。
Idempotency
为确保在重新运行相同的 Sidekiq 作业时不会出现重复条目,我们在处理每个条目时将其缓存,如果条目已存在于缓存中则跳过。
有两种不同的策略:
BulkImports::Pipeline::HexdigestCacheStrategy:缓存数据的十六进制摘要表示。BulkImports::Pipeline::IndexCacheStrategy:缓存管道中条目的最后处理索引。
Sidekiq jobs execution hierarchy
在目标实例上
flowchart TD
subgraph s1["Main"]
BulkImportWorker -- Enqueue itself --> BulkImportWorker
BulkImportWorker --> BulkImports::ExportRequestWorker
BulkImports::ExportRequestWorker --> BulkImports::EntityWorker
BulkImports::EntityWorker -- Enqueue itself --> BulkImports::EntityWorker
BulkImports::EntityWorker --> BulkImports::PipelineWorker
BulkImports::PipelineWorker -- Enqueue itself --> BulkImports::PipelineWorker
BulkImports::EntityWorker --> BulkImports::PipelineWorkerA["BulkImports::PipelineWorker"]
BulkImports::EntityWorker --> BulkImports::PipelineWorkerA1["..."]
BulkImportWorker --> BulkImports::ExportRequestWorkerB["BulkImports::ExportRequestWorker"]
BulkImports::ExportRequestWorkerB --> BulkImports::PipelineWorkerBB["..."]
end
subgraph s2["Batched pipelines"]
BulkImports::PipelineWorker --> BulkImports::PipelineBatchWorker
BulkImports::PipelineWorker --> BulkImports::PipelineBatchWorkerA["..."]
BulkImports::PipelineBatchWorker --> BulkImports::FinishBatchedPipelineWorker
end
flowchart TD
subgraph s1["Cron"]
BulkImports::StaleImportWorker
end
在源实例上
flowchart TD
subgraph s1["Main"]
BulkImports::RelationExportWorker
end
subgraph s2["Batched relations"]
BulkImports::RelationExportWorker --> BulkImports::RelationBatchExportWorker
BulkImports::RelationExportWorker --> BulkImports::RelationBatchExportWorkerA["..."]
BulkImports::RelationBatchExportWorker --> BulkImports::FinishBatchedRelationExportWorker
end