タイトルで言いたいことだいたい言っちゃったんですが、
readerエンドポイントでpg_dump を実行していたら、大きめのテーブルをdumpしている時に接続がちょこちょこ途切れる現象が発生していました。 それで、DBのログを見てみたら以下のエラーがありました
FATAL: terminating connection due to conflict with recovery DETAIL: User was holding a relation lock for too long.
これは、以下のサイトに詳しいのですが
「writer側の更新によるWAL(トランザクションログ)が、reader側に更新される」のと、「reader側の参照処理」がコンフリクトした場合に、一定時間が経過すると、参照側の接続が切られる という、psqlの機能のために発生しています
で、その待機時間を設定するためのオプションが、max_standby_streaming_delay
です
max_standby_streaming_delay
のポイント
- postgreSQLのデフォルト値は30秒
- Amazon Aurora PostgreSQL では、14秒
- Amazon Aurora PostgreSQL で、設定できる最大値は 30秒
30秒で処理しきれない参照処理がある場合はどうしたら良いの?
- 諦めてwriterエンドポイントで処理する
- もしくは、SQLを分割するなど対策をする