正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

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

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

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

デフォルトでは、GitLabはマージリクエストの差分をmerge_request_diff_filesという名前のテーブルに格納します。より大規模なインストールでは、このテーブルが大きくなりすぎる可能性があるため、その場合は外部ストレージに切り替える必要があります。

マージリクエストの差分は以下に保存できます:

外部ストレージの使用

  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は、既存のマージリクエストの差分を外部ストレージに移行します。

オブジェクトストレージを使用する

オブジェクトストレージへの移行は元に戻せません。

外部差分をディスクに保存する代わりに、AWS S3のようなオブジェクトストレージを使用する必要があります。この設定は、有効な事前設定済みのAWS認証情報に依存します。

統合オブジェクトストレージの設定で外部差分用のオブジェクトストレージを設定しても、マージリクエストの差分の外部ストレージが自動的に有効になるわけではありません。external_diffs_enabledを明示的にtrueに設定する必要があります。

外部差分用のオブジェクトストレージを設定するには:

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

    gitlab_rails['external_diffs_enabled'] = true
  2. 統合オブジェクトストレージの設定を設定します。

  3. ファイルを保存して、GitLabを再設定し、変更を有効にします。

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

    external_diffs:
      enabled: true
  2. 統合オブジェクトストレージの設定を設定します。

  3. ファイルを保存して、GitLabを再起動し、変更を有効にします。

GitLabを再設定または再起動すると、既存のマージリクエストの差分は外部ストレージに移行されます。

詳細については、オブジェクトストレージを参照してください。

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

外部差分を有効にすると、他のデータとは別の操作で取得する必要があるため、マージリクエストのパフォーマンスが低下する可能性があります。期限切れの差分のみを外部に保存し、現在の差分はデータベースに保持することで、妥協点を見出すことができます。

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

  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を再起動し、変更を有効にします。

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

  • より新しいマージリクエストの差分のバージョンが存在する
  • マージリクエストが7日以上前にマージされた
  • マージリクエストが7日以上前にクローズされた

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

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

自動移行はデータベースに保存された差分を移動しますが、ストレージタイプ間で差分を移動することはありません。外部ストレージからオブジェクトストレージに切り替えるには:

  1. ローカルまたはNFSストレージに保存されているファイルを、手動でオブジェクトストレージに移動します。

  2. データベース内の場所を変更するには、この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

    デフォルトでは、sudoは既存の環境変数を保持しません。このように、プレフィックスとしてではなく、それらを追加する必要があります:

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

これらの環境変数は、Rakeタスクの動作を変更します:

名前デフォルト値目的
ANSItrueANSIエスケープコードを使用して、より理解しやすい出力を作成します。
BATCH_SIZE1000このサイズのバッチでテーブルをイテレーションします。
START_IDnil設定されている場合、このIDからスキャンを開始します。
END_IDnil設定されている場合、このIDでスキャンを停止します。
UPDATE_DELAY1更新間のスリープ秒数。
  • テーブルの異なる部分に異なるプロセスを割り当てることで、START_IDEND_IDを使用して更新を並行して実行できます。
  • BATCHUPDATE_DELAYにより、移行速度とテーブルへの同時アクセスとのトレードオフが可能になります。
  • ターミナルがANSIエスケープコードをサポートしていない場合、ANSIfalseに設定する必要があります。

オブジェクトストレージとローカルストレージ間の外部差分の分布を確認するには、次のSQLクエリを使用します:

gitlabhq_production=# SELECT count(*) AS total,
  SUM(CASE
    WHEN external_diff_store = '1' THEN 1
    ELSE 0
  END) AS filesystem,
  SUM(CASE
    WHEN external_diff_store = '2' THEN 1
    ELSE 0
  END) AS objectstg
FROM merge_request_diffs;