Wir haben eine Master-Slave-Replikationskonfiguration wie folgt.Wie behebe ich einen PostgreSQL 9.3-Slave, der nicht mit dem Master mithalten kann?
Auf dem Master:
postgresql.conf
hat Replikation wie folgt konfiguriert (Kommentarzeile der Kürze halber entnommen):
max_wal_senders = 1
wal_keep_segments = 8
Am Nehmer:
Same postgresql.conf
wie auf dem Master. recovery.conf
sieht wie folgt aus:
standby_mode = 'on'
primary_conninfo = 'host=master1 port=5432 user=replication password=replication'
trigger_file = '/tmp/postgresql.trigger.5432'
Wenn diese zunächst Setup war, haben wir ein paar einfache Tests durchgeführt und bestätigt die Replikation arbeitete. Wenn wir jedoch die anfängliche Datenladung durchgeführt haben, gelangten nur einige der Daten zum Slave.
Sklaves log jetzt mit Nachrichten, die wie folgt aussehen gefüllt ist:
< 2015-01-23 23:59:47.241 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:47.241 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:52.259 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:52.260 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
< 2015-01-23 23:59:57.270 EST >LOG: started streaming WAL from primary at F/52000000 on timeline 1
< 2015-01-23 23:59:57.270 EST >FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000000F00000052 has already been removed
Nach einiger Analyse und helfen auf dem #postgresql IRC-Kanal, habe ich zu dem Schluss gekommen, dass der Slave nicht mit dem mithalten kann Meister. Meine vorgeschlagene Lösung ist wie folgt.
Auf dem Master:
- Set
max_wal_senders=5
wal_keep_segments=4000
Set. Ja, ich weiß, es ist sehr hoch, aber ich würde gerne die Situation beobachten und sehen, was passiert. Ich habe Platz auf dem Meister.
Auf dem Slave:
- Speicher von Konfigurationsdateien im Datenverzeichnis (das heißt
pg_hba.conf pg_ident.conf postgresql.conf recovery.conf
) - löscht aus dem Datenverzeichnis (
rm -rf /var/lib/pgsql/9.3/data/*
). Dies scheint vonpg_basebackup
erforderlich zu sein. - den folgenden Befehl ausführen:
pg_basebackup -h master -D /var/lib/pgsql/9.3/data --username=replication --password
ich etwas fehle? Gibt es einen besseren Weg, den Slave auf den neuesten Stand zu bringen, ohne alle Daten neu laden zu müssen?
Jede Hilfe wird sehr geschätzt.
Sie haben wirklich Ihre eigene Frage beantwortet - setzen Sie wal_keep_segment hoch genug, um dem Slave zu erlauben, nach einer Reihe von Wal-Updates aufzuholen. –
Wie ist es, den Slave neu zu erstellen - ist mein vorgeschlagenes Verfahren gültig? –