PolarDB for PostgreSQLクラスターは、読み書き分離機能をサポートしています。 読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントを使用している場合、クラスターエンドポイントは自動的に読み書き要求を関連するノードに転送します。
背景情報
多数の読み取り要求がデータベースに送信され、少数の書き込み要求が送信された場合、単一のノードがワークロードを処理できない場合があります。 これはサービスに影響を与える可能性があります。 読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントを使用している場合、クラスターエンドポイントは自動的に書き込みリクエストをプライマリノードに転送し、読み取りリクエストを読み取り専用ノードに転送します。 このようにして、読み出し能力は、データベースに送信される多数の読み出し要求を処理するように、弾力的にスケーリングすることができる。
メリット
統合エンドポイントに基づく簡単なメンテナンス
読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントを使用しない場合は、アプリケーションでプライマリノードと各読み取り専用ノードのエンドポイントを設定する必要があります。 それ以外の場合は、書き込み要求をプライマリノードに送信し、読み取り要求を読み取り専用ノードに送信することはできません。 読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントにアプリケーションを接続すると、クラスターエンドポイントは読み書きリクエストを関連するノードに自動的に転送できます。 これにより、保守コストが削減されます。 クラスターの処理能力を向上させるために読み取り専用ノードを追加するだけで済み、アプリケーションを変更する必要はありません。
セッションレベルの読み取り一貫性
クライアントがクラスターエンドポイントを使用してバックエンドに接続すると、読み書き分離用の組み込みプロキシが自動的にプライマリノードと各読み取り専用ノードへの接続を確立します。 同じセッションでは、組み込みプロキシはまず、各データベースノードのデータ同期の進行状況に基づいて、適切なノードを選択します。 次に、プロキシは、データが最新かつ正しいノードに読み取りおよび書き込み要求を転送する。 これにより、ノード間で読み取り要求と書き込み要求のバランスが取ります。
PREPAREステートメントの均等な配布
書き込み操作を含むPREPAREステートメントと関連するEXECUTEステートメントは、プライマリノードにのみ送信されます。 読み取り専用操作を含むPREPAREステートメントはすべてのノードにブロードキャストされ、関連するEXECUTEステートメントはこれらのノードの負荷に基づいてルーティングされます。 これにより、クエリ要求の負荷分散が実現されます。
ネイティブの高セキュリティリンクのサポートとパフォーマンスの向上
クラウド上に独自のプロキシを構築して、読み書き分離を実現できます。 しかしながら、データがデータベースに到着する前に複数のコンポーネントによってデータが解析され転送されるため、過度の待ち時間が発生する可能性がある。 ただし、PolarDBは、読み書き分離のクラスターコンポーネントとして機能する組み込みプロキシを使用します。 組み込みプロキシは、外部コンポーネントよりもレイテンシが低く、データ処理速度が速くなります。
データベースの可用性を高めるためのノードヘルスチェック
PolarDBの読み書き分離モジュールは、クラスターのプライマリノードと読み取り専用ノードでヘルスチェックを実行します。 ノードに障害が発生するか、そのレイテンシが指定されたしきい値を超えると、PolarDBはこのノードへの読み取り要求の配信を停止し、書き込みおよび読み取り要求を他の正常なノードに配信します。 これにより、単一の読み取り専用ノードに障害が発生しても、アプリケーションがクラスターにアクセスできるようになります。 ノードが回復すると、PolarDBはリクエストを受信できるノードのリストにノードを自動的に追加します。
制限事項
PolarDBは、次のステートメントまたは機能をサポートしていません。
レプリケーションモード方式でクラスターに接続します。 プライマリ/セカンダリレプリケーションアーキテクチャに基づいて、デュアルノードクラスターを設定する必要がある場合は、プライマリノードのエンドポイントを使用してください。
% ROWTYPE属性を宣言するには、一時テーブルの名前を使用します。
一時テーブルのフルネーム (最初のテキスト、最後のテキスト) を作成します。select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;
関数を使用して一時リソースを作成します。
関数を使用して一時テーブルを作成し、SQL文を実行して一時テーブルを照会すると、エラーメッセージが返される場合があります。 エラーメッセージは、テーブルが存在しないことを示します。
関数にPREPAREステートメントが含まれている場合、executeステートメントを実行するとエラーメッセージが返されることがあります。 エラーメッセージは、PREPAREステートメント名が存在しないことを示しています。
ルーティング関連の制限事項
トランザクション内の要求はプライマリノードにルーティングされ、トランザクションが終了すると負荷分散が再開されます。
COUNT() やSUM() などの集計関数を除く関数を使用するすべてのステートメントは、プライマリノードにルーティングされます。
クラスターエンドポイントの作成または変更
カスタムクラスターエンドポイントの作成方法の詳細については、「カスタムクラスターエンドポイントの作成」をご参照ください。
クラスターエンドポイントを変更する方法の詳細については、「カスタムクラスターエンドポイントの作成」をご参照ください。
整合性レベルの設定
詳細については、「一貫性レベル」をご参照ください。
SQL文のルーティング方向を指定するヒントを追加する
SQL文の前に /* FORCE_MASTER */
または /* FORCE_SLAVE */
ヒントを追加して、SQL文をルーティングする方向を指定します。 既定では、SELECT * FROM test
ステートメントは読み取り専用ノードにルーティングされます。 SQL文を /* FORCE_MASTER */ SELECT * FROM test
に変更すると、SQL文はプライマリノードにルーティングされます。
PolarDB for PostgreSQLクラスターへの接続
PolarDB for PostgreSQLクラスターへの接続
クラスターエンドポイントの作成後、自動読み書き分離を実現するには、アプリケーションでクラスターエンドポイントを設定するだけで済みます。
関連する API 操作
API | 説明 |
PolarDBクラスターのパブリックエンドポイントを作成します。 | |
PolarDBクラスターに関するエンドポイント情報を照会します。 | |
PolarDBクラスターのクラスターエンドポイントの設定を変更します。 | |
PolarDBクラスターのエンドポイント (カスタムクラスターエンドポイントなど) を変更します。 | |
プライマリエンドポイントのパブリックエンドポイント、デフォルトのクラスターエンドポイント、またはPolarDBクラスターのカスタムクラスターエンドポイントをリリースします。 |