Status | Authors | Coach | DRIs | Owning Stage | Created |
---|---|---|---|---|---|
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が一意でないことを許可し、一意制約を複合キーに基づくものに変更する予定であれば、すべての外部キー参照を複合キーに基づくものに更新する必要があります。