This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned on this page are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
StatusAuthorsCoachDRIsOwning StageCreated
proposed -

このドキュメントは作業中のものであり、セルズの設計のごく初期の状態を表しています。重要な点は文書化されていませんが、将来的には追加される予定です。これはCellsの可能性のあるアーキテクチャの一つであり、どのアプローチを実装するか決める前に、代替案と比較検討するつもりです。この文書化は、このアプローチを選ばなかった理由を文書化できるよう、これを実装しないと決めた場合でも残しておきます。

セルデータベース配列

GitLab は今日、全てのデータベース行の作成がユニークなIDを持つことを保証しています。これにより、既知のグローバルIDによってマージリクエストやCIジョブ、プロジェクトにアクセスすることができます。セルは多くの異なるデータベースを使用します。最低限、セルと共有スキーマ間で参照される ID は、あいまいな参照を避けるためにクラスター全体で一意である必要があります。必要なグローバル ID に加えて、将来的に Cell 間でリソースをマイグレーションできるように、すべてのデータベース行に対してグローバルに一意な ID を保持することも望ましいでしょう。

1.定義

2.データフロー

3.提案

これらは、システム全体でユニークなIDを保持するための予備的なアイデアです。

3.1.UUID

インクリメンタルシーケンスを使用する代わりに、データベースに保存されているUUID(128ビット)を使用します。

  • これは既存のIDを壊す可能性があり、すべての既存のテーブルにUUIDカラムを追加する必要があります。
  • これにより、インデックスに32/64ビットの代わりに128ビットを格納する必要があるため、すべてのインデックスが大きくなります。

3.2.ID でエンコードされた Cell インデックスを使用

すでに多くのテーブルが64ビットのID番号を使用しているため、MSBを使用してセルIDをエンコードすることができます:

  • この場合、1024 のセル番号しか割り当てられないので、システムで有効にできるセルの量が制限されるかもしれません。
  • セル 1 のエンティティがセル 100 にマイグレーションされても、この ID は一意であるためです。
  • リソースがマイグレーションされた場合、IDだけではセル番号をデコードできないため、ルックアップテーブルが必要になります。
  • このため、すべてのIDを32ビットに更新する必要があります。

3.3.中央からシーケンス範囲を割り当て

各セルは、中央の管理場所から消費されるシーケンス範囲を受け取るかもしれません。あるセルに割り当てられたテーブルの ID がすべて消費されると、補充され、次の範囲が割り当てられます。ランダム・アクセス・パターンが必要な場合、より高速なルックアップ・テーブルを提供するために、範囲は追跡されるでしょう。

  • セル1のエンティティがセル100にマイグレーションされても、このIDは一意であるため。
  • リソースがマイグレーションされた場合、ID だけではセル番号をデコードすることができず、以前に割り当てられたシーケンス範囲を壊す可能性があるため、より堅牢なルックアップテーブルが必要になります。
  • この場合、すべてのIDを64ビットに更新する必要はありません。
  • これは、Postgresや少なくともRailsのすべてのINSERT ステートメントに、シーケンス番号をチェックする必要があり、IDサーバから更新される範囲を待つ可能性があるため、若干のパフォーマンス上のペナルティが加わります。
  • 利用可能な範囲は一元化された場所に保存され、インクリメントされる必要があります。

3.4.一意なIDを必要とするテーブルだけを定義します。

グローバルに一意なIDを持つテーブルがあってもよいかもしれません。プロジェクト、グループ、その他のトップレベル・エンティティなどです。merge_requests のような他のテーブルは、セルローカルIDを提供するだけで、外部から参照される場合は、IID(プロジェクトのような、与えられたリソースのコンテキストで単調なID)を使用します。

  • このため、merge_requests の ID 10000 はすべてのセルに存在することになり、リソースの一意性に関して混乱することがあります。
  • このため、IDによるランダムアクセスは(必要であれば)複合キーを使わないと不可能になるかもしれません:project_id+merge_request_id.
  • このため、レコードを別の Cell にマイグレーションする必要がある場合は、新しい ID の変換/生成を実装する必要があります。これは、これらのIDがマイグレーションされる他のレコードの外部キーとしても使用される場合、マイグレーション処理が非常に困難になる可能性があります。
  • セル間の移動時に ID を変更する必要がある場合、ID によるレコードへのリンクがproject_id を含んでいたとしても機能しなくなります。
  • これらのIDが一意でないことを許可し、一意制約を複合キーに基づくものに変更する予定であれば、すべての外部キー参照を複合キーに基づくものに更新する必要があります。

4.評価

4.1.長所

4.2.コンサ