最近、マスター(物理、CentOSリリース6.6)とスレーブ(仮想、CentOS 7.6)の間でpostgresストリーミングレプリケーションをセットアップしました。テストを行ったところ、ストリーミングレプリケーションは正常に機能しています。
マスターにいくつかのデータベースを作成し、それをスレーブサーバーに複製しています。 Postgresqlのバージョンは9.4で、データディレクトリはマスターとスレーブの両方で「/var/lib/pgsql/9.4/data」です。
ストリーミングレプリケーションの設定中に、マスターでpostgresql.confを編集します
wal_level = hot_standby
max_wal_senders = 5
wal_keep_segments = 32
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/9.4/archive/%f'
スレーブのrecovery.confは
standby_mode = 'on'
primary_conninfo = 'Host=192.168.0.10 port=5432 user=replication password=password'
trigger_file = '/var/lib/pgsql/9.4/trigger'
restore_command = 'cp /var/lib/pgsql/9.4/archive/%f "%p"'
以下のコマンドも追加して、スレーブのrecovery.confの古いアーカイブをクリアします
archive_cleanup_command = 'pg_archivecleanup /var/lib/pgsql/9.4/archive %r'
しかし、スレーブのpg_logに以下のエラーが表示され始めました。
< 2019-01-16 09:02:48.937 EST >WARNING: archive_cleanup_command "pg_archivecleanup /var/lib/pgsql/9.4/archive %r": child process exited with exit code 2
pg_archivecleanup: archive location "/var/lib/pgsql/9.4/archive" does not exist
< 2019-01-16 09:07:45.927 EST >WARNING: archive_cleanup_command "pg_archivecleanup /var/lib/pgsql/9.4/archive %r": child process exited with exit code 2
調査の結果、スレーブにはこのディレクトリ「/var/lib/pgsql/9.4/archive」がなく、マスターサーバーにのみ存在するため、問題が本物であることがわかりました。
今、recovery.conf(スレーブ)から「archive_cleanup_command」を削除しましたが、マスターサーバーでは「/var/lib/pgsql/9.4/archive」が非常に多くのスペースを使用しています。これらの古いファイルを「アーカイブ」内で消去する必要があります。
私はいくつかの疑いを持っていて、問題を解決するためにいくつかの提案をしたかった:-
pg_archivecleanup -d archive 000000010000003700000010.00000020.backup
pg_archivecleanup: keep WAL file "archive/000000010000003700000010" and later
pg_archivecleanup: removing file "archive/00000001000000370000000F"
pg_archivecleanup: removing file "archive/00000001000000370000000E"
アーカイブはストリーミングレプリケーションをサポートするためだけに存在しますか、それともPITRなどの他の理由でそれを必要としますか? (最初にpg_archivecleanupを設定しようとしたので、他の理由でそれを望まないことを推測できます...)
現在、restore_commandが壊れているため、ストリーミングレプリケーションをサポートするために、これまでWALアーカイブは必要なかったことがわかります。これは、必要であれば機能しなかったためです。つまり、レプリカがそれをフェッチする前にマスターがpg_walからWALを削除するほど、レプリカが十分に遅れたことはありません。これが常に当てはまると思われる場合は、achive_mode = offにして、現在のアーカイブを削除してください。使用されていない、および使用できないアーカイブを維持する意味はありません。
レプリケーションスロットの導入以来、pg_archivecleanupは多かれ少なかれ時代遅れです。レプリカが自然に追いつかない場合に備えてバックストップが必要な場合は、共有マウントポイントを作成し、必要に応じてそのマウントポイントでpg_archivecleanupを使用できます。ただし、複製スロットを構成することは、同じことを達成するためのより良い方法です。