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

PolarDB:読み書き分離

最終更新日:Jun 26, 2024

クラスターは、読み書き分離機能を有効にします。 この機能により、PolarDBクラスターは、クラスターエンドポイントを使用してアプリケーションからの読み取りおよび書き込み要求を分散できます。 PolarDBクラスターの組み込みプロキシは、書き込みリクエストをプライマリノードに転送します。 プロキシは、読み取り要求をプライマリノードまたは読み取り専用ノードに転送します。 宛先ノードは、ノードの負荷に依存する。 ノード上で処理されない要求の数は、ノード上の負荷を示す。

メリット

  • 統合エンドポイントに基づく簡単なメンテナンス

    読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントを使用しない場合は、アプリケーションでプライマリノードと各読み取り専用ノードのエンドポイントを設定する必要があります。 それ以外の場合は、書き込み要求をプライマリノードに送信し、読み取り要求を読み取り専用ノードに送信することはできません。 読み書きモードが読み書き (自動読み書き分離) のクラスターエンドポイントにアプリケーションを接続すると、クラスターエンドポイントは読み書きリクエストを関連するノードに自動的に転送できます。 これにより、保守コストが削減されます。 クラスターの処理能力を向上させるために読み取り専用ノードを追加するだけで済み、アプリケーションを変更する必要はありません。

  • セッションレベルの読み取り一貫性

    クライアントがクラスターエンドポイントを使用してバックエンドに接続すると、読み書き分離用の組み込みプロキシが自動的にプライマリノードと各読み取り専用ノードへの接続を確立します。 同じセッションでは、組み込みプロキシはまず、各データベースノードのデータ同期の進行状況に基づいて、適切なノードを選択します。 次に、プロキシは、データが最新かつ正しいノードに読み取りおよび書き込み要求を転送する。 これにより、ノード間で読み取り要求と書き込み要求のバランスが取ります。

  • 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ステートメント名が存在しないことを示しています。

  • ルーティング関連の制限事項

    • トランザクション内の要求はプライマリノードにルーティングされ、トランザクションが終了すると負荷分散が再開されます。

    • COUNT() やSUM() などの集計関数を除く関数を使用するすべてのステートメントは、プライマリノードにルーティングされます。

クラスターエンドポイントの作成または変更

トランザクション分割の設定 (詳細設定)

詳細については、「トランザクション分割」をご参照ください。

整合性レベルの指定 (詳細設定)

詳細については、「一貫性レベル」をご参照ください。

よくある質問

  • レコードを挿入した後、すぐにレコードを取得できないのはなぜですか?

    これは、読み書き分割アーキテクチャでは、プライマリノードと読み取り専用ノードとの間のデータ複製中に複製遅延が発生する可能性があるためです。 ただし、PolarDBはセッションの一貫性をサポートします。 これにより、セッション内の更新を照会できます。

  • 読み取り専用ノードに負荷がないのはなぜですか?

    デフォルトでは、トランザクション内のすべてのリクエストはプライマリノードに送信されます。 ストレステストにsysbenchを使用する場合は、sysbench 0.5で -- oltp-skip-trx=onを使用するか、sysbench 1.0で -- skip-trx=onを使用してトランザクションをスキップできます。 ビジネスのトランザクション数が多いために読み取り専用ノードの負荷が低すぎる場合は、コンソールでトランザクション分割機能を有効にできます。 詳細については、「トランザクション分割の設定 (詳細設定) 」をご参照ください。

  • 1 つのノードが他のノードよりも多くのリクエストを受け取るのはなぜですか。

    要求は、負荷に基づいて各ノードに分配される。 低負荷のノードは、より多くの要求を受信する。

  • PolarDBはデータへのゼロ遅延読み取りアクセスをサポートしていますか?

    いいえ、PolarDBはデータへのゼロ遅延読み取りアクセスをサポートしていません。 プライマリノードと読み取り専用ノードが通常の負荷を処理すると、数ミリ秒の遅延が発生します。 クラスターエンドポイントの読み取り /書き込みモードが読み取りと書き込み (自動読み取り /書き込み分割) の場合、データが書き込まれた後、ゼロ遅延でデータを読み取ることはできません。 データへのゼロ遅延読み取りアクセスが必要な場合は、アプリケーションをプライマリエンドポイントに接続して、すべての読み取りおよび書き込み要求をプライマリノードに送信します。 プライマリエンドポイントは常にPolarDBプライマリノードに接続されています。

  • 新しい読み取り専用ノードは、読み取り /書き込み分割の読み取り要求を自動的に受信できますか。

    読み取り専用ノードを追加した後に読み書き分離をサポートするセッションが作成された場合、読み取り要求は読み取り専用ノードに転送されます。 読み取り専用ノードを追加する前に読み書き分離をサポートするセッションが作成された場合、読み取り要求は読み取り専用ノードに転送されません。 読み取り要求が読み取り専用ノードに転送されるようにするには、セッションを閉じてセッションを再度確立します。 たとえば、アプリケーションを再起動してセッションを確立できます。