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