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

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

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

行ベースのデータ分割

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

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

Benefits:

  • 最高のパフォーマンスを発揮します。
  • ノードあたりのテナント密度が最も高くなります。

短所:

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

スキーマに基づくシャーディング

スキーマ ベースのシャーディングでは、共有データベースと個別のスキーマ モデルが使用されます。 各スキーマは、データベース内の論理シャードとして機能します。 マルチテナント アプリでは、テナントごとにスキーマを使用して、テナント ディメンションに沿って簡単にシャード化できます。 クエリを変更する必要はありません。また、アプリケーションはテナントを切り替えるときに適切な search_path を設定するためにわずかな変更のみを必要とします。 スキーマベースのシャーディングは、マイクロサービスや、行ベースのシャーディングのオンボードに必要な変更を受けることができないアプリケーションをデプロイする ISV (独立系ソフトウェア ベンダー) に最適なソリューションです。

Benefits:

  • テナントは異種のスキーマを持つことができます。
  • スキーマの変更は不要です。
  • アプリケーション クエリの変更は不要です。
  • スキーマベースのシャーディングは、行ベースのシャーディングと比較して高い SQL 互換性を備えています。

短所:

  • 行ベース シャーディングと比べて、ノードあたりのテナント数は少なくなります。

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

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