4

Postgress は MVCC ルールに従います。そのため、テーブルで実行されるクエリは、テーブルで発生する書き込みと競合しません。クエリは、クエリを実行した時点でのスナップショットに基づいて結果を返します。

今、私はマスターとスレーブを持っています。スレーブは、アナリストがクエリを実行して分析を実行するために使用されます。スレーブが複製していて、アナリストがクエリを同時に実行している場合、レプリケーションのラグが長時間表示されます。クエリが長時間実行されている場合、レプリケーションは長時間ラグが発生し、マスターへの書き込み数がたまたまかなり高い場合、WAL ファイルが失われ、レプリケーションを続行できなくなります。別のスレーブをスピンアップする必要があります。なぜこれが起こるのですか?ポスチャでクエリとレプリケーションを同時に実行するにはどうすればよいですか? これを実現するために適用できるパラメータ設定はありますか?

4

1 に答える 1

2

レプリカはマスターからさらに WAL を適用できません。これは、マスターでまだ実行されているどのデータ ブロックよりも古い、レプリカで実行されているクエリによってまだ必要とされているデータ ブロックをマスターが上書きした可能性があるためです。レプリカには、マスターよりも古い行バージョンが必要です。この一時停止が必要なのは、まさにMVCC のためです。

おそらく、「リカバリとの競合によるステートメントのキャンセル」エラーmax_standby_streaming_delayを回避するために、高い値を設定します。

オンhot_standby_feedbackにすると、レプリカは代わりにマスターにそれらの行を保持するように指示できます。しかし、その場合、マスターは空き領域を効率的にクリーンアップできずpg_xlog、スタンバイが大幅に遅れると、空き領域が不足する可能性があります。

PostgreSQL のマニュアル: クエリの競合の処理を参照してください。

WAL 保持部分については、WAL アーカイブを有効にrestore_commandし、スタンバイ用に a を有効にします。とにかく、ポイントインタイムリカバリのために実際に使用する必要があります。PgBarman では、barman get-walコマンドを使用してこれを簡単に行うことができます。WAL アーカイブが必要ない場合は、代わりにレプリカ サーバーをセットアップして、レプリケーション スロットを使用してマスターに接続することができます。これにより、マスターは必要な WAL を無期限に保持することを認識できます。もちろん、これによりマスターのスペースが不足して実行がpg_xlog停止する可能性があるため、その場合はより綿密に監視する必要があります。

于 2016-05-06T09:11:28.950 に答える