백업 및 복원

이 문서는 CNG로의 백업 및 복원의 기술적 구현을 설명합니다.

Toolbox 팟

Toolbox 차트는 클러스터에 팟을 배포합니다. 이 팟은 클러스터 내 다른 컨테이너와 상호 작용하기 위한 진입점 역할을 수행합니다.

이 팟을 사용하여 사용자는 kubectl exec -it <pod 이름> -- <임의의 명령>을 사용하여 명령을 실행할 수 있습니다.

Toolbox는 Toolbox 이미지에서 컨테이너를 실행합니다.

해당 이미지에는 사용자가 명령으로 호출할 일부 사용자 정의 스크립트가 포함되어 있습니다. 이러한 스크립트는 Rake 작업, 백업, 복원 및 객체 스토리지와 상호 작용하는 일부 보조 스크립트입니다.

백업 유틸리티

백업 유틸리티는 Toolbox 컨테이너의 스크립트 중 하나이며 이름에서 알 수 있듯이 백업을 수행하지만 기존 백업의 복원도 처리합니다.

백업

백업 유틸리티 스크립트는 인수 없이 실행되면 백업 tar를 생성하고 객체 저장소에 업로드합니다.

실행 순서

다음 단계를 통해 백업이 수행됩니다.

  1. GitLab 백업 Rake 작업을 사용하여 데이터베이스를 백업합니다 (생략되지 않은 경우).
  2. GitLab 백업 Rake 작업을 사용하여 저장소를 백업합니다 (생략되지 않은 경우).
  3. 객체 저장소 백엔드마다
    • 해당 객체 저장소 백엔드를 건너띄도록 표시된 경우, 해당 저장소 백엔드를 건너뜁니다.
    • 해당 객체 저장소 버킷의 기존 데이터를 <버킷 이름>.tar로 지정하여 tar합니다.
    • tar를 디스크의 백업 위치로 이동합니다.
  4. GitLab 버전, 백업 시간 및 건너뛴 항목을 식별하는 일부 메타데이터를 포함하는 backup_information.yml 파일을 작성합니다.
  5. backup_information.yml 및 개별 tar 파일을 포함하는 tar 파일을 만듭니다.
  6. 결과 tar 파일을 객체 저장소 gitlab-backups 버킷에 업로드합니다.

커맨드 라인 인수

  • --skip <구성 요소>

    백업 프로세스에서 건너뛰고 싶은 각 구성 요소에 대해 --skip <구성 요소>를 사용하여 해당 구성 요소를 건너뛸 수 있습니다. 건너뛸 수 있는 구성 요소는 백업에서 특정 데이터 제외에서 찾을 수 있습니다.

  • -t <타임스탬프 재지정 값>

    이 플래그를 지정하면 생성된 백업의 이름이 <타임스탬프 재지정 값>_gitlab_backup.tar로 지정됩니다. 기본값은 현재 UNIX 타임스탬프이며, 이를 YYYY_mm_dd 형식으로 현재 날짜로 후위가 붙은 값으로 포맷합니다.

  • --backend <백엔드>

    백업에 사용할 객체 저장소 백엔드를 구성합니다. s3 또는 gcs 중 하나일 수 있습니다. 기본값은 s3입니다.

  • --storage-class <스토리지 클래스 이름>

    백업이 저장되는 스토리지 클래스를 --storage-class <스토리지 클래스 이름>을 사용하여 지정할 수도 있으며, 이를 통해 백업 저장 공간 비용을 절약할 수 있습니다. 미지정시 해당 백엔드의 기본값을 사용합니다.

    참고: 이 스토리지 클래스 이름은 지정된 백엔드의 스토리지 클래스 인수로 그대로 전달됩니다.

GitLab 백업 버킷

백업을 저장할 기본 버킷의 이름은 gitlab-backups입니다. 이는 BACKUP_BUCKET_NAME 환경 변수를 사용하여 구성할 수 있습니다.

Google Cloud Storage로 백업

백업 유틸리티는 기본적으로 s3cmd를 사용하여 객체 저장소에서 아티팩트를 업로드하고 다운로드합니다. Google Cloud Storage (GCS)에서도 작동할 수 있지만, 원치 않는 보안 및 권한 부정 협상을 필요로 하는 Interoperability API를 사용합니다. 백업에 Google Cloud Storage를 사용할 때 백업 유틸리티 스크립트를 BACKUP_BACKEND 환경 변수를 gcs로 설정하여 아티팩트의 업로드 및 다운로드에 Cloud Storage 기본 CLI 인 gsutil을 사용하도록 구성할 수 있습니다.

복원

백업 유틸리티는 --restore 인수가 주어지면 실행 중인 인스턴스로부터 기존 백업을 복원을 시도합니다. 이 백업은 Linux 패키지 설치 또는 CNG Helm 차트 설치 중 어느쪽이든 상관없이 백업된 인스턴스와 실행 중인 인스턴스가 동일한 GitLab 버전을 실행하는 경우에 해당합니다. 복원은 -t <백업 이름> 또는 -f <url>을 사용하여 백업 버킷에 있는 파일 또는 원격 URL에서 기대합니다.

-t 매개변수가 주어지면 해당하는 이름의 백업 tar를 객체 저장소의 백업 버킷에 찾습니다. -f 매개변수가 주어지면 해당 URL이 컨테이너에서 액세스할 수 있는 위치에 있는 백업 tar의 유효한 URI임을 기대합니다.

백업 tar를 가져온 후 다음과 같은 실행 순서가 이루어집니다:

  1. 저장소와 데이터베이스에 대해 GitLab 백업 Rake 작업을 실행합니다.
  2. 각 객체 저장소 백엔드에 대해:
    • 해당하는 객체 저장소 버킷의 기존 데이터를 <백업 이름>.tar로 지정하여 tar합니다.
    • 객 저장소의 tmp 버킷에 업로드합니다.
    • 해당하는 버킷을 정리합니다.
    • 해당하는 버킷으로 백업 내용을 복원합니다.

참고: 복원에 실패하는 경우 사용자는 백업 버킷의 tmp 디렉토리에서 이전 백업을 사용하여 복구해야 합니다. 현재 이는 수동 작업입니다.