다중 데이터베이스

Tier: Free, Premium, Ultimate Offering: Self-managed
caution
이 기능은 프로덕션 환경에서 사용할 준비가 되지 않았습니다.

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

GitLab을 확장하기 위해 GitLab을 다중 애플리케이션 데이터베이스로 구성할 수 있습니다.

여러 데이터베이스로 GitLab을 구성하는 것은 알려진 문제로, 이는 실험입니다.

여러 데이터베이스가 설정된 후에 GitLab은 CI/CD 기능을 위해 두 번째 애플리케이션 데이터베이스를 사용하는데, 이는 ci 데이터베이스로 참조됩니다. 두 데이터베이스를 한 개의 PostgreSQL 인스턴스에 호스팅하는 것을 제외합니다.

mainci 데이터베이스에는 동일한 구조의 테이블이 정확히 같습니다. 몇 가지 예시:

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

알려진 문제

  • 데이터가 ci 데이터베이스로 마이그레이션된 후에는 되돌릴 수 없습니다.
  • 이 프로시저는 아직 HA 설정이나 PgBouncer 설정을 지원하지 않습니다.

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

  • 기존 리눅스 패키지 설치물을 마이그레이션하기 위한 스크립트가 GitLab 16.8에서 소개되었습니다.
note
마이그레이션 중에 예기치 않은 문제가 발생하면 다시 시작해도 안전합니다.

기존 리눅스 패키지 설치물

준비사항

  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 데이터베이스로 복원합니다. 100 GB 미만의 데이터베이스 크기는 30분 안에 완료할 수 있어야 합니다.
    • 구성 수정과 같은 더 작은 작업에도 시간을 할애하는 것이 좋습니다.
  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 데이터베이스로 기존 데이터를 마이그레이션하려면 데이터베이스를 복사할 수 있습니다.

note
마이그레이션 중에 예상치 못한 문제가 발생하면 다시 시작해도 안전합니다.

기존 self-compiled 설치

  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을 다중 데이터베이스 사용하도록 구성합니다.

기존 Linux 패키지 설치 사항

  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을 다중 데이터베이스로 설정.

다중 데이터베이스 설정

GitLab을 다중 애플리케이션 데이터베이스로 구성하려면 설치 유형에 따라 아래 지침을 따르세요.

caution
다중 데이터베이스를 설정하기 전에 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. 백그라운드 마이그레이션 활성화

추가 정보

다중 데이터베이스에 대한 자세한 내용은 issue 6168을 참조하세요.

GitLab에서 다중 데이터베이스가 작동하는 방법에 대한 자세한 내용은 다중 데이터베이스 개발 가이드를 참조하세요.

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