2016-05-06 6 views
2

ポストバックはMVCCルールに従います。したがって、テーブル上で実行されるクエリは、テーブル上で発生する書き込みと競合しません。クエリは、クエリを実行した時点のスナップショットに基づいて結果を返します。クエリとレプリケーションが同時に行われているときにPostgresqlのレプリケーションが一時停止する

私はマスターとスレーブを持っています。スレーブは、アナリストがクエリを実行し、分析を実行するために使用されます。スレーブがレプリケートしているときとアナリストが同時にクエリを実行しているとき、私は長い間レプリケーションの遅れを見ることができます。クエリが長時間実行されていると、レプリケーションは長時間遅くなり、マスターの書き込み回数かなり高ければ、私はWALファイルを失うことになり、複製はより長く進むことができます。私は別のスレーブをスピンアップさせるだけです。なぜこれが起こるのですか?姿勢でクエリとレプリケーションを同時に行う方法を教えてください。これを実現するために適用できるパラメータ設定はありますか?マスターはまだレプリカ上で実行中のクエリが必要とする上書きされたデータ・ブロックをした可能性があるため、

+0

追加するには、前回のレプリケーションはシングルスレッドです...もし私がスレーブ上でテーブルAを照会しているのであれば、テーブルAはレプリケーションのためのロックを取得するでしょう。今、テーブルBにマスタで起こっている挿入/更新がある場合、テーブルAの背後にあるWALファイルを待っています...それで、テーブルAのクエリが完了しない限り、レプリケーションは続行できません...マルチスレッドの場合は、それはテーブルAとは何の関係もなく、遅れずに進めることができることを知っています...私はpostgresのレプリケーションメカニズムを理解するのは正しいですか? – Ramanan

+0

"レプリケーションが長時間遅れ、マスターの書き込み回数が非常に多くなった場合、WALファイルが失われ、レプリケーションが長くなる可能性があります"ということは、レプリケーションが正しく設定されていないことを示しています。なぜもっと詳細で質問を更新しないのですか?あなたの設定ファイルからの抜粋も役に立ちます。 – e4c5

+0

また、この質問はdba.stackexchange.comより適しているかもしれません。 – e4c5

答えて

1

レプリカがマスターからより多くのWALを適用することはできません任意のは、まだマスター上で実行されているよりも古いthat're。レプリカにはマスターより古い行バージョンが必要です。 MVCCのがこの一時停止が必要なので、正確にはです。

おそらく"canceling statement due to conflict with recovery" errorsを避けるために、高max_standby_streaming_delayを設定します。

あなたが上hot_standby_feedbackを有効にした場合、レプリカではなく、それらの行を保つために、マスターを伝えることができます。しかし、マスタは効率的に空き領域をクリーンアップすることはできません。スタンバイがあまりにも遅れている場合は、pg_xlogの領域が不足する可能性があります。

PostgreSQL manual: Handling Query Conflictsを参照してください。 WAL保持部については

:WALアーカイブとあなたのスタンバイ用restore_commandを有効にします。ポイントインタイムリカバリのためには、とにかく使用してください。 PgBarmanはbarman get-walコマンドでこれを簡単にするようになりました。 WALアーカイブを必要としない場合は、レプリカサーバーをレプリケーションスロットを使用してマスターに接続するように設定することができます。マスターは必要なWALを無期限に保持することができます。もちろん、それによってマスターがpg_xlogの領域を使い果たしてしまい、実行が中断される可能性があります。そのようにすれば、さらに詳細に監視する必要があります。

+1

お返事ありがとうございます。セットアップでhot_standby_feedbackを試してみます。あなたの説明から私の理解は、死んだ行は依然としてマスターサーバー上に保持され、しばらくの間テーブルを膨らませるということです。だから、いつプライマリのクリーンアップが起こるのですか?クエリの実行が終了するとクリーンアップが実行されますか? – Ramanan

関連する問題