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

通过直接传输进行群组迁移

要使用直接传输,请确保您的 GitLab 安装可以从 GitLab IP 地址 访问,并且具有公共 DNS 条目。

通过直接传输进行群组迁移 是使用文件导出迁移群组和项目的演进版本。目标是让用户能够更轻松地将整个群组(包括项目)从一个 GitLab 实例迁移到另一个实例。

设计决策

下图架构图说明了群组迁移如何利用一组 ETL 管道和当前的 GitLab APIs 工作。

Simplified Component Overview

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