복수의 데이터베이스
- GitLab 15.7에서 도입되었습니다.
기본적으로 GitLab은 main
데이터베이스로 참조되는 단일 애플리케이션 데이터베이스를 사용합니다.
GitLab을 확장하기 위해 GitLab을 여러 애플리케이션 데이터베이스를 사용하도록 구성할 수 있습니다.
본문서(이슈)에서는 복수의 데이터베이스로 GitLab을 구성하는 것은 알려진 이슈들로 인해 제한적인 베타 상태에 있습니다.
여러 데이터베이스를 설정한 후에 GitLab은 CI/CD 기능을 위해 두 번째 애플리케이션 데이터베이스를 사용하며, 이를 ci
데이터베이스로 참조합니다. 두 데이터베이스 모두를 하나의 PostgreSQL 인스턴스에 호스팅하는 것을 배제하지 않습니다.
main
과 ci
데이터베이스의 모든 테이블은 정확히 동일한 구조를 가지고 있습니다. 몇 가지 예는 다음과 같습니다.
- 복수의 데이터베이스가 구성된 경우,
ci_pipelines
테이블은main
및ci
데이터베이스에 모두 존재하지만, GitLab은ci
데이터베이스의ci_pipelines
테이블에만 쓰고 읽습니다. - 마찬가지로,
projects
테이블은main
및ci
데이터베이스에 모두 존재하지만, GitLab은main
데이터베이스의projects
테이블에만 쓰고 읽습니다. - 일부 테이블(예:
loose_foreign_keys_deleted_records
)의 경우, GitLab은main
및ci
데이터베이스 양쪽에 쓰고 읽습니다. 자세한 내용은 개발 문서를 참조하십시오.
알려진 이슈
- 데이터가
ci
데이터베이스로 이전되면, 다시main
으로 마이그레이션할 수 없습니다. - 큰 설치(100GB 이상의 데이터베이스 크기)의 경우 상당한 다운타임이 예상됩니다.
- 두 개의 데이터베이스를 실행하는 것은 아직 Geo와 호환되지 않습니다.
스크립트를 사용하여 기존 설치 마이그레이션
- 기존 리눅스 패키지 설치를 마이그레이션하기 위한 스크립트가 GitLab 16.8에서 도입되었습니다.
기존 리눅스 패키지 설치
이 마이그레이션은 다운타임이 필요합니다. 마이그레이션 중에 예기치 않은 상황이 발생하면 다시 시작해도 안전합니다.
준비
-
사용 가능한 디스크 공간을 확인합니다.
-
‘gitlabhq_production’ 데이터베이스를 저장할 데이터베이스 노드에는 기존 데이터베이스의 복사본을 저장할만한 충분한 공간이 필요합니다: 우리는
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'"
-
-
다운타임을 준비합니다. 다운타임은
gitlabhq_production
데이터베이스의 크기에 따라 달라집니다.- 우리는 ‘gitlabhq_production’을 덤프하고 새
gitlabhq_production_ci
데이터베이스에 복원합니다. 50GB 이하의 데이터베이스 크기는 30분 이내에 완료됩니다. 큰 데이터베이스는 더 많은 시간이 필요합니다. 예를 들어, 100GB 데이터베이스는 새 데이터베이스로 복사하는 데 1-2시간이 필요합니다. - 구성 수정과 같은 작은 작업을 위해 몇 시간을 예약하는 것을 권장합니다.
- 우리는 ‘gitlabhq_production’을 덤프하고 새
-
새로운
gitlabhq_production_ci
데이터베이스를 생성합니다.sudo gitlab-psql -c "CREATE DATABASE gitlabhq_production_ci WITH OWNER 'gitlab'"
마이그레이션
이 과정은 다운타임을 포함합니다. 마이그레이션 스크립트를 실행하면 GitLab 인스턴스가 중지됩니다. 마이그레이션이 완료된 후 인스턴스가 다시 시작됩니다.
-
구성의 백업을 만듭니다.
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.org
-
/etc/gitlab/gitlab.rb
를 편집하고 변경 사항을 저장합니다.reconfigure
명령을 실행하지 마십시오. 마이그레이션 스크립트가 대신 실행됩니다.gitlab_rails['env'] = { 'GITLAB_ALLOW_SEPARATE_CI_DATABASE' => 'true' } gitlab_rails['databases']['ci']['enable'] = true gitlab_rails['databases']['ci']['db_database'] = 'gitlabhq_production_ci'
-
마이그레이션 스크립트를 실행합니다.
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
데이터베이스로 기존 데이터를 마이그레이션하려면 데이터베이스를 복사할 수 있습니다.
참고: 마이그레이션 중에 예기치 않은 상황이 발생하면 다시 시작해도 안전합니다.
기존 세계로 설치
-
PostgreSQL을 제외한 GitLab을 중지합니다.
sudo service gitlab stop sudo service postgresql start
-
main
데이터베이스를 덤프합니다.sudo -u git pg_dump -f gitlabhq_production.sql gitlabhq_production
-
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
-
GitLab을 다중 데이터베이스로 설정하도록 구성합니다.
기존 Linux 패키지 설치
-
PostgreSQL을 제외한 GitLab 중지:
sudo gitlab-ctl stop sudo gitlab-ctl start postgresql
-
main
데이터베이스 덤프:sudo -u gitlab-psql /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production
-
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
-
GitLab을 여러 데이터베이스로 구성.
스트리밍 복제를 사용하는 기존 Linux 패키지 설치
다운타임을 줄이기 위해 스트리밍 복제를 설정하여 기존 데이터를 main
데이터베이스에서 ci
데이터베이스로 마이그레이션할 수 있습니다.
이 프로시저는 두 개의 데이터베이스 클러스터를 생성합니다.
이 프로시저는 시간과 리소스를 모두 소비할 수 있습니다.
실행하기 전에 가용성과의 교환에 대해 고려하세요.
두 개의 데이터베이스 클러스터를 생성하려면 다음을 수행하세요:
- GitLab 데이터베이스에서 새 데이터베이스 인스턴스로 스트리밍 복제 설정.
- 새 복제본이 따라잡으면, 백그라운드 마이그레이션 비활성화.
- 모든 백그라운드 마이그레이션이 완료되었는지 확인.
-
PostgreSQL을 제외한 GitLab 중지:
sudo gitlab-ctl stop sudo gitlab-ctl start postgresql
- 복제가 완료되면, 스트리밍 복제 중지 및 복제본을 기본 인스턴스로 승격.
이제
main
과ci
각각에 대해 두 개의 데이터베이스 클러스터가 있습니다. - GitLab을 여러 데이터베이스로 구성.
스트리밍 복제 설정에 대한 자세한 정보는 Linux 패키지 설치를 위한 PostgreSQL 복제 및 장애 조치를 참조하세요.
여러 데이터베이스 구성
GitLab을 여러 응용프로그램 데이터베이스로 구성하려면 설치 유형에 따라 아래 지침을 따르세요.
경고:
여러 데이터베이스를 설정하기 전에 GitLab을 중지해야 합니다. 이는 main
데이터가 ci
데이터베이스에 쓰이거나 그 반대로 발생하는 split-brain 상황을 방지합니다.
직접 컴파일된 설치
-
기존 설치의 경우, 먼저 데이터를 이전하세요.
-
예상치 못한 문제 발생 시를 대비해, GitLab을 백업하세요.
-
GitLab 중지:
sudo service gitlab stop
-
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 # ...
-
config/database.yml
파일을 저장하세요. -
서비스 파일을 업데이트하여
GITLAB_ALLOW_SEPARATE_CI_DATABASE
환경 변수를true
로 설정하세요. -
새 설치 전용.
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
-
main
데이터베이스의ci
테이블에 대한 쓰기 작업 잠금 및 그 반대로:sudo -u git -H bundle exec rake gitlab:db:lock_writes
-
GitLab 재시작:
sudo service gitlab restart
Linux 패키지 설치
-
기존 설치의 경우, 먼저 데이터를 이전하세요.
-
예상치 못한 문제 발생 시를 대비해, GitLab을 백업하세요.
-
GitLab 중지:
sudo gitlab-ctl stop
-
/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'
-
/etc/gitlab/gitlab.rb
파일을 저장하세요. -
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
-
새 설치 전용. 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
-
main
데이터베이스의ci
테이블에 대한 쓰기 작업 잠금 및 그 반대로:sudo gitlab-ctl start postgresql sudo gitlab-rake gitlab:db:lock_writes
-
GitLab 재시작:
sudo gitlab-ctl restart
추가 정보
다중 데이터베이스에 대한 자세한 내용은 이슈 6168를 참조하십시오.
GitLab에서 다중 데이터베이스가 작동하는 방법에 대한 자세한 내용은 다중 데이터베이스 개발 가이드를 참조하십시오.
2022-07-02 이후로 GitLab.com은 두 개의 별도 데이터베이스로 운영되고 있습니다. 자세한 내용은 블로그 게시물을 참조하십시오.