上記の@ max-malyshの優れた回答に、更新された情報と参照をいくつか追加します。
つまり、マスターで何かを行う場合は、スレーブで複製する必要があります。PostgresはこれにWALレコードを使用します。これは、マスターでログに記録されたすべてのアクションの後にスレーブに送信されます。その後、スレーブはアクションを実行し、2つは再び同期します。いくつかのシナリオの1つでは、WALアクションでマスターから受信するものとスレーブで競合する可能性があります。それらのほとんどで、WALアクションが変更したいものと競合するトランザクションがスレーブで発生しています。その場合、2つのオプションがあります。
- WALアクションの適用を少し遅らせて、スレーブが競合するトランザクションを完了できるようにしてから、アクションを適用します。
- スレーブで競合するクエリをキャンセルします。
#1と2つの値に関心があります。
max_standby_archive_delay
-これは、現在のデータではないWALアーカイブからデータが読み取られているときに、マスターとスレーブ間の長い切断後に使用される遅延です。
max_standby_streaming_delay
-WALエントリがストリーミングレプリケーションを介して受信されたときにクエリをキャンセルするために使用される遅延。
一般に、サーバーが高可用性レプリケーションを対象としている場合は、これらの数値を短くする必要があります。これには、デフォルト設定30000
(単位が指定されていない場合はミリ秒)で十分です。ただし、非常に長時間実行されるクエリが含まれる可能性があるアーカイブ、レポートレプリカ、またはリードレプリカなどを設定する場合は、クエリをキャンセルしないように、これをより高い値に設定する必要があります。上記の推奨900s
設定は、良い出発点のようです。私は、無限の値-1
を設定することを良いアイデアとして公式のドキュメントに同意しません-バグのあるコードを覆い、多くの問題を引き起こす可能性があります。
実行時間の長いクエリとこれらの値を高く設定することについての注意点の1つは、WALアクションの遅延の原因となっている実行時間の長いクエリと並行してスレーブで実行されている他のクエリは、長いクエリが完了するまで古いデータを参照することです。開発者はこれを理解し、同時に実行すべきではないクエリをシリアル化する必要があります。
方法max_standby_archive_delay
とmax_standby_streaming_delay
機能、および理由の詳細については、こちらをご覧ください。