Aurora Postgresqlでインスタンスロール(読み込み・書き込み)をクライアントから判別できますか?

テクニカルサポートノート。サービス名:Aurora Postgresql
2020.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

コネクションプーリングを利用しており、フェイルオーバーが発生すると、読み込みインスタンスに書き込みに行ってしまう。そのため、書き込みインスタンスをアプリケーション側から判定したい。

どう対応すればいいの?

Postgresqlに対して、SHOW transaction_read_onlyを実行します。
実行結果により、そのコネクションからの接続先が読み込み・書き込みインスタンスかが確認できます。

  • OFF 書き込みノード(プライマリ)です。
  • ON 読み込みノード(Auroraレプリカ)です。

参考情報

Amazon Aurora PostgreSQL を使用する際のベストプラクティス

アプリケーションは、プライマリまたはセカンダリのすべてのノードタイプに接続の確立を試行します。接続したら、まずコマンド SHOW transaction_read_only の結果をクエリして、ノードの読み書きステータスを調べることをお勧めします。

返されるクエリの値が OFF の場合、プライマリノードへの接続に成功しました。返される値が ON の場合、アプリケーションは読み書き接続を要求しています。aurora_replica_status 関数を呼び出して、server_id に session_id='MASTER_SESSION_ID' があることを判断します。この関数は、プライマリノードの名前を表示します。これは、以下に説明する「endpointPostfix」とともに使用できます。

注意すべき点の 1 つは、古いデータを持つレプリカに接続するときです。この場合、aurora_replica_status 関数は最新ではない情報を表示することがあります。古さのしきい値はアプリケーションレベルで設定でき、サーバー時間と last_update_time の差異を見ることで確認できます。一般に、アプリケーションでは、aurora_replica_status 関数から返される情報が矛盾することによる 2 つのホスト間での急変を避ける必要があります。アプリケーションは、aurora_replica_status 関数から返されるデータに安易に従うのではなく、最初にすべての既知のホストを試す必要があります。