Merge Request 차이점 리포지터리
Merge Request 차이점은 Merge Request과 관련된 차이점의 크기 제한된 사본입니다. Merge Request을 보는 경우, 성능 최적화를 위해 가능한 경우 차이점을 이러한 사본에서 가져옵니다.
기본적으로 Merge Request 차이점은 데이터베이스의 merge_request_diff_files
테이블에 저장됩니다. 그러나 대형 설치에서는 이 테이블이 너무 커진다는 문제가 발생할 수 있으며, 이 경우 외부 리포지터리로 전환하는 것이 권장됩니다.
Merge Request 차이점은 디스크에 또는 객체 리포지터리에 저장할 수 있습니다. 일반적으로 차이점을 데이터베이스에 저장하는 것이 디스크에 저장하는 것보다 나은데, 데이터베이스 외에 오래된 차이점만 저장하는 대안이 가능합니다.
외부 리포지터리 사용
-
/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이 기존의 Merge Request 차이점을 외부 리포지터리로 마이그레이션합니다.
-
/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이 기존의 Merge Request 차이점을 외부 리포지터리로 마이그레이션합니다.
객체 리포지터리 사용
외부 차이점을 디스크에 저장하는 대신, AWS S3와 같은 객체 리포지터리를 사용하는 것이 좋습니다. 이 설정은 유효한 AWS 자격 증명에 의존합니다.
-
/etc/gitlab/gitlab.rb
파일을 편집하고 다음 줄을 추가합니다.gitlab_rails['external_diffs_enabled'] = true
- 객체 리포지터리 설정을 구성합니다.
- 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 구성합니다. 그러면 GitLab이 기존의 Merge Request 차이점을 외부 리포지터리로 마이그레이션합니다.
-
/home/git/gitlab/config/gitlab.yml
파일을 편집하고 다음 줄을 추가하거나 수정합니다.external_diffs: enabled: true
- 객체 리포지터리 설정을 구성합니다.
- 변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작합니다. 그러면 GitLab이 기존의 Merge Request 차이점을 외부 리포지터리로 마이그레이션합니다.
GitLab에서 객체 리포지터리 사용에 대해 자세히 알아보기.
객체 리포지터리 설정
GitLab 13.2 이상에서는 통합된 객체 리포지터리 설정을 사용해야 합니다. 이 섹션은 이전 구성 형식을 설명합니다.
자체 컴파일된 설치에서 이러한 설정은 external_diffs:
밑에 있고, object_store:
아래에 중첩되어 있습니다. Linux 패키지 설치에서는 이러한 설정은 external_diffs_object_store_
로 시작됩니다.
설정 | 설명 | 기본값 |
---|---|---|
enabled
| 객체 리포지터리 사용/미사용 | false
|
remote_directory
| 외부 차이점이 저장된 버킷 이름 | |
proxy_download
| 모든 파일 서비스를 프록시하는 경우 true 로 설정. 이 옵션을 사용하면 클라이언트가 모든 데이터를 프록시하는 대신 원격 리포지터리에서 직접 다운로드할 수 있도록 하여 이그레스 트래픽을 줄일 수 있음
| false
|
connection
| 아래에 설명된 여러 연결 옵션 |
S3 호환 연결 설정
다양한 제공 업체에 대한 사용 가능한 연결 설정은 여기에서 확인할 수 있습니다.
-
/etc/gitlab/gitlab.rb
파일을 편집하고 다음 줄을 추가합니다. 값을 원하는 값으로 대체합니다.gitlab_rails['external_diffs_enabled'] = true gitlab_rails['external_diffs_object_store_enabled'] = true gitlab_rails['external_diffs_object_store_remote_directory'] = "external-diffs" gitlab_rails['external_diffs_object_store_connection'] = { 'provider' => 'AWS', 'region' => 'eu-central-1', 'aws_access_key_id' => 'AWS_ACCESS_KEY_ID', 'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY' }
AWS IAM 프로필을 사용하는 경우에는 AWS 액세스 키 및 비밀 액세스 키/값을 생략합니다. 예:
gitlab_rails['external_diffs_object_store_connection'] = { 'provider' => 'AWS', 'region' => 'eu-central-1', 'use_iam_profile' => true }
-
변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 구성합니다.
-
/home/git/gitlab/config/gitlab.yml
파일을 편집하고 다음 줄을 추가하거나 수정합니다.external_diffs: enabled: true object_store: enabled: true remote_directory: "external-diffs" # 버킷 이름 connection: provider: AWS # 현재 AWS만 지원됨 aws_access_key_id: AWS_ACCESS_KEY_ID aws_secret_access_key: AWS_SECRET_ACCESS_KEY region: eu-central-1
-
변경 사항이 적용되려면 파일을 저장하고 GitLab을 다시 시작합니다.
대체 데이터베이스 리포지터리
외부 차이점을 활성화하면 Merge Request의 성능이 저하될 수 있습니다. 외부 차이점은 다른 데이터와 별도의 작업으로 검색해야 하기 때문입니다. 현재 차이점은 데이터베이스에 유지하면서 오래된 차이점만 외부에 저장하는 방법으로 타협점을 찾을 수 있습니다.
::Tabs
-
/etc/gitlab/gitlab.rb
파일을 편집하고 아래 라인을 추가합니다:gitlab_rails['external_diffs_when'] = 'outdated'
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 구성합니다.
-
/home/git/gitlab/config/gitlab.yml
파일을 편집하고 아래의 줄을 추가하거나 수정합니다:external_diffs: enabled: true when: outdated
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 다시 시작합니다.
:::EndTab
이 기능을 활성화하면 차이점은 처음에는 데이터베이스에 저장되고 외부에 저장되지 않습니다. 다음 조건 중 하나가 충족되면 차이점은 외부 리포지터리로 이동됩니다.
- Merge Request 차이점의 새 버전이 존재함
- Merge Request이 7일 이상 전에 Merge됨
- Merge Request이 7일 이상 전에 닫혔음
이러한 규칙은 데이터베이스에 자주 액세스되는 차이점만 저장함으로써 공간과 성능 사이의 균형을 이룹니다. 자주 액세스되지 않을 가능성이 높은 차이점은 대신 외부 리포지터리로 이동됩니다.
외부 리포지터리에서 객체 리포지터리로 전환
자동 마이그레이션은 데이터베이스에 저장된 차이점을 이동하지만, 리포지터리 유형 간에 차이점을 이동하지는 않습니다. 외부 리포지터리에서 객체 리포지터리로 전환하려면 다음을 수행합니다:
- 로컬 또는 NFS 리포지터리에 저장된 파일을 매뉴얼으로 객체 리포지터리로 이동합니다.
-
데이터베이스에서 이들 위치를 변경하기 위해 이러한 Rake 작업을 실행합니다.
Linux 패키지 설치의 경우:
sudo gitlab-rake gitlab:external_diffs:force_object_storage
Self-compiled 설치의 경우:
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
로 설정해야 합니다.