クラスターは、読み書き分離機能を有効にします。 この機能により、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() などの集計関数を除く関数を使用するすべてのステートメントは、プライマリノードにルーティングされます。
クラスターエンドポイントの作成または変更
カスタムクラスターエンドポイントの作成方法の詳細については、「カスタムクラスターエンドポイントの作成と変更」をご参照ください。
クラスターエンドポイントを変更する方法の詳細については、「FAQ」をご参照ください。
トランザクション分割の設定 (詳細設定)
詳細については、「トランザクション分割」をご参照ください。
整合性レベルの指定 (詳細設定)
詳細については、「一貫性レベル」をご参照ください。
よくある質問
レコードを挿入した後、すぐにレコードを取得できないのはなぜですか?
これは、読み書き分割アーキテクチャでは、プライマリノードと読み取り専用ノードとの間のデータ複製中に複製遅延が発生する可能性があるためです。 ただし、PolarDBはセッションの一貫性をサポートします。 これにより、セッション内の更新を照会できます。
読み取り専用ノードに負荷がないのはなぜですか?
デフォルトでは、トランザクション内のすべてのリクエストはプライマリノードに送信されます。 ストレステストにsysbenchを使用する場合は、sysbench 0.5で -- oltp-skip-trx=onを使用するか、sysbench 1.0で -- skip-trx=onを使用してトランザクションをスキップできます。 ビジネスのトランザクション数が多いために読み取り専用ノードの負荷が低すぎる場合は、コンソールでトランザクション分割機能を有効にできます。 詳細については、「トランザクション分割の設定 (詳細設定) 」をご参照ください。
1 つのノードが他のノードよりも多くのリクエストを受け取るのはなぜですか。
要求は、負荷に基づいて各ノードに分配される。 低負荷のノードは、より多くの要求を受信する。
PolarDBはデータへのゼロ遅延読み取りアクセスをサポートしていますか?
いいえ、PolarDBはデータへのゼロ遅延読み取りアクセスをサポートしていません。 プライマリノードと読み取り専用ノードが通常の負荷を処理すると、数ミリ秒の遅延が発生します。 クラスターエンドポイントの読み取り /書き込みモードが読み取りと書き込み (自動読み取り /書き込み分割) の場合、データが書き込まれた後、ゼロ遅延でデータを読み取ることはできません。 データへのゼロ遅延読み取りアクセスが必要な場合は、アプリケーションをプライマリエンドポイントに接続して、すべての読み取りおよび書き込み要求をプライマリノードに送信します。 プライマリエンドポイントは常にPolarDBプライマリノードに接続されています。
新しい読み取り専用ノードは、読み取り /書き込み分割の読み取り要求を自動的に受信できますか。
読み取り専用ノードを追加した後に読み書き分離をサポートするセッションが作成された場合、読み取り要求は読み取り専用ノードに転送されます。 読み取り専用ノードを追加する前に読み書き分離をサポートするセッションが作成された場合、読み取り要求は読み取り専用ノードに転送されません。 読み取り要求が読み取り専用ノードに転送されるようにするには、セッションを閉じてセッションを再度確立します。 たとえば、アプリケーションを再起動してセッションを確立できます。