머지 리퀘스트 diff 스토리지
Offering: GitLab Self-Managed
머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다.
머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 머지 리퀘스트를 볼 때 성능 최적화로 가능한 경우 이 복사본에서 diff를 가져옵니다.
기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다. 대규모 설치에서는 이 테이블이 너무 커질 수 있으며 이 경우 외부 스토리지로 전환해야 합니다.
머지 리퀘스트 diff를 저장할 수 있는 방법:
- 디스크에 완전히 저장.
- 오브젝트 스토리지에 완전히 저장.
- 현재 diff는 데이터베이스에, 오래된 diff는 오브젝트 스토리지에 저장.
외부 스토리지 사용#
-
/etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:gitlab_rails['external_diffs_enabled'] = true -
외부 diff는
/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이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.
-
/home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:external_diffs: enabled: true -
외부 diff는
/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이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.
오브젝트 스토리지 사용#
오브젝트 스토리지로의 마이그레이션은 되돌릴 수 없습니다.
외부 diff를 디스크에 저장하는 대신 AWS S3와 같은 오브젝트 스토어를 사용해야 합니다. 이 구성은 유효하게 사전 구성된 AWS 자격 증명에 의존합니다.
통합 오브젝트 스토리지 설정에서 외부 diff를 위한 오브젝트 스토리지를 구성하면
머지 리퀘스트 diff의 외부 스토리지가 자동으로 활성화되지 않습니다.
external_diffs_enabled를 true로 명시적으로 설정해야 합니다.
외부 diff를 위한 오브젝트 스토리지를 구성하려면:
-
/etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:gitlab_rails['external_diffs_enabled'] = true -
통합 오브젝트 스토리지 설정을 구성합니다.
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.
-
/home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:external_diffs: enabled: true -
통합 오브젝트 스토리지 설정을 구성합니다.
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.
GitLab을 재구성하거나 재시작한 후 기존 머지 리퀘스트 diff가 외부 스토리지로 마이그레이션됩니다.
자세한 내용은 오브젝트 스토리지를 참조하세요.
대안적 데이터베이스 내 스토리지#
외부 diff를 활성화하면 다른 데이터와 별도의 작업으로 검색해야 하므로 머지 리퀘스트 성능이 저하될 수 있습니다. 오래된 diff만 외부에 저장하고 현재 diff는 데이터베이스에 유지함으로써 타협점을 찾을 수 있습니다.
이 기능을 활성화하려면 다음 단계를 수행합니다:
-
/etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:gitlab_rails['external_diffs_when'] = 'outdated' -
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.
-
/home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:external_diffs: enabled: true when: outdated -
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.
이 기능이 활성화되면 diff는 외부가 아닌 데이터베이스에 처음 저장됩니다. 다음 조건 중 하나가 충족되면 외부 스토리지로 이동됩니다:
- 머지 리퀘스트 diff의 최신 버전이 존재하는 경우
- 머지 리퀘스트가 7일 이상 전에 머지된 경우
- 머지 리퀘스트가 7일 이상 전에 닫힌 경우
이 규칙은 자주 접근하는 diff만 데이터베이스에 저장하여 공간과 성능 간의 균형을 유지합니다. 접근할 가능성이 낮은 diff는 외부 스토리지로 이동됩니다.
외부 스토리지에서 오브젝트 스토리지로 전환#
자동 마이그레이션은 데이터베이스에 저장된 diff를 이동하지만 스토리지 유형 간의 diff는 이동하지 않습니다. 외부 스토리지에서 오브젝트 스토리지로 전환하려면:
-
로컬 또는 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로 설정해야 합니다.
오브젝트 스토리지와 로컬 스토리지 간의 외부 diff 분포를 확인하려면 다음 SQL 쿼리를 사용합니다:
gitlabhq_production=# SELECT count(*) AS total,
SUM(CASE
WHEN external_diff_store = '1' THEN 1
ELSE 0
END) AS filesystem,
SUM(CASE
WHEN external_diff_store = '2' THEN 1
ELSE 0
END) AS objectstg
FROM merge_request_diffs;
