Connecting through Connection Manager#
地域分散PGDクラスターでは、 Connection Manager Authentication がルーティングを自動的に処理し、書き込み接続を現在の書き込みリーダーに転送し、読み取り接続をレプリカに転送します。個々のノードに直接ではなく接続マネージャーのエンドポイントに接続するようにアプリケーションをデザインし、復元のために複数のホストをリストするように接続文字列を構成します。
読み取りと書き込みの分割#
接続マネージャーは、各ノードで2つのポートを公開します。ワークロードに基づいて、トラフィックを適切なポートに転送します。
読み取り書き込みポート 接続をノードグループの現在の書き込みリーダーにルーティングします。このポートは、すべての書き込み操作と、最新のデータを必要とする読み取りに使用します。
host=node1.<location>,node2.<location>,node3.<location> port=6432 dbname=<dbname> user=<username>
読み取り専用ポート 接続をレプリカにルーティングします。このポートは、わずかなレプリケーションラグを許容できるクエリと読み取りを報告するために使用して、読み取りトラフィックを書き込みリーダーから遠ざけます。
host=node1.<location>,node2.<location>,node3.<location> port=6433 dbname=<dbname> user=<username>
DBAはポート番号を構成し、それらはクラスター内のすべてのノードで一貫しています。正しい値についてはDBAに問い合わせてください。
両方の接続文字列に複数のノードをリストして、1つのノードが使用できない場合、クライアントドライバーが次のノードを自動的に試行します。
サブスクライバ専用ノードは書き込みを決して受け入れないため、常に読み取り専用ポートを介して接続します。
接続文字列の構成#
地域分散展開の場合、次のことに注意して接続文字列を構成します。
ローカルノードに接続します。 リモートノードにルーティングするのではなく、アプリケーションサーバーと同じ場所にあるConnection Managerインスタンスに接続すると、アプリケーションの実行が速くなります。接続マネージャーは、必要に応じて書き込みリーダーへのルーティングを処理します。
適切なタイムアウトを設定します。 クロスリージョンのネットワーク遅延は、単一のデータセンター内よりも長くなります。これを説明するには、接続文字列で標準のPostgres
connect_timeoutパラメーターを使用します。地理分散クラスターの場合、5〜10秒が一般的です。
フェイルオーバーの処理#
書き込みリーダーに障害が発生すると、接続マネージャーは障害を検出し、選択が完了した後に新しい書き込みリーダーに接続をルーティングします。選挙中に飛行中の接続がドロップするため、アプリケーションは以下を考慮する必要があります。
接続のドロップが予想されます フェールオーバー中に進行中の開いているトランザクションはロールバックされます。アプリケーションは接続エラーをキャッチし、再試行する必要があります。
トランザクションの結果を想定しないでください
COMMIT中の接続ドロップはどのデータベースでも発生する可能性がありますが、書き込みリーダー選択により、地域分散クラスターではより頻繁に発生します。接続がドロップしたときにレプリケーションが進行中の場合、トランザクションは一部のノードで既にコミットされている可能性があります。標準トランザクションの場合、べき等な操作で再試行します。非冪等クリティカルトランザクションの場合、 CAMOパートナーとの連携 を使用して正確な結果を判断します。バックオフを使用した再試行ロジックを実装します。 接続障害の直後に再試行すると、フェールオーバーの進行中のノードにヒットする危険があります。再試行ストラテジーについては、 Handling retries and failures を参照してください。
ロケーションレベルのフェールオーバーの計画を立てる ロケーションレベルのフェールオーバーは、多くの場合、DNSまたはロードバランサー構成を介してインフラストラクチャレベルで処理されます。接続を直接管理するアプリケーションの場合、接続文字列にセカンダリフォールバックとしてリモートノードを含めることをお勧めします。