Gitaly 클러스터 복구 옵션 및 도구

Gitaly 클러스터는 주 노드의 고장 및 사용 불가능한 리포지터리에서 복구할 수 있습니다. Gitaly 클러스터는 데이터 복구를 수행하며 Praefect 추적 데이터베이스 도구를 보유하고 있습니다.

Gitaly 클러스터에서 Gitaly 노드 관리

Gitaly 클러스터에서 Gitaly 노드를 추가하고 교체할 수 있습니다.

새 Gitaly 노드 추가

새로운 Gitaly 노드를 Gitaly 클러스터에 추가하는 단계는 사용자 정의 복제 팩터가 설정되어 있는지에 따라 다릅니다.

사용자 정의 복제 팩터

사용자 정의 복제 팩터가 설정되어 있는 경우, set-replication-factor Praefect 명령을 사용하여 각 리포지터리의 복제 팩터를 설정합니다. 새 리포지터리는 복제 팩터에 따라 복제됩니다. Praefect는 기존 리포지터리를 자동으로 새 Gitaly 노드로 복제하지 않습니다.

기본 복제 팩터

기본 복제 팩터를 사용하는 경우, 새 노드를 praefect['virtual_storages'] 하위에 있는 Praefect 구성에 추가합니다. 이로써 Praefect가 구성에 추가된 새 Gitaly 노드로 모든 데이터를 자동으로 복제합니다.

기존 Gitaly 노드 교체

기존 Gitaly 노드를 동일한 이름 또는 다른 이름을 가진 새 노드로 교체할 수 있습니다.

동일한 이름의 노드와 함께

교체 노드에 동일한 이름을 사용하려면 리포지터리 검증기를 사용하여 리포지터리를 스캔하고 더 이상 필요하지 않은 메타데이터 레코드를 제거합니다. 교체된 리포지터리의 검증을 매뉴얼으로 우선 순위를 부여하여 프로세스를 가속화합니다.

다른 이름의 노드와 함께

다른 이름을 사용하여 Gitaly 클러스터의 교체 노드에 대한 단계는 사용자 정의 복제 팩터를 설정했는지에 따라 다릅니다.

사용자 정의 복제 팩터 설정

사용자 정의 복제 팩터가 설정되어 있는 경우, 새로운 리포지터리가 할당되도록 각 리포지터리의 복제 팩터를 다시 설정하기 위해 praefect set-replication-factor를 사용합니다. 예시:

$ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml set-replication-factor -virtual-storage default -relative-path @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git -replication-factor 2

현재 할당: gitaly-1, gitaly-2

새 Gitaly 노드를 구성한 후 이전 리포지터리의 모든 리포지터리를 새로운 리포지터리로 재할당하려면:

  1. Praefect 데이터베이스에 연결합니다:

    /opt/gitlab/embedded/bin/psql -h <psql 호스트> -U <사용자> -d <데이터베이스 이름>
    
  2. repository_assignments 테이블을 업데이트하여 이전 Gitaly 노드 이름(예: old-gitaly)을 새 Gitaly 노드 이름(예: new-gitaly)으로 교체합니다:

    UPDATE repository_assignments SET storage='new-gitaly' WHERE storage='old-gitaly';
    
기본 복제 팩터

기본 복제 팩터를 사용하는 경우, 구성에서 노드를 교체합니다. 이전 노드의 상태는 Praefect 데이터베이스에 유지되지만 무시됩니다.

주 노드 고장

  • GitLab 13.0에서 도입된 Gitaly 클러스터는, 주 노드로부터의 미복제 쓰기가 가장 적은 보조 노드를 새 주 노드로 선출합니다. 여전히 미복제 쓰기가 발생할 수 있으므로 데이터 손실이 발생할 수 있습니다.
  • GitLab 14.1에서 주 노드 고장 복구 지원이 추가되었습니다.

Gitaly 클러스터는 실패한 주 Gitaly 노드를 건강한 보조 노드로 승격하여 새 주 노드로 만듭니다. Gitaly 클러스터는:

  • 리포지터리의 완전히 최신 사본을 가진 건강한 보조 를 새 주 노드로 선출합니다.
  • 건강한 보조 노드에 리포지터리의 완전히 최신 사본이 없는 경우, 리포지터리는 이용 불가능해집니다.

사용 불가능한 리포지터리

  • GitLab 13.0부터 14.0까지, 주 노드에서는 최신 상태가 아니지만 건강한 보조에서는 완전히 최신 상태인 리포지터리는 읽기 전용이 됩니다. 이 기간을 통해, dataloss 하위 명령은 기본적으로 읽기 전용 리포지터리를 표시합니다.
  • GitLab 14.1부터, Praefect에는 즉시 실패 구로로 전환하여 리포지터리를 읽기 전용 모드로 처리하는 대신 완전히 최신 상태의 두 번째 보조 중 하나로 즉시 전환하는 더 반응이 뛰어난 장애 조치 로직이 포함되었습니다. GitLab 14.1부터, dataloss 하위 명령은 건강한 Gitaly 노드에 완전히 최신 사본이 없어 이용 불가능한 리포지터리를 표시합니다.

모든 완전히 최신 사본이 사용 불가능한 경우 리포지터리가 사용 불가능합니다. 사용 불가능한 리포지터리는 자동화된 도구를 망가뜨릴 수 있는 오래된 데이터를 제공하지 않도록 하기 위해 Praefect를 통해 접근할 수 없습니다.

데이터 손실 확인

Praefect dataloss 하위 명령은 다음을 식별합니다:

  • GitLab 13.0에서 14.0까지, 아마도 최신 상태가 아닌 리포지터리의 사본입니다. 이는 장애로 인한 잠재적인 데이터 손실을 식별하는데 도움이 될 수 있습니다.
  • GitLab 14.1 이후, 사용 불가능한 리포지터리입니다. 이는 잠재적인 데이터 손실 및 모든 완전히 최신 사본 복사본이 사용 불가능하기 때문에 더 이상 접근할 수 없는 리포지터리를 식별하는 데 도움이 됩니다.

다음 매개변수가 사용 가능합니다:

  • -virtual-storage는 어느 가상 리포지터리를 확인할지 지정합니다. 관리자 개입이 필요할 수 있으므로 기본 동작은 다음을 표시합니다:
    • GitLab 13.0에서 14.0까지는 읽기 전용 리포지터리의 사본.
    • GitLab 14.1 이후는 사용 불가능한 리포지터리.
  • GitLab 14.1 이후, -partially-unavailable는 사용 가능하지만 일부 할당된 사본을 사용할 수 없는 리포지터리를 출력에 포함할지 여부를 지정합니다.
note
dataloss는 여전히 베타이며 출력 형식이 변경될 수 있습니다.

현재 주 노드의 오래된 사본 또는 사용 불가능한 리포지터리를 확인하려면 다음 명령을 실행합니다:

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <가상 리포지터리>]

지정하지 않으면 모든 구성된 가상 리포지터리가 확인됩니다:

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss

각 리포지터리에 대한 출력에는 다음이 나열됩니다:

  • 리포지터리의 상대적인 경로는 리포지터리를 식별하고 관련 정보를 그룹화합니다.
  • 현재 상태는 디스크 경로 옆에 괄호 안에 출력됩니다:
    • GitLab 13.0에서 14.0까지, 리포지터리의 주 노드가 최신 상태가 아닐 경우 (읽기 전용)이 출력되며 쓰기를 수락할 수 없습니다. 그렇지 않으면 (쓰기 가능)이 출력됩니다.
    • GitLab 14.1 이후, 디스크 경로 옆에 (사용 불가능함)이 출력됩니다.
  • 주 필드는 리포지터리의 현재 주를 나열합니다. 리포지터리에 주가 없으면 주 없음이 표시됩니다.
  • 동기화된 리포지터리는 최신 성공적인 쓰기와 그 이전 모든 쓰기를 복제한 사본을 나열합니다.
  • 오래된 리포지터리는 리포지터리의 오래된 사본을 포함하는 사본을 나열합니다. 리포지터리가 없는 사본을 포함해야 하는데 그렇지 않은 경우에도 여기에 나열됩니다. 사본이 누락한 변경의 최대 수가 사본 옆에 나열됩니다. 오래된 사본은 완전히 최신 상태이거나 나중의 변경을 포함할 수 있지만 Praefect는 보장하지 않을 수 있음에 유의해야 합니다.

추가 정보는 다음을 포함합니다:

  • 리포지터리를 호스트로 할당해야 하는 노드나 각 노드의 상태가 나열됩니다. 리포지터리를 저장할당된 노드 옆에 할당된 호스트가 표시됩니다. 노드에 리포지터리의 사본이 있지만 리포지터리를 저장할당받지는 않은 경우 텍스트가 누락됩니다. 이러한 사본들은 Praefect에 의해 동기화되지 않지만 할당된 사본들을 최신 상태로 만들기 위해 복제 소스로 작용할 수 있습니다.
  • GitLab 14.1 이후, 즉 건강하지 않은 Gitaly 노드에 위치한 사본에 unhealthy가 출력됩니다.

출력 예시:

가상 리포지터리: default
  오래된 리포지터리:
    @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git (사용 불가능함):
      주: gitaly-1
      동기화된 리포지터리:
        gitaly-2, 할당된 호스트, 건강하지 않음
      오래된 리포지터리:
        gitaly-1은 3개 이하의 변경을 따라잡지 않았으며, 할당된 호스트
        gitaly-3은 3개 이하의 변경을 따라잡지 않았습니다

모든 리포지터리가 사용 가능한 경우 확인이 출력됩니다. 예시:

가상 리포지터리: default
  모든 리포지터리가 사용 가능합니다!

사용 가능한 리포지터리의 사용 불가능한 레플리카

  • GitLab 14.0에서 도입되었으며, 플래그가 -partially-replicated로 이름이 변경되었으며 동작이 변경되었습니다.

일부 할당된 노드에서 사용 가능하지만 어떤 이유로 사용 불가능한 리포지터리의 정보도 나열하려면, -partially-unavailable 플래그를 사용하세요.

리포지터리는 건강하고 최신 상태인 레플리카가 있는 경우에 사용 가능합니다. 할당된 보조 레플리카 중 일부는 최신 변경 사항을 복제하는 동안 일시적으로 접근할 수 없을 수 있습니다.

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <가상-리포지터리>] [-partially-unavailable]

예시 출력:

가상 리포지터리: default
  최신이 아닌 리포지터리:
    @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git:
      Primary: gitaly-1
      동기화된 리포지터리:
        gitaly-1, 할당된 호스트
      최신이 아닌 리포지터리:
        gitaly-2가 3개 이하의 변경으로 뒤쳐져 있음, 할당된 호스트
        gitaly-3가 3개 이하의 변경으로 뒤쳐져 있음

-partially-unavailable 플래그를 설정하면, 모든 할당된 레플리카가 완전히 최신 상태이고 건강한 경우 확인 메시지가 출력됩니다.

예시:

가상 리포지터리: default
  모든 리포지터리가 모든 할당된 리포지터리에서 완전히 사용 가능합니다!

리포지터리 체크섬 확인

프로젝트의 리포지터리 체크섬을 모든 Gitaly 노드에서 확인하려면, 주요 GitLab 노드에서 레플리카 Rake 작업을 실행하세요.

데이터 손실 수락

caution
accept-dataloss는 리포지터리의 다른 버전을 덮어쓰며 영구적인 데이터 손실을 초래합니다. 사용하기 전에 데이터 복구 작업을 수행해야 합니다.

최신 상태의 레플리카 중 하나를 다시 온라인 상태로 되살릴 수 없는 경우, 데이터 손실을 수락해야 할 수 있습니다. 데이터 손실을 수락할 때, Praefect는 선택한 리포지터리의 레플리카를 최신 버전으로 표시하고 다른 할당된 Gitaly 노드로 복제합니다. 이 프로세스는 리포지터리의 다른 복사본을 덮어쓰기 때문에 주의가 필요합니다.

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss
-virtual-storage <가상-리포지터리> -relative-path <상대-경로> -authoritative-storage <리포지터리-이름>

쓰기 활성화 또는 데이터 손실 수락

caution
accept-dataloss는 리포지터리의 다른 버전을 덮어쓰며 영구적인 데이터 손실을 초래합니다. 사용하기 전에 데이터 복구 작업을 수행해야 합니다.

Praefect는 쓰기를 다시 활성화하거나 데이터 손실을 수락하기 위해 다음과 같은 하위 명령을 제공합니다. 최신 상태의 노드를 다시 온라인 상태로 되살릴 수 없는 경우, 데이터 손실을 수락해야 할 수 있습니다:

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss -virtual-storage <가상-리포지터리> -relative-path <상대-경로> -authoritative-storage <리포지터리-이름>

데이터 손실을 수락할 때, Praefect:

  1. 선택한 리포지터리의 복사본을 최신 버전으로 표시합니다.
  2. 다른 할당된 Gitaly 노드로 복사본을 복제합니다. 이 프로세스는 리포지터리의 다른 복사본을 덮어쓰기 때문에 주의가 필요합니다.

데이터 복구

Gitaly 노드가 어떤 이유로 복제 작업을 실패하면, 해당 리포지터리의 오래된 버전을 호스팅하게 됩니다. Praefect는 다음과 같은 작업을 수행합니다:

  • 자동 조정, GitLab 13.4 이상.
  • 매뉴얼 조정:
    • GitLab 13.3 이하.
    • repositories 테이블에 항목이 없는 상태에서 GitLab 13.4 이상으로 업그레이드된 리포지터리. GitLab 13.6 이상에서는 이러한 리포지터리에 대해 마이그레이션이 실행됩니다Praefect가 시작될 때.

이러한 작업은 오래된 리포지터리를 완전히 최신 상태로 되살리기 위해 수행됩니다.

자동 조정

Praefect는 최신 상태가 아닌 리포지터리를 자동으로 되살리합니다. 기본적으로 이는 매 5분마다 수행됩니다. 건강한 Gitaly 노드의 각 오래된 리포지터리에 대해, Praefect는 다른 건강한 Gitaly 노드의 무작위로 완전히 최신 상태의 리피지카를 선택하여 그것으로부터 복제를 합니다. 복제 작업은 대상 리포지터리에 대해 대기 중인 다른 복제 작업이 없는 경우에만 예약됩니다.

조정 빈도는 구성을 통해 변경할 수 있습니다. 값은 유효한 Go 지속 시간 값일 수 있습니다. 0 이하의 값은 기능을 비활성화합니다.

예시:

praefect['configuration'] = {
   # ...
   reconciliation: {
      # ...
      scheduling_interval: '5m', # 기본 값
   },
}
praefect['configuration'] = {
   # ...
   reconciliation: {
      # ...
      scheduling_interval: '30s', # 30초마다 조정
   },
}
praefect['configuration'] = {
   # ...
   reconciliation: {
      # ...
      scheduling_interval: '0', # 기능 비활성화
   },
}

매뉴얼 조정

caution
reconcile 하위 명령어는 GitLab 14.1에서 제거되었습니다. 자동 조정을 대신 사용하세요. 매뉴얼 조정은 과도한 복제 작업을 생성할 수 있으며 기능이 제한됩니다. 리포지터리별 기본 노드가 활성화된 경우 매뉴얼 조정이 작동하지 않습니다.

Praefect reconcile 하위 명령어는 두 Gitaly 노드간의 매뉴얼 조정을 허용합니다. 이 명령은 후속 리포지터리의 모든 리포지터리를 기준 리포지터리의 최신 버전으로 대상 리포지터리로 복제합니다.

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml reconcile -virtual <가상-리포지터리> -reference <최신-리포지터리> -target <오래된-리포지터리> -f
  • <가상-리포지터리> 플레이스홀더를 해당 Gitaly 노드 리포지터리를 확인할 가상 리포지터리로 교체합니다.
  • <최신-리포지터리> 플레이스홀더를 최신 상태의 리포지터리를 포함한 Gitaly 리포지터리 이름으로 교체합니다.
  • <오래된-리포지터리> 플레이스홀더를 오래된 리포지터리를 포함한 Gitaly 리포지터리 이름으로 교체합니다.

매뉴얼으로 리포지터리 제거하기

remove-repository Praefect 서브 명령어는 Gitaly 클러스터에서 리포지터리 및 해당 리포지터리와 관련된 모든 상태를 제거합니다:

  • 모든 관련 Gitaly 노드의 디스크 리포지터리.
  • Praefect가 추적하는 모든 데이터베이스 상태.

GitLab 14.6 이후, 기본적으로 명령어는 드라이 실행 모드로 작동합니다. 이전 버전에서는 이 모드를 지원하지 않았습니다. 예를 들어:

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml remove-repository -virtual-storage <가상-리포지터리> -relative-path <리포지터리>
  • <가상-리포지터리>를 해당 리포지터리를 포함하는 가상 리포지터리의 이름으로 바꿉니다.
  • <리포지터리>를 제거할 리포지터리의 상대적인 경로로 바꿉니다.
  • GitLab 15.3 이후, 디스크에 있는 리포지터리를 제거하지 않고 Praefect 추적 데이터베이스 항목만 제거하려면 -db-only를 추가합니다. 장애로 데이터베이스 항목이 삭제된 경우, 이 명령어를 사용하여 리포지터리를 다시 추적합니다.
  • GitLab 14.6 이후, 드라이 실행 모드 밖에서 명령어를 실행하고 리포지터리를 제거하기 위해 -apply를 추가합니다. 예를 들어:

    sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml remove-repository -virtual-storage <가상-리포지터리> -relative-path <리포지터리> -apply
    
  • -virtual-storage는 리포지터리가 위치한 가상 리포지터리입니다. 가상 리포지터리는 /etc/gitlab/gitlab.rb에서 praefect['configuration']['virtual_storage']로 구성되며 다음과 유사합니다:

    praefect['configuration'] = {
      # ...
      virtual_storage: [
        {
          # ...
          name: 'default',
        },
        {
          # ...
          name: 'storage-1',
        },
      ],
    }
    

    이 예에서 지정할 가상 리포지터리는 default 또는 storage-1입니다.

  • -repository는 리포지터리의 해시된 리포지터리를 나타내는 상대적인 경로입니다. 예를 들어:

    @hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git
    

remove-repository를 실행한 후에도 리포지터리 일부가 남을 수 있습니다. 이는 다음과 같은 이유 때문일 수 있습니다:

  • 삭제 오류.
  • 해당 리포지터리를 대상으로 하는 진행 중인 RPC 호출.

이런 경우 remove-repository를 다시 실행합니다.

Praefect 추적 데이터베이스 유지보수

Praefect 추적 데이터베이스에 대한 일반적인 유지보수 작업이 이 섹션에 문서화되어 있습니다.

추적되지 않은 리포지터리 디렉터리

list-untracked-repositories Praefect 서브 명령어는 다음을 만족하는 Gitaly 클러스터 리포지터리를 나열합니다:

  • 하나 이상의 Gitaly 리포지터리에 존재합니다.
  • Praefect 추적 데이터베이스에 추적되지 않습니다.

-older-than 옵션을 추가하여 다음을 표시하지 않습니다:

  • 생성 중인 리포지터리.
  • Praefect 추적 데이터베이스에 아직 기록되지 않은 리포지터리.

<duration>을 지정된 시간 기간(예: 5s, 10m, 또는 1h)으로 바꿉니다. 기본값은 6h입니다.

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories -older-than <지속시간>

지정한 기간보다 이전에 생성된 리포지터리만 고려됩니다.

해당 명령어는 다음을 출력합니다:

  • STDOUT와 명령어의 로그 결과.
  • STDERR에 발생하는 오류.

각 항목은 JSON 문자열을 완전한 줄바꿈으로 출력합니다. 예시:

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories
{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567890.git"}
{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567891.git"}

추적 데이터베이스에 개별 리포지터리 매뉴얼 추가

caution
알려진 문제로 인해 Praefect가 생성한 복제 경로중 (@cluster) 경로로 생성된 리포지터리를 Praefect 추적 데이터베이스에 추가할 수 없습니다. 이러한 리포지터리는 GitLab에서 사용하는 리포지터리 경로와 연결되어 있지 않으며 접근할 수 없습니다.

track-repository Praefect 서브 명령어는 디스크에 있는 리포지터리를 Praefect 추적 데이터베이스에 추적 대상으로 추가합니다.

sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml track-repository -virtual-storage <가상-리포지터리> -authoritative-storage <리포지터리-이름> -relative-path <리포지터리> -replica-path <디스크-경로> -replicate-immediately
  • -virtual-storage는 리포지터리가 위치한 가상 리포지터리입니다. 가상 리포지터리는 /etc/gitlab/gitlab.rb에서 praefect['configuration'][:virtual_storage]로 구성되며 다음과 유사합니다:

    praefect['configuration'] = {
      # ...
      virtual_storage: [
        {
          # ...
          name: 'default',
        },
        {
          # ...
          name: 'storage-1',
        },
      ],
    }
    

    이 예에서 지정할 가상 리포지터리는 default 또는 storage-1입니다.

  • -relative-path는 가상 리포지터리에 있는 상대적인 경로입니다. 보통은 해시된 리포지터리로 시작합니다. 예를 들어:

    @hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git
    
  • -replica-path는 물리적 리포지터리에 있는 상대 경로입니다. @cluster로 시작하거나 relative_path와 일치합니다.
  • -authoritative-storage는 Praefect가 기본적으로 취급할 리포지터리입니다. 리포지터리별 복제가 복제 전략으로 설정된 경우 필요하며 선택사항입니다.
  • -replicate-immediately는 GitLab 14.6 이후에 사용 가능하며 명령어가 리포지터리를 즉시 둘째 세컨더리에 복제하도록 합니다. 그렇지 않은 경우, 복제 작업은 데이터베이스에서 실행되도록 예약되며 Praefect 백그라운드 프로세스가 수행합니다.

해당 명령어는 다음을 출력합니다:

  • STDOUT와 명령어의 로그 결과.
  • STDERR에 발생하는 오류.

이 명령어는 다음의 경우에 실패합니다:

  • 이미 Praefect 추적 데이터베이스에서 해당 리포지터리가 추적되고 있는 경우.
  • 리포지터리가 디스크에 존재하지 않는 경우.

매뉴얼으로 데이터베이스에 여러 리포지터리 매뉴얼 추가

caution
Praefect 생성된 복제 경로로 Praefect 추적 데이터베이스에 리포지터리를 추가할 수 없습니다. 이러한 리포지터리는 GitLab이 사용하는 리포지터리 경로와 관련이 없으며 접근할 수 없습니다.

API를 사용하여 마이그레이션하는 경우 리포지터리가 자동으로 Praefect 추적 데이터베이스에 추가됩니다.

대신 기존 인프라에서 리포지터리를 매뉴얼으로 복사하는 경우 track-repositories Praefect 하위 명령어를 사용할 수 있습니다. 이 하위 명령어는 디스크에 대량의 리포지터리를 Praefect 추적 데이터베이스에 추가합니다.

# Omnibus GitLab 설치
sudo gitlab-ctl praefect track-repositories --input-path /path/to/input.json

# 소스 설치
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml track-repositories -input-path /path/to/input.json

이 명령은 다음 사항을 확인합니다.

  • 올바르게 포맷되어 필수 필드를 포함하는지 확인합니다.
  • 디스크에 있는 유효한 Git 리포지터리와 일치하는지 확인합니다.
  • Praefect 추적 데이터베이스에서 추적되지 않는지 확인합니다.

이러한 확인 작업에 실패하는 항목이 있는 경우 명령은 리포지터리를 추적하려 시도하기 전에 중단됩니다.

  • input-path는 줄 바꿈으로 구분된 JSON 객체 디렉터리을 포함하는 파일의 경로입니다. 객체는 다음 키를 포함해야 합니다:
    • relative_path: track-repository에서 repository와 일치합니다.
    • authoritative-storage: Praefect가 기본으로 취급해야 하는 리포지터리입니다.
    • virtual-storage: 리포지터리가 위치한 가상 리포지터리입니다.

      예시:

      {"relative_path":"@hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b.git","replica_path":"@cluster/fe/d3/1","authoritative_storage":"gitaly-1","virtual_storage":"default"}
      {"relative_path":"@hashed/f8/9f/f89f8d0e735a91c5269ab08d72fa27670d000e7561698d6e664e7b603f5c4e40.git","replica_path":"@cluster/7b/28/2","authoritative_storage":"gitaly-2","virtual_storage":"default"}
      
  • -replicate-immediately는 명령을 즉시 보조 기기에 복제하도록합니다. 그렇지 않으면 복제 작업은 데이터베이스에서 예약되어 Praefect 백그라운드 프로세스에서 수행됩니다.

가상 리포지터리 세부정보 나열

list-storages Praefect 하위 명령은 가상 리포지터리와 관련된 리포지터리 노드를 나열합니다. 가상 리포지터리가 다음과 같은 경우:

  • -virtual-storage를 사용하여 지정된 가상 리포지터리로만 리포지터리 노드를 나열합니다.
  • 지정되지 않으면 모든 가상 리포지터리와 해당하는 리포지터리 노드가 테이블 형식으로 나열됩니다.
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-storages -virtual-storage <가상_리포지터리_이름>

이 명령은 다음을 출력합니다.

  • STDOUT 및 명령의 로그 결과
  • STDERR에 발생한 오류