백업 및 복원

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

Toolbox 팟

Toolbox 차트는 클러스터에 팟을 배포합니다. 이 팟은 클러스터 내 다른 컨테이너와의 상호 작용 지점으로 작동합니다.

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

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

해당 이미지에는 사용자가 명령어로 호출할 몇 가지 사용자 정의 스크립트가 포함되어 있습니다. 이러한 스크립트는 Rake 작업, 백업, 복원 및 객체 저장소와의 상호 작용을 위한 도우미 스크립트입니다.

백업 유틸리티

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

백업

백업 유틸리티 스크립트를 매개변수 없이 실행하면 백업 tar를 만들고 객체 저장소에 업로드합니다.

실행 순서

다음과 같은 단계로 백업이 수행됩니다.

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

커맨드 라인 인수

  • --skip <component>

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

  • -t <timestamp-override-value>

    이 플래그를 지정하면 생성된 백업은 <timestamp-override-value>_gitlab_backup.tar로 이름이 지어집니다. 기본값은 현재의 UNIX 타임스탬프이며, 이를 YYYY_mm_dd 형식으로 변환한 현재 날짜를 뒤에 붙인 값입니다.

  • --backend <backend>

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

  • --storage-class <storage-class-name>

    또한 백업이 저장되는 스토리지 클래스를 지정할 수 있으며, 이를 통해 백업 저장 비용을 절약할 수 있습니다. 미지정 시 백엔드의 기본값을 사용합니다.

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

GitLab 백업 버킷

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

Google Cloud Storage로 백업

기본적으로 백업 유틸리티는 객체 저장소에서 아티팩트를 업로드하고 다운로드하기 위해 s3cmd를 사용합니다. 이는 Google Cloud Storage (GCS)와 함께 작동할 수 있지만, 인터퍼러빌리티 API를 사용하여 원하지 않는 인증 및 권한 부분에서 협상을 해야 합니다. 백업에 Google Cloud Storage를 사용할 때 BACKUP_BACKEND 환경 변수를 gcs로 설정하여 백업 유틸리티 스크립트가 클라우드 스토리지용 네이티브 CLI인 gsutil을 사용하도록 구성할 수 있습니다.

복원

인수 --restore를 주면 백업 유틸리티는 실행 중인 인스턴스로 기존 백업을 복원하려고 시도합니다. 이 백업은 Linux 패키지 설치이거나 CNG Helm 차트 설치에서 얻을 수 있으며, 복원 대상 백업 인스턴스와 실행 중인 인스턴스가 모두 동일한 GitLab 버전을 실행 중이어야 합니다. 복원은 백업 버킷에 있는 -t <백업-이름> 파일이나 -f <URL>을 사용한 원격 URL의 파일을 예상합니다.

-t 매개변수가 주어지면 백업 버킷에서 해당 이름의 백업 타르를 확인합니다.
-f 매개변수가 주어지면 주어진 URL이 컨테이너에서 액세스할 수 있는 위치에 있는 백업 타르의 유효한 URI임을 예상합니다.

백업 타르를 가져온 후 실행 순서는 다음과 같습니다:

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

참고: 복원에 실패하면 사용자는 백업 버킷의 tmp 디렉토리에 있는 데이터를 사용하여 이전 백업으로 되돌아가야 합니다. 현재 이 과정은 수동으로 이루어집니다.