次の方法で共有


Azure Database for PostgreSQL - フレキシブル サーバーでのエラスティック クラスターのシャーディング モデル

適用対象: Azure Database for PostgreSQL - フレキシブル サーバー

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

Azure Database for PostgreSQL フレキシブル サーバー上のエラスティック クラスターには、行ベースとスキーマベースの 2 種類のデータ シャーディングが用意されています。 各オプションには独自のトレードオフがあるため、アプリケーションの要件に最も合ったアプローチを選択できます。

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

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

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

メリット:

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

短所:

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

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

スキーマ ベースのシャーディングは共有データベースであり、個別のスキーマ モデルです。スキーマはデータベース内の論理シャードになります。 マルチテナント アプリでは、テナントごとのスキーマを使用して、テナント ディメンションに沿って簡単にシャード化できます。 クエリの変更は必要なく、テナントを切り替えるときに適切な 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 に独自のシャード グループを付与できます