リポジトリ保存タイプ

  • GitLab 10.0で導入されました
  • GitLab 12.0でハッシュストレージが新規インストールのデフォルトになりました。
  • GitLab 13.0では、新規プロジェクトとリネームプロジェクトでハッシュストレージがデフォルトで有効になっています。

GitLabは、1つまたは複数のリポジトリストレージパス/シャードロケーションを使用するように設定できます:

  • ローカルディスクにマウント
  • NFS共有ボリュームとして公開
  • 独自のマシンでGitaly経由でアクセス。

GitLabでは、これは/etc/gitlab/gitlab.rbgit_data_dirs({})設定ハッシュによって設定されます。ここで説明するストレージレイアウトは、この中で定義されたどのシャードにも適用されます。

default リポジトリシャードは、カスタマイズしていないインストールで利用可能で、ローカルフォルダを指しています:/var/opt/gitlab/git-data. 以下に説明するものはすべて、そのフォルダの一部であることが期待されます。

ハッシュストレージ

Note:GitLab 13.0では、ハッシュストレージがデフォルトで有効になっており、レガシースストレージは非推奨となっています。 レガシースストレージのサポートはGitLab 14.0で削除される予定です。 まだ移行していない場合は、移行手順をご確認ください。 管理エリアでハッシュストレージとレガシースストレージを選択するオプションは無効になりました。

ハッシュストレージは、10.0で導入されたストレージの動作です。プロジェクトのURLとリポジトリがディスクに保存されるフォルダ構造を結合する代わりに、プロジェクトのIDに基づいたハッシュを結合しています。 これにより、フォルダ構造が不変になり、URLからディスク構造への状態の同期が不要になります。 つまり、グループ、ユーザー、プロジェクトの名前を変更すると、データベーストランザクションのみがコストとなり、すぐに反映されます。

ハッシュを使用すると、リポジトリがディスク上に均等に分散されるため、トップレベル・ディレクトリに含まれるフォルダの数は、トップレベル・ネームスペースの総量よりも少なくなります。

ハッシュ形式は、SHA256の16進数表現に基づいています。SHA256(project.id)。トップレベルのフォルダーは最初の2文字を使用し、次の2文字で別のフォルダーが続きます。既存のLegacy Storageプロジェクトと共存できるように、これらは両方とも特別な@hashed フォルダーに保存されます:

# Project's repository:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

# Wiki's repository:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"

ハッシュ化されたストレージパスの変換

git リポジトリのトラブルシューティングやフックの追加、その他の作業では、人間が読めるプロジェクト名とハッシュ化されたストレージパスとの翻訳が必要になります。

プロジェクト名からハッシュパスへ

ハッシュ化されたパスは管理エリアのプロジェクトのページに表示されます。

プロジェクトページにアクセスするには、管理エリア > 概要 > プロジェクトと進み、プロジェクトのページを開きます。

例えば「Gitaly相対パス」がそこに表示されています:

"@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.git"

これは、デフォルトの Omnibus インストールの/var/opt/gitlab/git-data/repositories/ 以下のパスです。

Railsコンソールでは、数値のプロジェクトIDかフルパスを使ってこの情報を取得します:

Project.find(16).disk_path
Project.find_by_full_path('group/project').disk_path

ハッシュ化されたパスからプロジェクト名へ

ハッシュ化されたストレージパスからプロジェクト名に変換する場合:

  1. Railsコンソールを起動します。
  2. 以下を実行してください:
ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project

このコマンドの引用符で囲まれた文字列は、GitLabサーバー上のディレクトリツリーです。 たとえば、デフォルトのOmnibusインストールでは、ディレクトリ名の末尾から.git を取り除いた/var/opt/gitlab/git-data/repositories/@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9.gitとなります。

プロジェクトIDとプロジェクト名が出力されます:

=> #<Project id:16 it/supportteam/ticketsystem>

ハッシュド・オブジェクト・プール

GitLab 12.1で導入されました

危険:プール・リポジトリでgit prune またはgit gc を実行しないでください! これは、問題のプールに依存している「実際の」リポジトリでデータ損失を引き起こす可能性があります。

公開プロジェクトのフォークは、ソースプロジェクトのオブジェクトを格納する第三のリポジトリ、オブジェクトプールを作成することで重複排除されます。objects/info/alternates、ソースプロジェクトとフォークはオブジェクトプールを共有オブジェクトに使用します。ハウスキーピングがソースプロジェクトで実行されると、オブジェクトはソースプロジェクトからオブジェクトプールに移動されます。

# object pool paths
"@pools/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

ハッシュ化ストレージのカバレッジ移行

S3と互換性のあるエンドポイントに保存されたファイルは、#{namespace}/#{project_name}(CI CacheとLFS Objectsに当てはまる)がプレフィックスとして付いていなければ、前述のようなデメリットはありません。

以下の表で、ハッシュ化されたストレージへの移行範囲を確認できます。

保存可能なオブジェクト レガシーストレージ ハッシュストレージ S3対応 GitLab バージョン
リポジトリ はい はい - 10.0
付属品 はい はい - 10.2
アバター はい いいえ - -
Pages はい いいえ - -
ドッカーレジストリ はい いいえ - -
CI ビルドログ いいえ いいえ - -
CIアーティファクト いいえ いいえ はい 9.4 / 10.6
CIキャッシュ いいえ いいえ はい -
LFSオブジェクト はい 類似 はい 10.0 / 10.7
リポジトリプール いいえ はい - 11.6

アバター

各ファイルはデータベースからid 、フォルダに保存されます。ファイル名はユーザーアバターの場合、常にavatar.png 。アバターが入れ替わると、Upload モデルは破棄され、異なるidで新しいものが作成されます。

CIアーティファクト

CIアーティファクトは9.4(GitLab Premium)からS3に対応し、GitLab Coreでは10.6から利用できます。

LFSオブジェクト

GitLabのLFSオブジェクトは、Git自身の実装に従って、2文字、2レベルのフォルダを使った同様の保存パターンを実装しています:

"shared/lfs-objects/#{oid[0..1}/#{oid[2..3]}/#{oid[4..-1]}"

# Based on object `oid`: `8909029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c`, path will be:
"shared/lfs-objects/89/09/029eb962194cfb326259411b22ae3f4a814b5be4f80651735aeef9f3229c"

LFSオブジェクトはS3にも対応しています。

レガシーストレージ

非推奨:GitLab 13.0では、ハッシュストレージがデフォルトで有効になり、レガシーステレージは非推奨となりました。 まだ移行していない場合は、移行手順をご確認ください。 レガシーステレージのサポートはGitLab 14.0で削除されます。 GitLab 13.0以降の場合、新しいプロジェクトをレガシーステレージに切り替えることはできません。 管理エリアでハッシュストレージとレガシーステレージを選択するオプションは無効になりました。

レガシーストレージはバージョン10.0以前のストレージの動作です。歴史的な理由から、GitLabはプロジェクトのURLから同じマッピング構造を複製していました:

  • プロジェクトのリポジトリ:#{namespace}/#{project_name}.git
  • プロジェクトのウィキ:#{namespace}/#{project_name}.wiki.git

この構造により、既存のソリューションからGitLabへの移行が簡単になり、管理者もリポジトリの保存場所を見つけやすくなりました。

一方、これには欠点もあります:

この影響は、複数のストレージ・パスを導入することで軽減できます。

バックアップは同じURLマッピングのスナップショットであるため、非常に古いバックアップを復元しようとする場合、同じURLを共有する古い削除または名前変更されたプロジェクトの代わりに、プロジェクトが使用されているかどうかを確認する必要があります。 つまり、バックアップのmygroup/myproject 、現在同じURLにある元のプロジェクトとは異なる可能性があります。

グループ/ユーザーやプロジェクトの名前が変更された場合)URLの変更はディスクに反映される必要があります。 これは、特にネットワークベースのファイルシステムを使用している場合、大規模なインストールで多くの負荷を追加する可能性があります。