여러 데이터베이스

Tier: Free, Premium, Ultimate Offering: Self-managed
caution
이 기능은 프로덕션 사용을 위해 준비되지 않았습니다.

기본적으로 GitLab은 main 데이터베이스라고 불리는 단일 애플리케이션 데이터베이스를 사용합니다.

GitLab을 확장하려면 여러 애플리케이션 데이터베이스를 사용하도록 GitLab을 구성할 수 있습니다.

알려진 문제들로 인해 여러 데이터베이스로 GitLab을 구성하는 것은 제한된 베타입니다.

여러 데이터베이스를 설정한 후 GitLab은 ci 데이터베이스라는 두 번째 애플리케이션 데이터베이스를 CI/CD 기능을 위해 사용합니다. 두 데이터베이스를 단일 PostgreSQL 인스턴스에서 호스팅하는 것도 배제하지 않습니다.

모든 테이블은 mainci 데이터베이스에서 정확히 동일한 구조를 가집니다. 몇 가지 예:

  • 여러 데이터베이스가 구성되면 ci_pipelines 테이블은 mainci 데이터베이스 모두에 존재하지만 GitLab은 ci 데이터베이스의 ci_pipelines 테이블에만 읽고 씁니다.
  • 마찬가지로, projects 테이블은 mainci 데이터베이스 모두에 존재하지만 GitLab은 main 데이터베이스의 projects 테이블에만 읽고 씁니다.
  • 일부 테이블(예: loose_foreign_keys_deleted_records)에 대해 GitLab은 mainci 데이터베이스 모두에 읽고 씁니다. 개발 문서를 참조하십시오.

알려진 문제들

  • 데이터가 ci 데이터베이스로 마이그레이션되면 다시 마이그레이션할 수 없습니다.
  • 대규모 설치(데이터베이스 크기가 100GB 이상일 경우)에서 상당한 다운타임이 예상됩니다.
  • 두 데이터베이스를 Geo와 함께 지원하지 않습니다.

스크립트를 사용하여 기존 설치 마이그레이션

  • 기존 리눅스 패키지 설치를 위한 스크립트가 GitLab 16.8에서 도입됨.

기존 리눅스 패키지 설치

이 마이그레이션은 다운타임이 필요합니다.
마이그레이션 중 예기치 않은 일이 발생하면 안전하게 다시 시작할 수 있습니다.

준비

  1. 사용 가능한 디스크 공간을 확인합니다:

    • gitlabhq_production_ci 데이터베이스를 저장할 데이터베이스 노드는 기존 데이터베이스의 복사본을 저장할 수 있는 충분한 공간이 필요합니다: gitlabhq_production을 _복제_합니다. 필요한 공간을 확인하려면 다음 SQL 쿼리를 실행하세요. 디스크 공간이 부족하지 않도록 25%를 추가합니다.

      sudo gitlab-psql -c "SELECT pg_size_pretty( pg_database_size('gitlabhq_production') );"
      
    • 진행 중에 gitlabhq_production 데이터베이스의 덤프를 마이그레이션을 실행할 노드의 파일시스템에 임시로 저장해야 합니다. 사용될 로컬 디스크 공간을 파악하기 위해 다음 SQL 문을 실행합니다. 디스크 공간이 부족하지 않도록 25%를 추가합니다.

      sudo gitlab-psql -c "select sum(pg_table_size(concat(table_schema,'.',table_name))) from information_schema.tables where table_catalog = 'gitlabhq_production' and table_type = 'BASE TABLE'"
      
  2. 다운타임을 계획합니다. 다운타임은 gitlabhq_production 데이터베이스의 크기에 따라 달라집니다.

    • gitlabhq_production을 덤프하고 새로운 gitlabhq_production_ci 데이터베이스에 복원합니다. 50GB 미만의 데이터베이스는 30분 이내에 완료됩니다. 더 큰 데이터베이스는 더 많은 시간이 필요합니다. 예를 들어, 100GB 데이터베이스는 새로운 데이터베이스로 복사하는 데 1-2시간이 필요합니다.
    • 구성 수정과 같은 작은 작업을 수행하고자 할 경우에도 시간을 계획하는 것이 좋습니다.
  3. gitlabhq_production_ci 데이터베이스를 생성합니다:

    sudo gitlab-psql -c "CREATE DATABASE gitlabhq_production_ci WITH OWNER 'gitlab'"
    

마이그레이션

이 프로세스에는 다운타임이 포함됩니다. 마이그레이션 스크립트를 실행하면 GitLab 인스턴스가 중지됩니다. 마이그레이션이 완료된 후 인스턴스가 재시작됩니다.

  1. 구성의 백업을 만드세요:

    sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.org
    
  2. /etc/gitlab/gitlab.rb를 수정하고 변경 사항을 저장하세요. 재구성 명령을 실행하지 마세요. 마이그레이션 스크립트가 이를 대신 실행할 것입니다.

    gitlab_rails['env'] = { 'GITLAB_ALLOW_SEPARATE_CI_DATABASE' => 'true' }
    gitlab_rails['databases']['ci']['enable'] = true
    gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
    
  3. 마이그레이션 스크립트를 실행하세요:

    sudo gitlab-ctl pg-decomposition-migration
    

이 시점에서 GitLab 인스턴스가 시작되고 작동해야 합니다.

절차를 중단하고 GitLab을 아무것도 변경하지 않고 시작하려면 다음 명령을 실행하세요:

sudo cp /etc/gitlab/gitlab.rb.org /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

정리

모든 것이 예상대로 작동하면 불필요한 데이터를 정리할 수 있습니다:

  • 메인 데이터베이스에서 CI 데이터를 삭제하세요:
sudo gitlab-rake gitlab:db:truncate_legacy_tables:main
  • CI 데이터베이스에서 메인 데이터를 삭제하세요:
sudo gitlab-rake gitlab:db:truncate_legacy_tables:ci

기존 설치 마이그레이션 (수동 절차)

main 데이터베이스에서 ci 데이터베이스로 기존 데이터를 마이그레이션하려면 데이터를 복사할 수 있습니다.

참고: 마이그레이션 중 예기치 않은 일이 발생할 경우, 안전하게 다시 시작할 수 있습니다.

기존 셀프 컴파일 설치

  1. 백그라운드 마이그레이션 비활성화.

  2. 모든 백그라운드 마이그레이션이 완료되었는지 확인.

  3. PostgreSQL을 제외한 GitLab을 중지하세요:

    sudo service gitlab stop
    sudo service postgresql start
    
  4. main 데이터베이스를 덤프하세요:

    sudo -u git pg_dump -f gitlabhq_production.sql gitlabhq_production
    
  5. ci 데이터베이스를 생성하고 이전 덤프에서 데이터를 복사하세요:

    sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER git;"
    sudo -u git psql -f gitlabhq_production.sql gitlabhq_production_ci
    
  6. GitLab을 다중 데이터베이스 사용으로 구성하세요.

기존 리눅스 패키지 설치

  1. 백그라운드 마이그레이션 비활성화

  2. 모든 백그라운드 마이그레이션이 완료되었는지 확인

  3. PostgreSQL을 제외한 GitLab을 중지하세요:

    sudo gitlab-ctl stop
    sudo gitlab-ctl start postgresql
    
  4. main 데이터베이스를 덤프하세요:

    sudo -u gitlab-psql /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production
    
  5. ci 데이터베이스를 생성하고 이전 덤프에서 데이터를 복사하세요:

    sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER gitlab;"
    sudo -u gitlab-psql  /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production_ci
    
  6. GitLab을 다중 데이터베이스 사용으로 구성하세요.

스트리밍 복제를 사용한 기존 Linux 패키지 설치

다운타임을 줄이기 위해 main 데이터베이스에서 ci 데이터베이스로 기존 데이터를 마이그레이션하기 위해 스트리밍 복제를 설정할 수 있습니다.

이 과정은 두 개의 데이터베이스 클러스터를 생성합니다.

이 절차는 시간과 자원을 많이 소모할 수 있습니다.

실행하기 전에 가용성과의 트레이드오프를 고려하세요.

두 개의 데이터베이스 클러스터를 만들기 위한 스트리밍 복제를 설정하려면:

  1. GitLab 데이터베이스에서 새로운 데이터베이스 인스턴스로 스트리밍 복제를 설정합니다.

  2. 새로운 복제본이 따라잡으면, 백그라운드 마이그레이션 비활성화를 수행합니다.

  3. 모든 백그라운드 마이그레이션이 완료되었는지 확인합니다.

  4. PostgreSQL을 제외하고 GitLab을 중지합니다:

    sudo gitlab-ctl stop
    sudo gitlab-ctl start postgresql
    
  5. 복제가 완료된 후, 스트리밍 복제를 중지하고 복제본을 기본 인스턴스로 승격합니다.

    이제 main을 위한 하나와 ci를 위한 하나 등 두 개의 데이터베이스 클러스터가 있습니다.

  6. GitLab을 다중 데이터베이스 사용하도록 구성합니다.

스트리밍 복제를 설정하는 방법에 대한 자세한 내용은 Linux 패키지 설치를 위한 PostgreSQL 복제 및 장애 조치를 참조하세요.

다중 데이터베이스 설정

GitLab이 여러 응용 프로그램 데이터베이스를 사용하도록 구성하려면, 설치 유형에 따라 아래 지침을 따르세요.

경고: 여러 데이터베이스를 설정하기 전에 GitLab을 중지해야 합니다. 이는 main 데이터가 ci 데이터베이스에 작성되고 그 반대 경우가 발생하는 분리 뇌(split-brain) 상황을 방지합니다.

셀프 컴파일된 설치

  1. 기존 설치를 위해,

    데이터 마이그레이션을 먼저 수행하세요.

  2. GitLab 백업

    보지 않은 문제에 대비하여 백업합니다.

  3. GitLab을 중지합니다:

    sudo service gitlab stop
    
  4. config/database.yml를 열고 production: 아래에 ci: 섹션을 추가합니다.

    새로운 ci: 섹션의 가능한 값에 대한 정보는 config/database.yml.decomposed-postgresql을 참조하세요. 수정 후 config/database.yml은 다음과 같아야 합니다:

    production:
      main:
        # ...
      ci:
        adapter: postgresql
        encoding: unicode
        database: gitlabhq_production_ci
        # ...
    
  5. config/database.yml 파일을 저장합니다.

  6. 서비스 파일을 업데이트하여 GITLAB_ALLOW_SEPARATE_CI_DATABASE 환경 변수를 true로 설정합니다.

  7. 새로운 설치의 경우에만 gitlabhq_production_ci 데이터베이스를 생성합니다:

    sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
    sudo -u git -H bundle exec rake db:schema:load:ci
    
  8. main 데이터베이스의 ci 테이블에 대한 쓰기를 잠그고 그 반대도 마찬가지입니다:

    sudo -u git -H bundle exec rake gitlab:db:lock_writes
    
  9. GitLab을 재시작합니다:

    sudo service gitlab restart
    
  10. 백그라운드 마이그레이션 활성화

Linux 패키지 설치

  1. 기존 설치를 위해,

    데이터 마이그레이션을 먼저 수행하세요.

  2. GitLab 백업

    보지 않은 문제에 대비하여 백업합니다.

  3. GitLab을 중지합니다:

    sudo gitlab-ctl stop
    
  4. /etc/gitlab/gitlab.rb를 편집하고 다음 행을 추가합니다:

    gitlab_rails['env'] = { 'GITLAB_ALLOW_SEPARATE_CI_DATABASE' => 'true' }
    gitlab_rails['databases']['ci']['enable'] = true
    gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
    
  5. /etc/gitlab/gitlab.rb 파일을 저장합니다.

  6. GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    
  7. 선택 사항으로, 새로운 설치의 경우에만. GitLab을 재구성하면 gitlabhq_production_ci 데이터베이스가 존재하지 않을 경우 생성되어야 합니다.

    데이터베이스가 자동으로 생성되지 않으면 수동으로 생성합니다:

    sudo gitlab-ctl start postgresql
    sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql -h /var/opt/gitlab/postgresql -d template1 -c "CREATE DATABASE gitlabhq_production_ci OWNER gitlab;"
    sudo gitlab-rake db:schema:load:ci
    
  8. main 데이터베이스의 ci 테이블에 대한 쓰기를 잠그고 그 반대도 마찬가지입니다:

    sudo gitlab-ctl start postgresql
    sudo gitlab-rake gitlab:db:lock_writes
    
  9. GitLab을 재시작합니다:

    sudo gitlab-ctl restart
    
  10. 백그라운드 마이그레이션 활성화

추가 정보

여러 데이터베이스에 대한 자세한 내용은 이슈 6168를 참조하십시오.

GitLab에서 여러 데이터베이스가 어떻게 작동하는지에 대한 자세한 내용은 여러 데이터베이스에 대한 개발 가이드를 참조하십시오.

2022-07-02부터 GitLab.com은 두 개의 개별 데이터베이스로 운영되고 있습니다. 자세한 내용은 이 블로그 게시물을 참조하십시오.