백업 및 복원

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

Toolbox pod

toolbox 차트는 클러스터에 pod를 배포합니다. 이 pod는 클러스터 내의 다른 컨테이너와 상호 작용하기 위한 입구 점으로 작동합니다.

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

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

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

백업 유틸리티

백업 유틸리티는 스크립트 중 하나입니다.

백업

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

실행 순서

다음의 단계를 순서대로 백업합니다.

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

명령줄 인수

  • --skip <구성요소>

    백업 프로세스에서 건너뛰고 싶은 모든 컴포넌트에 대해 --skip <component>를 사용하여 백업 프로세스의 일부를 건너뛸 수 있습니다. 건너뛸 수 있는 컴포넌트는 백업에서 특정 데이터 제외하기에서 확인할 수 있습니다.

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

    이 플래그를 지정하면 생성된 백업의 이름이 <타임스탬프-오버라이드-값>_gitlab_backup.tar로 지정되어 백업의 이름을 부분적으로 제어할 수 있습니다. 기본값은 현재 UNIX 타임스탬프이며, YYYY_mm_dd로 형식이 지정된 현재 날짜가 뒤에 붙습니다.

  • --backend <백엔드>

    백업에 사용할 오브젝트 스토리지 백엔드를 구성합니다. s3 또는 gcs일 수 있습니다. 기본값은 s3`입니다.

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

    스토리지 클래스 <스토리지 클래스="" 이름="">`을 사용하여 백업이 저장되는 스토리지 클래스를 지정할 수도 있으므로 백업 스토리지 비용을 절약할 수 있습니다. 지정하지 않으면 스토리지 백엔드의 기본값이 사용됩니다.스토리지>

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

GitLab 백업 버킷

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

Google Cloud Storage에 백업

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

복원

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

-t 매개변수를 입력하면 객체 스토리지의 백업 버킷을 해당 이름의 백업 tar 파일을 찾습니다. -f 매개변수를 입력하면 주어진 URL이 컨테이너에서 접근 가능한 위치에 있는 백업 tar의 유효한 URI임을 기대합니다.

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

  1. 리포지터리와 데이터베이스에 대해 GitLab 백업 Rake 작업 실행
  2. 각각의 객체 스토리지 백엔드에 대해:
    • 해당하는 리포지터리의 기존 데이터를 <백업 이름>.tar로 묶음
    • 이를 객체 스토리지의 tmp 버킷에 업로드
    • 해당 버킷 정리
    • 복원된 백업 내용을 해당 버킷에 복원
note
복원에 실패하면 사용자는 tmp 디렉터리에 있는 데이터를 사용하여 이전 백업으로 복구해야 합니다. 현재 이 작업은 매뉴얼으로 이루어져야 합니다.