合并请求差异存储
合并请求差异是与合并请求相关的差异的大小限制副本。查看合并请求时,作为性能优化,尽可能从这些副本中获取差异。
默认情况下,合并请求差异存储在数据库中名为 merge_request_diff_files
的表中。在较大的安装实例中,您可能会发现此表变得太大,在这种情况下,建议切换到外部存储。
合并请求差异可以存储在磁盘上或对象存储中。通常,将差异存储在数据库中比存储在磁盘上要好。可以使用一种折衷方案,即仅在数据库之外存储过时的差异。
使用外部存储
Linux 软件包安装:
-
编辑
/etc/gitlab/gitlab.rb
并添加以下行:gitlab_rails['external_diffs_enabled'] = true
-
外部差异存储在
/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"
-
保存文件并重新配置极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。
源安装:
-
编辑
/home/git/gitlab/config/gitlab.yml
并添加或修改以下行:external_diffs: enabled: true
-
外部差异存储在
/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
-
保存文件并重启极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。
使用对象存储
我们建议使用 AWS S3 之类的对象存储,而不是将外部差异存储在磁盘上。此配置依赖于已配置的有效 AWS 凭证。
Linux 软件包安装:
-
编辑
/etc/gitlab/gitlab.rb
并添加以下行:gitlab_rails['external_diffs_enabled'] = true
- 编辑对象存储设置。
- 保存文件并重新配置极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。
源安装:
-
编辑
/home/git/gitlab/config/gitlab.yml
并添加或修改以下行:external_diffs: enabled: true
- 编辑对象存储设置。
- 保存文件并重启极狐GitLab,使更改生效。极狐GitLab 然后将您现有的合并请求差异迁移到外部存储。
对象存储设置
您应该使用一致的对象存储设置。
可替代的数据库存储
启用外部差异可能会降低合并请求的性能,因为它们必须通过与其他数据不同的单独操作来检索。可以达成一种折衷方案,即仅将过时的差异存储在外部,而将当前的差异存储在数据库中。
要启用此功能,执行如下步骤:
::Tabs
:::TabTitle Linux package (Omnibus)
-
编辑
/etc/gitlab/gitlab.rb
并添加如下内容:gitlab_rails['external_diffs_when'] = 'outdated'
-
保存文件并重新配置极狐GitLab以使得变更生效。
:::TabTitle Self-compiled (source)
-
编辑
/home/git/gitlab/config/gitlab.yml
并添加如下内容:external_diffs: enabled: true when: outdated
-
保存文件并重启极狐GitLab以使得变更生效。
::EndTabs
开启此功能后,差异的初始化内容存储在数据库内,而不是外部。当下面的任意条件变为真时,差异内容就会被移动到外部存储:
- 存在版本更新合并请求差异
- 合并请求被合并超过 7 天
- 合并请求被关闭超过 7 天
这些规则通过仅在数据库中存储频繁访问的差异,在空间与性能之间达成了平衡。不太可能被访问的差异则会被转移到外部存储。
从外部存储切换到对象存储
自动迁移数据库中的移动差异,但是这并不会在存储类型间移动差异。要将外部存储切换到对象存储:
- 手动移动存储在本地或 NFS 存储中的文件到对象存储。
-
运行此 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_ID
和END_ID
可以用来进行并行更新。 -
BATCH
和UPDATE_DELAY
可以在迁移速度和数据表的并发访问之间进行权衡。 - 如果您的命令中断不支持 ANSI 转义码,您应该将
ANSI
设置为false
。