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