合并请求差异存储

合并请求差异是与合并请求相关的差异的大小限制副本。查看合并请求时,作为性能优化,尽可能从这些副本中获取差异。

默认情况下,合并请求差异存储在数据库中名为 merge_request_diff_files 的表中。在较大的安装实例中,您可能会发现此表变得太大,在这种情况下,建议切换到外部存储。

合并请求差异可以存储在磁盘上对象存储中。通常,将差异存储在数据库中比存储在磁盘上要好。可以使用一种折衷方案,即仅在数据库之外存储过时的差异

使用外部存储

Linux 软件包安装:

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 外部差异存储在 /var/opt/gitlab/gitlab-rails/shared/external-diffs 中。要更改路径,例如,更改为 /mnt/storage/external-diffs,请编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_storage_path'] = "/mnt/storage/external-diffs"
    
  3. 保存文件并重新配置极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。

源安装:

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
    
  2. 外部差异存储在 /home/git/gitlab/shared/external-diffs 中。要更改路径,例如更改为 /mnt/storage/external-diffs,请编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
      storage_path: /mnt/storage/external-diffs
    
  3. 保存文件并重启极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。

使用对象存储

caution 迁移到对象存储是不可逆的。

我们建议使用 AWS S3 之类的对象存储,而不是将外部差异存储在磁盘上。此配置依赖于已配置的有效 AWS 凭证。

Linux 软件包安装:

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 编辑对象存储设置
  3. 保存文件并重新配置极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。

源安装:

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
    
  2. 编辑对象存储设置
  3. 保存文件并重启极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。

对象存储设置

您应该使用一致的对象存储设置

可替代的数据库存储

启用外部差异可能会降低合并请求的性能,因为它们必须通过与其他数据不同的单独操作来检索。可以达成一种折衷方案,即仅将过时的差异存储在外部,而将当前的差异存储在数据库中。

要启用此功能,执行如下步骤:

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb 并添加如下内容:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 保存文件并重新配置极狐GitLab以使得变更生效。

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加如下内容:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 保存文件并重启极狐GitLab以使得变更生效。

::EndTabs

开启此功能后,差异的初始化内容存储在数据库内,而不是外部。当下面的任意条件变为真时,差异内容就会被移动到外部存储:

  • 存在版本更新合并请求差异
  • 合并请求被合并超过 7 天
  • 合并请求被关闭超过 7 天

这些规则通过仅在数据库中存储频繁访问的差异,在空间与性能之间达成了平衡。不太可能被访问的差异则会被转移到外部存储。

从外部存储切换到对象存储

自动迁移数据库中的移动差异,但是这并不会在存储类型间移动差异。要将外部存储切换到对象存储:

  1. 手动移动存储在本地或 NFS 存储中的文件到对象存储。
  2. 运行此 Rake 任务以更改数据库中的位置。

    针对 Linux 软件包安装:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage
    

    针对源代码编译安装:

    sudo -u git -H bundle exec rake gitlab:external_diffs:force_object_storage RAILS_ENV=production
    

    默认情况下,sudo 不会保留现有的环境变量。您应该将它们添加到后面,而不是前面,就像:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage START_ID=59946109 END_ID=59946109 UPDATE_DELAY=5
    

这些环境变量修改了 Rake 任务的行为:

名称 默认值 目的
ANSI true 使用 ANSI 转义码使输出更易于理解。
BATCH_SIZE 1000 按此大小的批次迭代该表
START_ID nil 如设置,从此 ID 开始扫描。
END_ID nil 如设置,在此 ID 停止扫描。
UPDATE_DELAY 1 更新之间休眠的时间。
  • 通过将不同的进程分配到数据表的不同部分,START_IDEND_ID 可以用来进行并行更新。
  • BATCHUPDATE_DELAY 可以在迁移速度和数据表的并发访问之间进行权衡。
  • 如果您的命令中断不支持 ANSI 转义码,您应该将 ANSI 设置为 false