シャーディング モデル
適用対象: 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 に独自のシャード グループを付与できます |