すべてのプロダクト
Search
ドキュメントセンター

PolarDB:読み書き分離

最終更新日:May 31, 2024

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

説明

CreateDBEndpointAddress

PolarDBクラスターのパブリックエンドポイントを作成します。

DescribeDBClusterEndpoints

PolarDBクラスターに関するエンドポイント情報を照会します。

ModifyDBClusterEndpoint

PolarDBクラスターのクラスターエンドポイントの設定を変更します。

ModifyDBEndpointAddress

PolarDBクラスターのエンドポイント (カスタムクラスターエンドポイントなど) を変更します。

DeleteDBEndpointAddress

プライマリエンドポイントのパブリックエンドポイント、デフォルトのクラスターエンドポイント、またはPolarDBクラスターのカスタムクラスターエンドポイントをリリースします。