オブジェクトストレージ ワーキンググループ

GitLab オブジェクトストレージ ワーキンググループは、現在のオブジェクトストレージソリューションのパフォーマンス、セキュリティ、技術的負債の改善を支援することを目的としています。詳細をご覧ください!

属性

プロパティ
作成日2021年11月3日
目標終了日2022年5月31日
Slack#wg_object-storage(社内からのみアクセス可能)
Google DocObject Storage Working Group Meeting Agenda(社内からのみアクセス可能)

チャーター

GitLab は3種類のユーザーデータを保存しています: データベースレコード、Git リポジトリ、およびユーザーがアップロードしたファイルです。

ファイルストレージに関するユーザーエクスペリエンスとコントリビューターエクスペリエンスには、大幅な改善の余地があります。

  • GitLab の初期セットアップには1つではなく 13のバケットの作成と設定が必要です。
  • ファイルストレージを使用する機能では、コントリビューターがローカルストレージとオブジェクトストレージの両方について考える必要があり、摩擦と複雑さが生じます。これにより機能の不具合とセキュリティ上の問題が発生することが多いです。
  • ファイルストレージにコントリビュートする際には、Workhorse、Omnibus、および CNG のコードも記述する必要があります。

このワーキンググループは、過去数年にわたって蓄積された技術的負債、すなわち CarrierWave の削除と Go と Ruby の両方でのオブジェクトストレージクライアントの重複をなくすことに取り組みます。

ワーキンググループは、簡略化されたオブジェクトストレージプロセスの設計と新しいソリューションの実装の任務を担っています。

ビジネス目標

あらゆる種類のアップロードにオブジェクトストレージが利用できるようにすることで、SaaS のスケーラビリティ、信頼性、開発速度を向上させます。

すぐに利用できるシングルバケット設定を提供することで、セルフマネージドの顧客の機能採用を向上させます。

オブジェクトストレージは GitLab の主要機能であり、すべてのセクションにわたるエンジニアリンググループに影響します。ワーキンググループの成果は、エンジニアが最終ソリューションにコントリビュートしやすくする効果もあります。

スコープと定義

オブジェクトストレージは GitLab の基本コンポーネントであり、共有・分散型・高可用性(HA)ファイルストレージの基盤実装を提供します。

時間をかけて、私たちはアプリケーション全体にオブジェクトストレージのサポートを構築し、多数のイテレーションで特定の問題を解決してきました。これにより、開発(新機能とバグ修正)からインストールまで、全般的に複雑さが増しています:

  • 新規 GitLab インストールでは、各グループの機能が独自のものを必要とするため、1つではなく複数のオブジェクトストレージバケットの作成と設定が必要です。これはインストールエクスペリエンスと新機能の採用に影響を与え、シンプルなソリューションから遠ざかります。
  • Cloud Native GitLab のリリースにより NFS 共有ストレージの削除が必要となり、ダイレクトアップロードの開発が行われました。これはマイルストーンごとに複数の種類のアップロードに拡大されましたが、グローバルには有効化されることはありませんでした。
  • 今日の GitLab はローカルストレージとオブジェクトストレージの両方をサポートしています。ローカルストレージはシングルボックスインストールまたは NFS でのみ機能しますが、私たちはユーザーに対してNFS の使用を推奨しておらず、GitLab.com では使用されていません。
  • すべての動作パーツとフローを理解するのは非常に複雑です: CarrierWave、Fog、Golang S3/Azure SDK がすべて使用されており、これはテストも複雑にします。
  • Fog と CarrierWave はネイティブ SDK(例: AWS S3 SDK)ほどメンテナンスされていないため、通常は「無料」で利用できる顧客が要求する機能(例: https://gitlab.com/gitlab-org/gitlab/-/issues/242245)をサポートするためにこれらのツールをメンテナンスしたりモンキーパッチしたりする必要が生じています。
  • 多くの場合、不必要にオブジェクトストレージファイルをコピーしています(例: https://gitlab.com/gitlab-org/gitlab/-/issues/285597)。大きなファイル(LFS、パッケージなど)のファイナライズが遅くなったり、まったく機能しないことがあります。

定義

CarrierWave

Ruby アプリケーションからファイルをアップロードするためのシンプルで非常に柔軟な方法を提供する gem です。最初に実装された時点ではシンプルなソリューションでしたが、私たちのユースケースはもはやそれではありません。Workhorse からファイルをアップロードするようになり、ダイレクトアップロードをサポートするために CarrierWave の内部にパッチを当てる必要がありました。

ダイレクトアップロード

Workhorse でファイルアップロードをインターセプトし、コストのかかるアップロード操作をよりコストの低い Workhorse で処理するために開発した技術です。詳細はアップロード開発ドキュメントをご覧ください。

キックオフ動画

終了基準(100%)

このグループの作業を通じて、オブジェクトストレージの実装に対して行うことができる改善を文書化し、十分な情報に基づいた実装提案を行うことが全体的な目標です。具体的には:

スコープ外

  • 提案されたソリューションの最終決定。
  • すべての提案されたソリューションの実装。
  • 将来的なオブジェクトストレージ開発の永続的な管理者または監督者になること。

成果

このワーキンググループの開始時点では、改善すべき3つの主要な領域がありました: オブジェクトストレージファイルの単一バケットへの統合、コードの複雑さの軽減、ローカルストレージの削除。

しかしながら、ワーキンググループメンバーにとって最大の課題は、現在の実装を理解し、共通言語を話せるようになることであるということがすぐに明らかになりました。

ワーキンググループは製品内のオブジェクトストレージのすべての使用例を収集・分類する取り組みを主導しました。その結果、問題の共通理解を構築し、刷新されたアップロード開発ガイドを作成し、Pseudonymizer やバックグラウンドアップロードなどの機能を削除しました。

オブジェクトストレージファイルの単一バケットへの統合とローカルストレージサポートの削除は、ワーキンググループによってコードの複雑さを軽減し製品のインストールとメンテナンスを簡略化するための優れた方法として評価されました。しかしながら、これらのトピックはワーキンググループのスコープに収まらない、より重大な部門横断的な意思決定を必要とします。最初のイテレーションとして、ワーキンググループメンバーは技術的課題に焦点を当て、コードの複雑さを軽減する方法に取り組みました。

このワーキンググループの実行中にスケーラビリティフレームワークチームが設立されたことで、この取り組みを継続するための完璧なパートナーが誕生しました。Epic gitlab-com/gl-infra&733は現在のロードマップを説明しています。

役割と責任

ファンクショナルリードは以下の責任を担います:

  • 自分の部門/サブ部門の個々のステークホルダーのニーズを代表します。
  • 自分の部門/サブ部門からの特定の提案に関するフィードバックを収集・統合します。
  • ワーキンググループからのアウトプット(もしあれば)を伝達し、自分の部門/サブ部門からの質問に回答します。

理想的には、ファンクショナルリードは影響を受けるグループで働く IC(個人貢献者)ですが、上記の方法でグループ、部門、またはサブ部門を代表できる人であれば誰でも歓迎します。

ワーキンググループの役割担当者ステークホルダー部門役職
エグゼクティブスポンサーMarin Jankovski @marinInfrastructureDirector of Infrastructure, Platform
ファシリテーターAlessio Caiazza @nolithInfrastructureStaff Backend Engineer
ファンクショナルリードGrzegorz Bizon @grzesiekOps, VerifyStaff Backend Engineer
ファンクショナルリードJason Plum @WarheadsSEDistributionStaff Backend Engineer
ファンクショナルリードMatthias Käppler @mkaepplerMemorySenior Backend Engineer
ファンクショナルリードŁukasz Korbasiewicz @lkorbasiewiczSupportSupport Engineer
メンバーVladimir Shushlin @vshushlinRelease groupSenior Backend Engineer
メンバーErick Bajao @iamricecakeVerifySenior Backend Engineer
メンバーJaime Martinez @jaimePackageBackend Engineer
メンバーDavid Fernandez @10ioPackageSenior Backend Engineer
メンバーTiger Watson @tigerwnzConfigureSenior Backend Engineer
メンバーVitor Meireles De Sousa @vdesousaAppSecSenior Application Security Engineer
メンバーPatrick Bajao @patrickbajaoWorkhorseSenior Backend Engineer
メンバーCatalin Irimie @catGeoSenior Backend Engineer
メンバーSofia Vistas @svistasQualitySenior Software Engineer in Test
メンバーJacob Vosmaer @jacobvosmaer-gitlabScalabilityStaff Backend Engineer

アップロードに関する会社の取り組み

GitLab ではイテレーションで作業を進めており、ダイレクトアップロードは複数のマイルストーンを経て複数のチームによって段階的に開発されました。

関与するチームとマイルストーンの数を示すために、機能開発から技術的負債とセキュリティ修正に至るオブジェクトストレージ開発のタイムラインを以下に示します: