マージリクエストの差分ストレージ
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
マージリクエストの差分は、マージリクエストに関連付けられたサイズ制限のある差分のコピーです。マージリクエストを表示する場合、パフォーマンス最適化のため、可能な限りこれらのコピーから差分が取得されます。
デフォルトでは、GitLabはマージリクエストの差分をmerge_request_diff_filesという名前のテーブルに格納します。より大規模なインストールでは、このテーブルが大きくなりすぎる可能性があるため、その場合は外部ストレージに切り替える必要があります。
マージリクエストの差分は以下に保存できます:
- 完全にディスク上。
- 完全にオブジェクトストレージ上。
- 現在の差分はデータベースに、期限切れの差分はオブジェクトストレージに。
外部ストレージの使用
/etc/gitlab/gitlab.rbを編集し、次の行を追加します:gitlab_rails['external_diffs_enabled'] = true外部差分は
/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"ファイルを保存して、GitLabを再設定し、変更を有効にします。GitLabは、既存のマージリクエストの差分を外部ストレージに移行します。
/home/git/gitlab/config/gitlab.ymlを編集し、次の行を追加または修正します。external_diffs: enabled: true外部差分は
/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ファイルを保存して、GitLabを再起動し、変更を有効にします。GitLabは、既存のマージリクエストの差分を外部ストレージに移行します。
オブジェクトストレージを使用する
オブジェクトストレージへの移行は元に戻せません。
外部差分をディスクに保存する代わりに、AWS S3のようなオブジェクトストレージを使用する必要があります。この設定は、有効な事前設定済みのAWS認証情報に依存します。
統合オブジェクトストレージの設定で外部差分用のオブジェクトストレージを設定しても、マージリクエストの差分の外部ストレージが自動的に有効になるわけではありません。external_diffs_enabledを明示的にtrueに設定する必要があります。
外部差分用のオブジェクトストレージを設定するには:
/etc/gitlab/gitlab.rbを編集し、次の行を追加します:gitlab_rails['external_diffs_enabled'] = true統合オブジェクトストレージの設定を設定します。
ファイルを保存して、GitLabを再設定し、変更を有効にします。
/home/git/gitlab/config/gitlab.ymlを編集し、次の行を追加または修正します。external_diffs: enabled: true統合オブジェクトストレージの設定を設定します。
ファイルを保存して、GitLabを再起動し、変更を有効にします。
GitLabを再設定または再起動すると、既存のマージリクエストの差分は外部ストレージに移行されます。
詳細については、オブジェクトストレージを参照してください。
データベース内での代替ストレージ
外部差分を有効にすると、他のデータとは別の操作で取得する必要があるため、マージリクエストのパフォーマンスが低下する可能性があります。期限切れの差分のみを外部に保存し、現在の差分はデータベースに保持することで、妥協点を見出すことができます。
この機能を有効にするには、次の手順を実行します:
/etc/gitlab/gitlab.rbを編集し、次の行を追加します:gitlab_rails['external_diffs_when'] = 'outdated'ファイルを保存して、GitLabを再設定し、変更を有効にします。
/home/git/gitlab/config/gitlab.ymlを編集し、次の行を追加または修正します。external_diffs: enabled: true when: outdatedファイルを保存して、GitLabを再起動し、変更を有効にします。
この機能を有効にすると、差分は最初は外部ではなくデータベースに保存されます。以下のいずれかの条件が真になると、外部ストレージに移動されます:
- より新しいマージリクエストの差分のバージョンが存在する
- マージリクエストが7日以上前にマージされた
- マージリクエストが7日以上前にクローズされた
これらのルールは、頻繁にアクセスされる差分のみをデータベースに保存することで、スペースとパフォーマンスのバランスを取ります。アクセスされる可能性の低い差分は、代わりに外部ストレージに移動されます。
外部ストレージからオブジェクトストレージへの切り替え
自動移行はデータベースに保存された差分を移動しますが、ストレージタイプ間で差分を移動することはありません。外部ストレージからオブジェクトストレージに切り替えるには:
ローカルまたはNFSストレージに保存されているファイルを、手動でオブジェクトストレージに移動します。
データベース内の場所を変更するには、この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タスクの動作を変更します:
| 名前 | デフォルト値 | 目的 |
|---|---|---|
ANSI | true | ANSIエスケープコードを使用して、より理解しやすい出力を作成します。 |
BATCH_SIZE | 1000 | このサイズのバッチでテーブルをイテレーションします。 |
START_ID | nil | 設定されている場合、このIDからスキャンを開始します。 |
END_ID | nil | 設定されている場合、このIDでスキャンを停止します。 |
UPDATE_DELAY | 1 | 更新間のスリープ秒数。 |
- テーブルの異なる部分に異なるプロセスを割り当てることで、
START_IDとEND_IDを使用して更新を並行して実行できます。 BATCHとUPDATE_DELAYにより、移行速度とテーブルへの同時アクセスとのトレードオフが可能になります。- ターミナルがANSIエスケープコードをサポートしていない場合、
ANSIはfalseに設定する必要があります。
オブジェクトストレージとローカルストレージ間の外部差分の分布を確認するには、次の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;