백업 및 복원
이 문서에서는 CNG로의 백업 및 복원의 기술적 구현을 설명합니다.
툴박스 포드
툴박스 차트는 클러스터에 포드를 배포합니다. 이 포드는 클러스터의 다른 컨테이너와 상호작용하기 위한 진입점 역할을 합니다.
사용자는 이 포드를 사용하여 kubectl exec -it <pod name> -- <arbitrary command>
명령을 실행할 수 있습니다.
툴박스는 툴박스 이미지에서 컨테이너를 실행합니다.
이미지에는 사용자가 명령으로 호출해야 하는 사용자 정의 스크립트가 포함되어 있습니다. 이러한 스크립트는 Rake 작업 실행, 백업, 복원, 오브젝트 스토리지와 상호작용하기 위한 일부 헬퍼 스크립트 용입니다.
백업 유틸리티
백업 유틸리티는 툴박스 컨테이너 내의 스크립트 중 하나로, 이름에서 알 수 있듯이 백업을 수행하는 데 사용되지만 기존 백업 복원도 처리합니다.
백업
백업 유틸리티 스크립트는 인수 없이 실행될 때 백업 tar를 생성하고 오브젝트 스토리지에 업로드합니다.
실행 순서
백업은 다음 단계에 따라 순서대로 진행됩니다:
- GitLab 백업 Rake 작업을 사용하여 데이터베이스를 백업합니다(건너뛰지 않은 경우).
- GitLab 백업 Rake 작업을 사용하여 저장소를 백업합니다(건너뛰지 않은 경우).
- 각 오브젝트 스토리지 백엔드에 대해
- 오브젝트 스토리지 백엔드가 건너뛰기로 표시되면 이 스토리지 백엔드를 건너뜁니다.
- 해당 오브젝트 스토리지 버킷에서 기존 데이터를 tar로 압축하고
<bucket-name>.tar
로 이름을 지정합니다. - tar 파일을 디스크의 백업 위치로 이동합니다.
- GitLab의 버전, 백업 시간 및 건너뛴 항목을 식별하는 메타데이터를 포함하는
backup_information.yml
파일을 작성합니다. - 개별 tar 파일과 함께
backup_information.yml
을 포함하는 tar 파일을 생성합니다. - 생성된 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>
--storage-class <storage-class-name>
를 사용하여 백업이 저장될 스토리지 클래스를 지정할 수도 있어, 백업 저장 비용을 절약할 수 있습니다. 지정하지 않으면 백엔드의 기본값이 사용됩니다.이 스토리지 클래스 이름은 지정한 백엔드의 스토리지 클래스 인수로 그대로 전달됩니다.
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 <backup-name>
를 사용하여 백업 버킷에서 파일을 기대하거나 -f <url>
을 사용하여 원격 URL에서 파일을 기대합니다.
-t
매개변수가 주어지면 객체 스토리지의 백업 버킷에서 그러한 이름을 가진 백업 tar를 찾습니다.
-f
매개변수가 주어지면, 주어진 URL이 컨테이너에서 접근 가능한 위치에 있는 백업 tar의 유효한 URI여야 함을 기대합니다.
백업 tar를 가져온 후 실행 순서는 다음과 같습니다:
- 리포지토리와 데이터베이스에 대해 GitLab 백업 Rake 작업을 실행합니다.
- 각 오브젝트 스토리지 백엔드에 대해:
- 해당 오브젝트 스토리지 버킷에 있는 기존 데이터를
<backup-name>.tar
라는 이름으로 압축합니다. - 객체 스토리지의
tmp
버킷으로 업로드합니다. - 해당 버킷을 정리합니다.
- 백업 내용을 해당 버킷으로 복원합니다.
- 해당 오브젝트 스토리지 버킷에 있는 기존 데이터를
참고:
복원이 실패하면 사용자는 백업 버킷의 tmp
디렉토리의 데이터를 사용하여 이전 백업으로 되돌려야 합니다. 이는 현재 수동 프로세스입니다.