シャーディング モデル

適用対象: Azure Cosmos DB for PostgreSQL (PostgreSQL の Citus データベース拡張機能を利用)

シャーディングは、複数のサーバーまたはノード間でデータを水平方向にパーティション分割するために、データベース システムと分散コンピューティングで使用される手法です。 これには、大規模なデータベースまたはデータセットをシャードと呼ばれる、より管理しやすい小さな部分に分割する必要があります。 シャードにはデータのサブセットが含まれており、シャードはまとめて完全なデータセットを形成します。

Azure Cosmos DB for PostgreSQL には、行ベースとスキーマベースの 2 種類のデータ シャーディングが用意されています。 各オプションには独自のシャーディング トレードオフが付属しているため、アプリケーションの要件に最も合ったアプローチを選択できます。

行ベースのシャーディング

Azure Cosmos DB for PostgreSQL シャード テーブルの従来の方法は、単一データベースの共有スキーマ モデルであり、行ベースのシャーディングとも呼ばれ、テナントは同じテーブル内の行として共存します。 テナントは、テーブルを水平方向に分割できるディストリビューション列を定義することによって決定されます。

行ベースは、シャーディングの最もハードウェア効率の高い方法です。 テナントは高密度にパックされ、クラスター内のノード間で分散されます。 ただし、この方法では、スキーマ内のすべてのテーブルにディストリビューション列があること、アプリケーション内のすべてのクエリでそれによってフィルター処理を行うことを確認する必要があります。 行ベースのシャーディングは、IoT ワークロードに優れ、ハードウェアの使用から最大限のマージンを実現します。

メリット:

  • 最も高いパフォーマンス
  • ノードあたりの最適なテナント密度

欠点:

  • スキーマの変更が必要
  • アプリケーション クエリの変更が必要
  • すべてのテナントが同じスキーマを共有する必要がある

スキーマ ベースのシャーディング

Azure Cosmos DB for PostgreSQL の Citus 12.0 で使用できるスキーマ ベースのシャーディングは、共有データベースであり、個別のスキーマ モデルです。スキーマはデータベース内の論理シャードになります。 マルチテナント アプリでは、テナントごとのスキーマを使用して、テナント ディメンションに沿って簡単にシャード化できます。 クエリの変更は必要なく、テナントを切り替えるときに適切な search_path を設定するため少しだけアプリケーションを変更する必要があります。 スキーマベースのシャーディングは、マイクロサービスや、行ベースのシャーディングのオンボードに必要な変更を受けることができないアプリケーションをデプロイする ISV に最適なソリューションです。

メリット:

  • テナントには異種スキーマを含めることができる
  • スキーマを変更する必要がない
  • アプリケーション クエリを変更する必要がない
  • スキーマベースのシャーディング SQL の互換性は、行ベースのシャーディングと比較して優れている

欠点:

  • ノードあたりのテナント数が、行ベースのシャーディングと比較して少ない

シャーディングのトレードオフ

スキーマ ベースのシャーディング 行ベースのシャーディング
マルチテナント モデル テナントごとに個別のスキーマ テナント ID 列を持つ共有テーブル
Citus バージョン 12.0+ すべてのバージョン
Vanilla PostgreSQL と比較した追加の手順 なし、構成の変更のみ 各テーブルの create_distributed_table を使用して、テーブルをテナント ID 別に分散および併置する
テナントの数 1 から 10,000 1 から 100 万以上
データ モデリングの要件 均等配置スキーマ間で外部キーが存在しない テナント ID 列 (ディストリビューション列、シャーディング キーとも呼ばれる) を各テーブルに含める必要がある。また、主キーには外部キーを含める必要がある
単一ノード クエリの SQL 要件 クエリごとに 1 つの均等配置スキーマを使用する 結合句と WHERE 句には、列 tenant_id 含める必要がある
並列テナント間クエリ いいえ はい
テナントごとのカスタム テーブル定義 はい いいえ
アクセス制御 スキーマのアクセス許可 スキーマのアクセス許可
テナント間でのデータ共有 あり (別のスキーマ内の参照テーブルを使用) あり (参照テーブルを使用)
テナントからシャードへの分離 すべてのテナントには、定義別に独自のシャード グループがあります isolate_tenant_to_new_shard を使用して、特定のテナント ID に独自のシャード グループを付与できます