複数のデータベース

GitLab 15.7 で導入されました

caution
この機能はまだ実運用には適していません。

デフォルトでは、GitLab はmain データベースと呼ばれる単一のアプリケーションデータベースを使用します。

GitLabを拡張するために、複数のアプリケーションデータベースを使用するようにGitLabを設定することができます。

既知のイシューがあるため、複数のデータベースを使用するGitLabの設定はExperimentです。

複数のデータベースを設定した後、GitLabはci データベースと呼ばれるCI/CD機能のための2つ目のアプリケーションデータベースを使用します。単一のPostgreSQLインスタンスで両方のデータベースをホストすることは除外しません。

すべてのテーブルは、mainci データベースの両方でまったく同じ構造を持っています。いくつかの例を示します:

  • 複数のデータベースが設定されている場合、ci_pipelines テーブルはmainci データベースの両方に存在しますが、GitLab はci データベースのci_pipelines テーブルのみを読み書きします。
  • 同様に、projects テーブルはmainci データベースの両方に存在しますが、GitLab はmain データベースのprojects テーブルだけを読み書きします。
  • テーブルによっては(loose_foreign_keys_deleted_records など)、GitLab はmainci データベースの両方に読み書きします。開発者向けドキュメントをご覧ください。

既知のイシュー

  • 一度データをci データベースにマイグレーションすると、元に戻すことはできません。

既存のインストールのマイグレーション

既存のデータをmain データベースからci データベースにマイグレーションするには、データベースをコピーします。

既存の自己コンパイルインストール

  1. PostgreSQL 以外の GitLab を停止します:

    sudo service gitlab stop
    sudo service postgresql start
    
  2. main データベースをダンプします:

    sudo -u git pg_dump -f gitlabhq_production.sql gitlabhq_production
    
  3. 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
    
  4. 複数のデータベースを使うようにGitLabを設定します。

既存のLinuxパッケージのインストール

  1. PostgreSQL 以外の GitLab を停止します:

    sudo gitlab-ctl stop
    sudo gitlab-ctl start postgresql
    
  2. main データベースをダンプします:

    sudo -u gitlab-psql /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql -f gitlabhq_production.sql gitlabhq_production
    
  3. 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
    
  4. 複数のデータベースを使うようにGitLabを設定します。

複数のデータベースを設定

複数のアプリケーションデータベースを使うようにGitLabを設定するには、インストールタイプに合わせて以下の手順に従ってください。

caution
複数のデータベースを設定する前に、GitLabを停止する必要があります。これは、main のデータがci データベースに書き込まれたり、逆に のデータが データベースに書き込まれたりするスプリットブレインの状況を防ぐためです。

セルフコンパイルによるインストール

  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
    

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
    

詳細情報

複数のデータベースに関する詳細は、イシュー6168をご覧ください。

GitLab における複数データベースの仕組みについては、複数データベースの開発ガイドをご覧ください。

2022-07-02以降、GitLab.comは2つの別々のデータベースで稼働しています。詳しくはこちらのブログ記事をご覧ください。