web-dev-qa-db-ja.com

postgres:archive_commandとは何か、いつ使用するか

スレーブがホットスタンバイであり、読み取り専用バックアップとして使用されるマスター/スレーブpostgresql設定があります。現在、archive_commandは「cd」に設定されています。 (私が読んだように何もしない)。私の理解は、archive_commandがwalセグメントを特定の場所にコピーできることです。通常、cpコマンドを使用してディスク上の別の場所にコピーする例を参照しています。私はwal_keep_segmentsを256に設定しているので、私が正しく理解していれば、スレーブは約4GB(16MB * 256)相当のwalの変更分遅れることがあります。これは、ラグを説明するのに十分なwalセグメントがあるため、archive_commandを使用する必要がなかった理由ですか?

では、オプションのarchive_commandの目的は、wal_keep_segments設定よりも多くのwalセグメントを保存することですか?したがって、私の場合、256個のwalセグメントがデータベースディレクトリ(pg_xlog)にあり、postgresは自動的にロートアウトして、制限に達したときにこれらのwalセグメントをクリーンアップします。

そして、archive_commandを配置した場合、コマンドがファイルをコピーした場所にwalセグメントを保存し続けますか?この考えは正しいですか?

次に、archive_commandの私の理解が正しいと仮定すると、スレーブはこれらのwalファイルをどのように利用しますか?スレーブは最初にマスターデータディレクトリから256個のwalファイルを取得しようとしますが、その後、recovery_commandにフォールバックしてそれより古いwalファイルを取得しますか? recovery_commandはスレーブで実行されますか、それともマスターを介してプロキシされますか。 recovery_commandの例の多くはそれがcpで使用されていることを示しているので、ファイルが別のサーバーに転送される方法がわかりませんか?

私はこれを含む、以下を含む数多くのガイドを読んでみました。
archive_commandを使用する必要がある場合と使用しない場合https://www.postgresql.org/docs/current/static/continuous-archiving.html

私はまだ概念に少し漠然としていて、いくつかの明快さを達成しようとしています。上記の私の考えが正しいかどうか、そしてなぜ私がarchive_commandを使用するのかについて誰かがいくつかの明確さをもたらすことができますか?読んでくれてありがとう。

これが私の設定です:

マスター:postgresql.conf

listen_addresses = '*' 

wal_level = hot_standby
archive_mode = on 
max_wal_senders = 2
archive_command = 'cd .'
wal_keep_segments = 256 
hot_standby = on

スレーブ:postgresql.conf

listen_addresses = '*' 

wal_level = hot_standby
archive_mode = on 
max_wal_senders = 2
archive_command = 'cd .'
wal_keep_segments = 256 
hot_standby = on

スレーブ:recovery.conf

standby_mode = 'on'
primary_conninfo = 'Host=IP-of-master port=5432 user=rep password=****'
trigger_file = '/tmp/postgresql.trigger.5432'
3
Joe J

archive_commandは、次の場合に役立ちます。

  • データベースを誤って削除した場合などの災害時に、ベースバックアップから過去の状態にポイントインタイムリカバリを実行したい。

  • レプリケーションスロットのないストリーミングレプリケーションを使用しています。この場合、レプリカがwal_keep_segmentsを超えて遅れ、hot_standby_feedbackがオフであるか、レプリカが一時的に切断されている場合、マスターは必要なリソースを削除し、破損します。 WALアーカイブを使用している場合、レプリカはフォールバックしてrestore_commandを使用してWALをフェッチし、追いつき、回復することができます。それ以外の場合は、新しいpg_basebackupから再作成する必要があります。

5
Craig Ringer