InfoGrab Docs

머지 리퀘스트 diff 스토리지

요약

머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다.

머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 머지 리퀘스트를 볼 때 성능 최적화로 가능한 경우 이 복사본에서 diff를 가져옵니다.

기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다. 대규모 설치에서는 이 테이블이 너무 커질 수 있으며 이 경우 외부 스토리지로 전환해야 합니다.

머지 리퀘스트 diff를 저장할 수 있는 방법:

외부 스토리지 사용#

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 외부 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"
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다. GitLab이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
    
  2. 외부 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
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다. GitLab이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.

오브젝트 스토리지 사용#

Warning

오브젝트 스토리지로의 마이그레이션은 되돌릴 수 없습니다.

외부 diff를 디스크에 저장하는 대신 AWS S3와 같은 오브젝트 스토어를 사용해야 합니다. 이 구성은 유효하게 사전 구성된 AWS 자격 증명에 의존합니다.

Note

통합 오브젝트 스토리지 설정에서 외부 diff를 위한 오브젝트 스토리지를 구성하면 머지 리퀘스트 diff의 외부 스토리지가 자동으로 활성화되지 않습니다. external_diffs_enabledtrue로 명시적으로 설정해야 합니다.

외부 diff를 위한 오브젝트 스토리지를 구성하려면:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 통합 오브젝트 스토리지 설정을 구성합니다.

  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
    
  2. 통합 오브젝트 스토리지 설정을 구성합니다.

  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.

GitLab을 재구성하거나 재시작한 후 기존 머지 리퀘스트 diff가 외부 스토리지로 마이그레이션됩니다.

자세한 내용은 오브젝트 스토리지를 참조하세요.

대안적 데이터베이스 내 스토리지#

외부 diff를 활성화하면 다른 데이터와 별도의 작업으로 검색해야 하므로 머지 리퀘스트 성능이 저하될 수 있습니다. 오래된 diff만 외부에 저장하고 현재 diff는 데이터베이스에 유지함으로써 타협점을 찾을 수 있습니다.

이 기능을 활성화하려면 다음 단계를 수행합니다:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.

이 기능이 활성화되면 diff는 외부가 아닌 데이터베이스에 처음 저장됩니다. 다음 조건 중 하나가 충족되면 외부 스토리지로 이동됩니다:

  • 머지 리퀘스트 diff의 최신 버전이 존재하는 경우
  • 머지 리퀘스트가 7일 이상 전에 머지된 경우
  • 머지 리퀘스트가 7일 이상 전에 닫힌 경우

이 규칙은 자주 접근하는 diff만 데이터베이스에 저장하여 공간과 성능 간의 균형을 유지합니다. 접근할 가능성이 낮은 diff는 외부 스토리지로 이동됩니다.

외부 스토리지에서 오브젝트 스토리지로 전환#

자동 마이그레이션은 데이터베이스에 저장된 diff를 이동하지만 스토리지 유형 간의 diff는 이동하지 않습니다. 외부 스토리지에서 오브젝트 스토리지로 전환하려면:

  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 이스케이프 코드를 지원하지 않는 경우 ANSIfalse로 설정해야 합니다.

오브젝트 스토리지와 로컬 스토리지 간의 외부 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;

머지 리퀘스트 diff 스토리지

Tier: Free, Premium, Ultimate
Offering: GitLab Self-Managed
원문 보기
요약

머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다.

머지 리퀘스트 diff는 머지 리퀘스트와 관련된 diff의 크기 제한 복사본입니다. 머지 리퀘스트를 볼 때 성능 최적화로 가능한 경우 이 복사본에서 diff를 가져옵니다.

기본적으로 GitLab은 merge_request_diff_files라는 테이블의 데이터베이스에 머지 리퀘스트 diff를 저장합니다. 대규모 설치에서는 이 테이블이 너무 커질 수 있으며 이 경우 외부 스토리지로 전환해야 합니다.

머지 리퀘스트 diff를 저장할 수 있는 방법:

외부 스토리지 사용#

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 외부 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"
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다. GitLab이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
    
  2. 외부 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
    
  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다. GitLab이 기존 머지 리퀘스트 diff를 외부 스토리지로 마이그레이션합니다.

오브젝트 스토리지 사용#

Warning

오브젝트 스토리지로의 마이그레이션은 되돌릴 수 없습니다.

외부 diff를 디스크에 저장하는 대신 AWS S3와 같은 오브젝트 스토어를 사용해야 합니다. 이 구성은 유효하게 사전 구성된 AWS 자격 증명에 의존합니다.

Note

통합 오브젝트 스토리지 설정에서 외부 diff를 위한 오브젝트 스토리지를 구성하면 머지 리퀘스트 diff의 외부 스토리지가 자동으로 활성화되지 않습니다. external_diffs_enabledtrue로 명시적으로 설정해야 합니다.

외부 diff를 위한 오브젝트 스토리지를 구성하려면:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 통합 오브젝트 스토리지 설정을 구성합니다.

  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
    
  2. 통합 오브젝트 스토리지 설정을 구성합니다.

  3. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.

GitLab을 재구성하거나 재시작한 후 기존 머지 리퀘스트 diff가 외부 스토리지로 마이그레이션됩니다.

자세한 내용은 오브젝트 스토리지를 참조하세요.

대안적 데이터베이스 내 스토리지#

외부 diff를 활성화하면 다른 데이터와 별도의 작업으로 검색해야 하므로 머지 리퀘스트 성능이 저하될 수 있습니다. 오래된 diff만 외부에 저장하고 현재 diff는 데이터베이스에 유지함으로써 타협점을 찾을 수 있습니다.

이 기능을 활성화하려면 다음 단계를 수행합니다:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가합니다:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.

  1. /home/git/gitlab/config/gitlab.yml을 편집하고 다음 줄을 추가하거나 수정합니다:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.

이 기능이 활성화되면 diff는 외부가 아닌 데이터베이스에 처음 저장됩니다. 다음 조건 중 하나가 충족되면 외부 스토리지로 이동됩니다:

  • 머지 리퀘스트 diff의 최신 버전이 존재하는 경우
  • 머지 리퀘스트가 7일 이상 전에 머지된 경우
  • 머지 리퀘스트가 7일 이상 전에 닫힌 경우

이 규칙은 자주 접근하는 diff만 데이터베이스에 저장하여 공간과 성능 간의 균형을 유지합니다. 접근할 가능성이 낮은 diff는 외부 스토리지로 이동됩니다.

외부 스토리지에서 오브젝트 스토리지로 전환#

자동 마이그레이션은 데이터베이스에 저장된 diff를 이동하지만 스토리지 유형 간의 diff는 이동하지 않습니다. 외부 스토리지에서 오브젝트 스토리지로 전환하려면:

  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 이스케이프 코드를 지원하지 않는 경우 ANSIfalse로 설정해야 합니다.

오브젝트 스토리지와 로컬 스토리지 간의 외부 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;