マージリクエスト差分ストレージ

マージリクエスト diff はマージリクエストに関連する diff のサイズ制限付きコピーです。マージリクエストを表示するとき、パフォーマンスの最適化のため、diff は可能な限りこれらのコピーから取得されます。

デフォルトでは、マージリクエストの差分はデータベースのmerge_request_diff_files という名前のテーブルに保存されます。大規模なインストールでは、このテーブルが大きくなりすぎることがあります。

マージリクエストの差分はディスクまたはオブジェクトストレージに保存できます。一般的には、差分をディスクに保存するよりもデータベースに保存する方が良いでしょう。古い差分のみをデータベース外に保存する妥協案もあります。

外部ストレージの使用

Linuxパッケージ・インストールの場合:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を追加します:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 外部の差分は/var/opt/gitlab/gitlab-rails/shared/external-diffs に保存されます。パスを変更するには、例えば、/mnt/storage/external-diffs/etc/gitlab/gitlab.rb を編集し、次の行を追加します:

    gitlab_rails['external_diffs_storage_path'] = "/mnt/storage/external-diffs"
    
  3. ファイルを保存し、変更を有効にするためにGitLabを再設定します。その後、GitLabは既存のマージリクエストの差分を外部ストレージにマイグレーションします。

セルフコンパイルによるインストールの場合:

  1. /home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正します:

    external_diffs:
      enabled: true
    
  2. 外部の差分は/home/git/gitlab/shared/external-diffs に保存されます。パスを変更するには、例えば/mnt/storage/external-diffsを編集し、/home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正してください:

    external_diffs:
      enabled: true
      storage_path: /mnt/storage/external-diffs
    
  3. ファイルを保存し、変更を有効にするためにGitLabを再起動します。その後、GitLabは既存のマージリクエストの差分を外部ストレージにマイグレーションします。

オブジェクトストレージの使用

caution
オブジェクトストレージへのマイグレーションは元に戻せません。

外部差分をディスクに保存する代わりに、AWS S3 のようなオブジェクトストアを使用することをお勧めします。この設定は、有効なAWS認証情報がすでに設定されていることに依存します。

Linuxパッケージ・インストールの場合:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を追加します:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. オブジェクトストレージの設定を行います。
  3. ファイルを保存し、変更を有効にするためにGitLabを再設定します。その後、GitLabは既存のマージリクエストの差分を外部ストレージにマイグレーションします。

セルフコンパイルによるインストールの場合:

  1. /home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正します:

    external_diffs:
      enabled: true
    
  2. オブジェクトストレージの設定を行います。
  3. ファイルを保存し、変更を有効にするためにGitLabを再起動します。その後、GitLabは既存のマージリクエストの差分を外部ストレージにマイグレーションします。

GitLab でのオブジェクトストレージの使用について、詳しくはこちらをご覧ください。

オブジェクトストレージの設定

GitLab 13.2以降では、統合オブジェクトストレージ設定を使用する必要があります。このセクションでは、以前の設定フォーマットについて説明します。

セルフコンパイルインストールでは、これらの設定はexternal_diffs: の下にネストされ、次にobject_store:の下にネストされます。Linux パッケージのインストールでは、これらの設定の先頭にexternal_diffs_object_store_ が付きます。

設定説明デフォルト
enabledオブジェクトストレージの有効化/無効化false
remote_directory外部差分を保存するバケット名 
proxy_download true に設定すると、すべてのファイルのプロキシが有効になります。このオプションにより、クライアントがすべてのデータをプロキシする代わりにリモートストレージから直接ダウンロードできるようになるため、egress トラフィックを減らすことができます。false
connection以下に説明するさまざまな接続オプション 

S3対応接続設定

各プロバイダーで利用可能な接続設定を参照してください。

Linuxパッケージ・インストールの場合:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を必要な値に置き換えて追加します:

    gitlab_rails['external_diffs_enabled'] = true
    gitlab_rails['external_diffs_object_store_enabled'] = true
    gitlab_rails['external_diffs_object_store_remote_directory'] = "external-diffs"
    gitlab_rails['external_diffs_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
      'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
    }
    

    AWS IAM プロファイルを使用している場合は、AWS アクセスキーとシークレットアクセスキー/値のペアを省略します。例えば

    gitlab_rails['external_diffs_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'use_iam_profile' => true
    }
    
  2. ファイルを保存し、変更を有効にするためにGitLab を再設定してください。

セルフコンパイルによるインストールの場合:

  1. /home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正します:

    external_diffs:
      enabled: true
      object_store:
        enabled: true
        remote_directory: "external-diffs" # The bucket name
        connection:
          provider: AWS # Only AWS supported at the moment
          aws_access_key_id: AWS_ACCESS_KEY_ID
          aws_secret_access_key: AWS_SECRET_ACCESS_KEY
          region: eu-central-1
    
  2. ファイルを保存してGitLab を再起動すると、変更が有効になります。

データベース内ストレージの代替

外部 diff を有効にすると、他のデータとは別のオペレーションで取得する必要があるため、マージリクエストのパフォーマンスが低下する可能性があります。古い diff のみを外部に保存し、現在の diff はデータベースに保存することで妥協することができます。

この機能を有効にするには、以下の手順を実行します:

Linuxパッケージ・インストールの場合:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を追加します:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. ファイルを保存し、変更を有効にするためにGitLab を再設定してください。

セルフコンパイルによるインストールの場合:

  1. /home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正します:

    external_diffs:
      enabled: true
      when: outdated
    
  2. ファイルを保存してGitLab を再起動すると、変更が有効になります。

この機能を有効にすると、diffは最初は外部ではなくデータベースに保存されます。これらの条件のいずれかが真になった後、外部ストレージに移動されます:

  • マージリクエストの diff の新しいバージョンが存在する場合。
  • マージリクエストが7日以上前にマージされました。
  • マージリクエストは7日以上前にクローズされました。

これらのルールは、頻繁にアクセスされる差分のみをデータベースに保存することで、容量とパフォーマンスのバランスを取っています。アクセスの可能性が低い差分は、代わりに外部ストレージに移動されます。

誤ってマイグレーションされた差分の修正

v13.0.0 より前のバージョンの GitLab では、オブジェクトストレージの外部差分が有効になっている場合に、マージリクエストの差分の場所が誤って記録されることがありました。これは主にインポートされたマージリクエストに影響し、このマージリクエストで解決されました。

オブジェクトストレージを使用している場合、または外部差分のためにディスク上のストレージを使用したことがない場合、いくつかのマージリクエストの変更タブが 500 エラーでロードに失敗します:

Errno::ENOENT (No such file or directory @ rb_sysopen - /var/opt/gitlab/gitlab-rails/shared/external-diffs/merge_request_diffs/mr-6167082/diff-8199789)

この場合、このイシューの影響を受けます。これらの条件をすべて自動的に安全に判断することはできないため、GitLab v13.2.0ではデータを修正するために手動で実行できるRakeタスクを提供しています:

Linuxパッケージ・インストールの場合:

sudo gitlab-rake gitlab:external_diffs:force_object_storage

セルフコンパイルによるインストールの場合:

sudo -u git -H bundle exec rake gitlab:external_diffs:force_object_storage RAILS_ENV=production

タスクの動作を変更するために環境変数を提供できます。利用可能な変数は次のとおりです:

名前デフォルト値目的
ANSItrueANSIエスケープコードを使用して出力をわかりやすくします。
BATCH_SIZE1000このサイズのバッチでテーブルを繰り返します。
START_IDnil設定されている場合、このIDからスキャンを開始します。
END_IDnil設定された場合、このIDでスキャンを停止します。
UPDATE_DELAY1更新間のスリープ秒数

START_ID およびEND_ID 変数を使用して、テーブルの異なる部分に異なるプロセスを割り当てることで、更新を並行して実行することができます。BATCHUPDATE_DELAY パラメータを使用すると、マイグレーションの速度とテーブルへの同時アクセスをトレードオフすることができます。端末がANSIエスケープコードをサポートしていない場合は、ANSI パラメータをfalseに設定してください。

デフォルトでは、sudo は既存の環境変数を保持しません。プレフィックスを付けるのではなく、追加してください。

sudo gitlab-rake gitlab:external_diffs:force_object_storage START_ID=59946109 END_ID=59946109 UPDATE_DELAY=5

外部ストレージからオブジェクトストレージへの切り替え

自動マイグレーションはデータベースに保存された差分を移動しますが、ストレージタイプ間の差分は移動しません。外部ストレージからオブジェクトストレージに切り替えるには

  1. ローカルまたは NFS ストレージに保存されているファイルを手動でオブジェクトストレージに移動します。
  2. 前のセクションのRakeタスクを実行して、データベース内の場所を変更します。