複数のデータベース
GitLab 15.7 で導入されました。
デフォルトでは、GitLab はmain
データベースと呼ばれる単一のアプリケーションデータベースを使用します。
GitLabを拡張するために、複数のアプリケーションデータベースを使用するようにGitLabを設定することができます。
既知のイシューがあるため、複数のデータベースを使用するGitLabの設定はExperimentです。
複数のデータベースを設定した後、GitLabはci
データベースと呼ばれるCI/CD機能のための2つ目のアプリケーションデータベースを使用します。単一の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
データベースから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を設定します。
複数のデータベースを設定
複数のアプリケーションデータベースを使うようにGitLabを設定するには、インストールタイプに合わせて以下の手順に従ってください。
main
のデータがci
データベースに書き込まれたり、逆に のデータが データベースに書き込まれたりするスプリットブレインの状況を防ぐためです。セルフコンパイルによるインストール
-
既存のインストールについては、まずデータをマイグレーションしてください。
-
予期せぬイシューに備えて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は2つの別々のデータベースで稼働しています。詳しくはこちらのブログ記事をご覧ください。