web-dev-qa-db-ja.com

Postgresが要求したWALセグメントはすでに削除されています(ただし、実際にはスレーブのディレクトリにあります)。

レプリケーションツールとしてrepmgrを使用しています。スレーブでエラーが発生し続けます。

要求されたWALセグメントはすでに削除されています

私がマスターを確認すると、実際にはありません。ただし、pg_xlogspg_xlogs/archive_statusの両方のスレーブのディレクトリにあります。それがすでにスレーブにある場合、なぜこのファイルを探すのか理解できませんか?

実際には、要求されたものをxlogs超えています。 PostgresスレーブリセットのWALファイルをどうするか の解決策は、少し異なる問題に対するものです。これらは、スレーブが受信する前にマスターがログファイルを削除するシナリオのようです。私の場合、それは要求された後のシーケンスのスレーブといくつかの他のファイルに非常に多く存在します。

これは、walセグメントを保持するオプションを大きくする必要がないことも示しています。

2
sqwale

私はギャンブルを取り、欠落していたマスターに1つのファイルをコピーして戻しました。それは働いた私はまだ問題の原因がわからない。

1
sqwale

PostgreSQLドキュメントのストリーミングレプリケーションから:

ファイルベースの継続的アーカイブなしでストリーミングレプリケーションを使用する場合、スタンバイが受信する前にサーバーが古いWALセグメントをリサイクルする可能性があります。これが発生した場合、スタンバイは新しいベースバックアップから再初期化する必要があります。これを回避するには、wal_keep_segmentsをWALセグメントが早くリサイクルされないようにするのに十分な大きさの値に設定するか、スタンバイ用の複製スロットを構成します。スタンバイからアクセス可能なWALアーカイブをセットアップする場合、スタンバイが十分なセグメントを保持している場合、スタンバイは常にアーカイブを使用して追いつくことができるため、これらのソリューションは必要ありません。

この問題を解決するには、プライマリサーバーからデータを再初期化する必要があります。スレーブのデータディレクトリを削除します。

root@replica:~# su postgres
postgres@replica:~# mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main_old

プライマリサーバーからすべてのデータをコピーします。

Sudo -u postgres pg_basebackup -h [PRIMARY_IP] -D /var/lib/postgresql/12/main -U replication -P -v

バージョンが12の場合、standby.signalファイルを作成します。それ以外の場合は、replica.confを構成します。

touch /var/lib/postgresql/12/main/standby.signal

スレーブ構成:

listen_addresses = 'localhost,[IP_ADDRESS_OF_REPLIACA_ON_LAN]'              # what IP address(es) to listen on; 
max_connections = 100 # Ensure that this value is the same as the primary's
wal_level = 'replica'
archive_mode = on
archive_command = 'cd .'
primary_conninfo = 'Host=[PRIMARY_IP] port=5432 user=replication password=[REPLICATION PASSWORD]'
hot_standby = on

max_wal_senders = 48

Pg_basebackupにはどのくらい時間がかかりますか?セグメントは約5分ごとに生成されるため、バックアップに1時間かかる場合は、少なくとも12個のセグメントを保存する必要があります。 2時間で、24などが必要になります。バックアップの1時間あたり約12.2セグメントに値を設定します。

https://www.gab.lc/articles/postgresql-12-replication/

0