백업 아카이브 프로세스

백업 명령을 실행하면 백업 스크립트가 GitLab 데이터를 저장할 백업 아카이브 파일을 생성합니다.

아카이브 파일을 생성하려면 백업 스크립트가 다음을 수행합니다.

  1. 증분 백업을 수행할 때 이전 백업 아카이브 파일을 추출합니다.
  2. 백업 아카이브 파일을 업데이트하거나 생성합니다.
  3. 모든 백업 하위 작업을 실행하여:
    • 데이터베이스를 백업합니다.
    • Git 저장소를 백업합니다.
    • 파일을 백업합니다.
  4. 백업 스테이징 영역을 tar 파일로 아카이빙합니다.
  5. 구성되어 있다면 새 백업 아카이브를 객체 스토리지에 업로드합니다.
  6. 아카이브된 백업 스테이징 디렉터리 파일을 정리합니다.

데이터베이스 백업

데이터베이스를 백업하기 위해 db 하위 작업은 다음을 수행합니다.

  1. pg_dump를 사용하여 SQL 덤프를 생성합니다.
  2. pg_dump의 출력을 gzip을 통해 압축된 SQL 파일을 생성합니다.
  3. 파일을 백업 스테이징 디렉터리에 저장합니다.

Git 저장소 백업

Git 저장소를 백업하기 위해 repositories 하위 작업은 다음을 수행합니다.

  1. 백업할 저장소를 gitaly-backup에 알립니다.
  2. gitaly-backup을 실행하여:

    • Gitaly에서 일련의 원격 프로시저 호출 (RPC)을 호출합니다.
    • 각 저장소에 대한 백업 데이터를 수집합니다.
  3. 수집된 데이터를 백업 스테이징 디렉터리에 있는 디렉터리 구조로 스트리밍합니다.

다음 다이어그램은 이 프로세스를 설명합니다.

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram box 백업 호스트 participant 저장소 하위 작업 participant gitaly-backup end 저장소 하위 작업->>+gitaly-backup: 저장소 목록 loop 각 저장소 gitaly-backup->>+Gitaly: ListRefs 요청 Gitaly->>-gitaly-backup: Git 참조 목록 gitaly-backup->>+Gitaly: CreateBundleFromRefList 요청 Gitaly->>-gitaly-backup: Git 번들 파일 gitaly-backup->>+Gitaly: GetCustomHooks 요청 Gitaly->>-gitaly-backup: 사용자 지정 후크 아카이브 end gitaly-backup->>-저장소 하위 작업: 성공/실패

Gitaly 클러스터 구성 스토리지는 독립적인 Gitaly 인스턴스와 같은 방식으로 백업됩니다.

  • Gitaly 클러스터가 gitaly-backup으로부터 RPC 호출을 받으면 자체 데이터베이스를 다시 작성합니다.
    • Gitaly 클러스터 데이터베이스를 별도로 백업할 필요가 없습니다.
  • 백업은 RPC를 통해 작동하기 때문에 복제 요소와 무관하게 각 저장소는 한 번만 백업됩니다.

서버 측 백업

서버 측 저장소 백업은 Git 저장소를 백업하는 효율적인 방법입니다. 이 방법의 장점은 다음과 같습니다.

  • 데이터가 Gitaly으로부터 RPC를 통해 전송되지 않습니다.
  • 서버 측 백업은 네트워크 전송이 적게 필요합니다.
  • 백업 Rake 작업을 실행하는 기계의 디스크 저장 공간이 필요하지 않습니다.

서버 측 Gitaly를 백업하기 위해 repositories 하위 작업은 다음을 수행합니다.

  1. 각 저장소에 대해 단일 RPC 호출을 만들기 위해 gitaly-backup을 실행합니다.
  2. 물리적 저장소를 보관하는 Gitaly 노드를 트리거하여 백업 데이터를 객체 스토리지에 업로드합니다.
  3. 백업 ID를 사용하여 객체 스토리지에 저장된 백업을 생성한 백업 아카이브에 연결합니다.

다음 다이어그램은 이 프로세스를 설명합니다.

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram box 백업 호스트 participant 저장소 하위 작업 participant gitaly-backup end 저장소 하위 작업->>+gitaly-backup: 저장소 목록 loop 각 저장소 gitaly-backup->>+Gitaly: BackupRepository 요청 Gitaly->>+객체-스토리지: Git 참조 파일 객체-스토리지->>-Gitaly: 성공/실패 Gitaly->>+객체-스토리지: Git 번들 파일 객체-스토리지->>-Gitaly: 성공/실패 Gitaly->>+객체-스토리지: 사용자 지정 후크 아카이브 객체-스토리지->>-Gitaly: 성공/실패 Gitaly->>+객체-스토리지: 백업 매니페스트 파일 객체-스토리지->>-Gitaly: 성공/실패 Gitaly->>-gitaly-backup: 성공/실패 end gitaly-backup->>-저장소 하위 작업: 성공/실패

파일 백업

다음 하위 작업은 파일을 백업합니다.

  • uploads: 첨부 파일
  • builds: CI/CD 작업 출력 로그
  • artifacts: CI/CD 작업 아티팩트
  • pages: 페이지 내용
  • lfs: LFS 객체
  • terraform_state: Terraform 상태
  • registry: 컨테이너 레지스트리 이미지
  • packages: 패키지
  • ci_secure_files: 프로젝트 수준 보안 파일
  • external_diffs: 병합 요청 차이 (외부 저장 시)

각 하위 작업은 작업별 디렉터리에서 파일의 집합을 식별하고 다음을 수행합니다.

  1. tar 유틸리티를 사용하여 식별된 파일의 아카이브를 생성합니다.
  2. gzip을 통해 아카이브를 압축하고 디스크에 저장하지 않습니다.
  3. tar 파일을 백업 스테이징 디렉터리에 저장합니다.

라이브 인스턴스에서 백업이 생성되기 때문에 백업 프로세스 중에 파일이 수정될 수 있습니다. 이 경우 대체 전략을 사용하여 파일을 백업할 수 있습니다. rsync 유틸리티는 백업할 파일의 사본을 생성하고 아카이빙을 위해 이를 tar로 전달합니다.

참고: 이 전략을 사용하는 경우 백업 Rake 작업을 실행하는 기계에는 복사된 파일과 압축된 아카이브의 양 모두에 충분한 저장 공간이 있어야 합니다.

백업 ID

백업 ID는 백업 아카이브의 고유 식별자입니다. 여러 백업 아카이브가 이용 가능한 경우 GitLab을 복원해야하는 상황에서 중요합니다.

백업 아카이브는 config/gitlab.yml 파일의 backup_path 설정에서 지정된 디렉터리에 저장됩니다. 기본 위치는 /var/opt/gitlab/backups입니다.

백엥 ID는 다음으로 구성됩니다.

  • 백업 생성의 타임스탬프
  • 날짜 (YYYY_MM_DD)
  • GitLab 버전
  • GitLab 에디션

다음은 백업 ID의 예시입니다: 1493107454_2018_04_25_10.6.4-ce

백업 파일 이름

기본적으로 파일 이름은 <백업-id>_gitlab_backup.tar 구조를 따릅니다. 예를 들어, 1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar와 같습니다.

백업 정보 파일

백업 정보 파일인 backup_information.yml은 백업에 포함되지 않은 모든 백업 입력을 저장합니다. 이 파일은 백업 스테이징 디렉토리에 저장됩니다. 하위 작업은 이 파일을 사용하여 백업된 데이터를 복원하고 외부 서비스(예: 서버 측 저장소 백업)와 링크하는 방법을 결정합니다.

백업 정보 파일에는 다음이 포함됩니다:

  • 백업 생성 시간
  • 백업을 생성한 GitLab 버전
  • 기타 지정된 옵션. 예: 스킵된 하위 작업

백업 스테이징 디렉토리

백업 스테이징 디렉토리는 백업 및 복원 프로세스 중에 사용되는 임시 저장 위치입니다. 이 디렉토리는 다음을 수행합니다:

  • GitLab 백업 아카이브를 생성하기 전에 백업 자료를 저장합니다.
  • 백업 아카이브를 복원하거나 증분적 백업을 생성하기 전에 백업 아카이브를 추출합니다.

백업 스테이징 디렉토리는 완료된 백업 아카이브가 생성되는 동일한 디렉토리입니다. 압축 해제된 백업을 생성할 때, 백업 자료는 이 디렉토리에 남아 있으며 아카이브가 생성되지 않습니다.

다음은 압축 해제된 백업을 포함하는 백업 스테이징 디렉토리의 예시입니다:

backups/
├── 1701728344_2023_12_04_16.7.0-pre_gitlab_backup.tar
├── 1701728447_2023_12_04_16.7.0-pre_gitlab_backup.tar
├── artifacts.tar.gz
├── backup_information.yml
├── builds.tar.gz
├── ci_secure_files.tar.gz
├── db
│   ├── ci_database.sql.gz
│   └── database.sql.gz
├── lfs.tar.gz
├── packages.tar.gz
├── pages.tar.gz
├── repositories
│   ├── manifests/
│   ├── @hashed/
│   └── @snippets/
├── terraform_state.tar.gz
└── uploads.tar.gz