Share via


Azure Cosmos DB for PostgreSQL でのスケーリングの基本的な概念

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

新しいアプリの構築手順に進む前に、関係する用語と概念について簡単に説明します。

アーキテクチャの概要

Azure Cosmos DB for PostgreSQL を使用すると、クラスター内の複数のマシンにテーブルを分散し、それらのテーブルに対して、プレーン PostgreSQL に対してクエリを実行する場合と同じように透過的にクエリを実行できます。

テーブルをワーカー ノードにシャーディングするコーディネーター ノードの図。

Azure Cosmos DB for PostgreSQL アーキテクチャには、次のような複数の種類のノードがあります。

  • コーディネーター ノードは、分散テーブルのメタデータを格納し、分散計画を担当します。
  • これに対し、ワーカー ノードは実際のデータを格納し、計算を行います。
  • コーディネーターとワーカーはどちらもプレーン PostgreSQL データベースであり、citus 拡張機能が読み込まれています。

上の図の campaigns のような通常の PostgreSQL テーブルを分散するには、create_distributed_table() というコマンドを実行します。 このコマンドを実行すると、Azure Cosmos DB for PostgreSQL により、テーブルのシャードがワーカー ノード間で透過的に作成されます。 図では、青のボックスでシャードを表しています。

注意

ワーカー ノードのないクラスターでは、分散テーブルのシャードはコーディネーター ノード上にあります。

シャードは、データのスライスを保持するプレーンな (ただし特別な名前の) PostgreSQL テーブルです。 この例では、company_id によって campaigns を分散したので、シャードはキャンペーンを保持し、さまざまな会社のキャンペーンがさまざまなシャードに割り当てられます。

分散列 (別名シャード キー)

create_distributed_table() は、テーブルを分散したり、複数のマシンにまたがってリソースを使用したりするために Azure Cosmos DB for PostgreSQL が提供するマジック関数です。

SELECT create_distributed_table(
	'table_name',
	'distribution_column');

上記の 2 番目の引数は、テーブルから分散列として列を選択します。 ネイティブ PostgreSQL 型の任意の列を指定できます (整数とテキストが最も一般的です)。 分散列の値によって、どの行がどのシャードに入るかが決まります。そのため、分散列はシャード キーとも呼ばれます。

Azure Cosmos DB for PostgreSQL は、シャード キーの使用に基づいてクエリの実行方法を決定します。

クエリに関係するもの これを実行しています。
ただ 1 つのシャード キー そのシャードを保持するワーカー ノード
複数のシャード キー 複数のノード間で並列化

シャード キーの選択により、アプリケーションのパフォーマンスとスケーラビリティが決まります。

  • シャード キーあたりの不均一なデータ分散 (データ スキューとも呼ばれます) は、パフォーマンスにとって最適ではありません。 たとえば、1 つの値がデータの 50% を表す列を選択しないでください。
  • カーディナリティが低いシャード キーは、スケーラビリティに影響を与える可能性があります。 個別のキー値があるのと同じ数のシャードのみを使用できます。 カーディナリティが数百から数千のキーを選択してください。
  • シャード キーが異なる 2 つの大きなテーブルの結合には、時間がかかる場合があります。 大きなテーブル間で共通のシャード キーを選択してください。 「コロケーション」で詳しく説明します。

併置

シャード キーに密接に関連するもう 1 つの概念は、コロケーションです。 同じ分散列の値によってシャード化されたテーブルは併置され、併置されたテーブルのシャードは同じワーカーにまとめて格納されます。

同じキー site_id によってシャード化された 2 つのテーブルを次に示します。 これらは併置されます。

site_id で併置されるテーブル http_request および http_request_1min の図。

Azure Cosmos DB for PostgreSQL は、両方のテーブルで site_id の値が一致する行が同じワーカー ノードに格納されることを保証します。 両方のテーブルで、site_id=1 を含む行がワーカー 1 に格納されていることがわかります。 他のサイト ID についても同様です。

コロケーションは、これらのテーブル全体で JOIN を最適化するのに役立ちます。 site_id で 2 つのテーブルを結合すると、Azure Cosmos DB for PostgreSQL では、ノード間でデータをシャッフルすることなく、ワーカー ノードでローカル結合を実行できます。

次のステップ