複数のデータベース
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つの別々のデータベースで稼働しています。詳しくはこちらのブログ記事をご覧ください。