Streaming-Replikation in PostgreSQL

7

Ich versuche, zwei PostgreSQL-Server auf einem Computer einzurichten und eine Streaming-Replikation durchzuführen. Ich habe es einmal geschafft, aber wenn ich es erneut versucht habe, genau die gleichen Schritte auszuführen, funktioniert es nicht. Dies sind die Schritte: Ich habe $ PGDATA = home / postgresql / 9.1 / data und $ STANDBY = home / postgresql / 9.1 / data2

  1. Richten Sie zwei Knoten ein:
    initdb -D $ PGDATA
    initdb -D $ STANDBY
  2. Erstellen Sie im Masterknoten einen Benutzer für die Replikation. Ich mache das in pgAdmin (es hat Superuser-Privilegien)
  3. Fügen Sie im Hauptknoten in pg_hba.conf den Teil hinzu, der die Verbindung im Standby-Modus ermöglicht: host replication repuser 127.0.0.1/0 md5
  4. Im Masterknoten in postgresql.conf setzen Sie:

    max_wal_senders = 1
    archive_mode = on
    archive_command = 'cp% p ~ / postgresql / backup / archivedir /% f'
    wal_level = Archiv
    wal_keep_segments = 32

  5. Starten Sie den Masterknoten und führen Sie die Basissicherung durch:

    psql -d dellstore2 -c "SELECT pg_start_backup ('Backup für Replikation', true)"
    rsync -av $ {PGDATA} / $ STANDBY - postmaster.pid ausschließen
    psql -d dellstore2 -c "wähle pg_stop_backup ()"
    
    pg_stop_backup sagt, dass alles in Ordnung ist, alle WAL-Dateien wurden archiviert

  6. Im Standby-Knoten (data2) erstelle ich die Datei recovery.conf mit:

    standby_mode = 'on'
    primary_conninfo = 'host = 127.0.0.1 port = 5432 user = repuser password = haslo'
    trigger_file = '/home/michau/postgresql/replication.trigger'
    restore_command = 'cp / home / michau / postgresql / backup / archivedir /% f "% p"'

  7. Starten Sie den Master-Knoten und dann den Standby-Knoten. Die Replikation sollte starten und der Standby sollte den Master einholen. Genau das ist beim ersten Mal passiert. Wenn ich jetzt den Standby-Modus starte, wird der Fehler "Adresse wird bereits verwendet" angezeigt. Natürlich haben sowohl Standby als auch Master denselben Port, der in postgresql.conf angegeben ist (sie haben genau dieselben postgresql.conf-Dateien). Wenn ich den Port im Standby-Modus auf 5433 ändere, erhalte ich:

    LOG: Das Datenbanksystem wurde bei der Wiederherstellung am 2012-06-12 19:48:01 MESZ heruntergefahren
    LOG: Aufrufen des Standby-Modus
    cp: kann nicht stat / home / michau / postgresql / backup / archivedir / 000000010000000000000007: Keine solche Datei oder kein solches Verzeichnis
    LOG: Konsistenter Wiederherstellungsstatus bei 0/7000070 erreicht
    LOG: Aufzeichnung mit der Länge Null bei 0/7000070
    cp: kann nicht stat / home / michau / postgresql / backup / archivedir / 000000010000000000000007: Keine solche Datei oder kein solches Verzeichnis
    LOG: Streaming-Replikation erfolgreich mit Primär verbunden
    LOG: Das Wiederherstellen beginnt um 0/7000070
    

Und es hängt einfach hier. Ausführen von ps -ef | grep postgresql ergibt:

michau 2491 1898 0 19:46 pts / 0 00:00:00 postgres -D /home/michau/postgresql/9.1/data
michau 2493 2491 0 19:46? 00:00:01 postgres: Schreiberprozess
michau 2494 2491 0 19:46? 00:00:00 postgres: Wal-Writer-Prozess
michau 2495 2491 0 19:46? 00:00:00 postgres: Autovakuum-Starter-Prozess
michau 2496 2491 0 19:46? 00:00:00 postgres: Der letzte Archivierungsprozess war 000000010000000000000008
michau 2497 2491 0 19:46? 00:00:00 postgres: Statistiksammlerprozess
michau 2571 2214 0 19:49 pts / 1 00:00:00 postgres -D /home/michau/postgresql/9.1/data2
michau 2572 2571 0 19:49? 00:00:01 postgres: Startvorgang zur Wiederherstellung von 000000010000000000000009
michau 2575 2571 0 19:49? 00:00:01 postgres: Schreiberprozess
michau 2578 2571 0 19:49? 00:00:02 postgres: wal Empfängerprozess-Streaming 0/99782DC
michau 2579 2491 0 19:49? 00:00:00 postgres: wal sender process repuser 127.0.0.1 (42142) Streaming 0/99782DC
michau 2586 2491 0 19:51? 00:00:00 postgres: michau postgres :: 1 (49941) untätig
michau 2587 2491 0 19:51? 00:00:01 postgres: michau dellstore2 :: 1 (49942) idle
Das wiederherstellende 0000000010000009 wurde für eine Weile geändert, aber für eine halbe Stunde nicht mehr.

Ich bin mir sicher, dass es etwas gibt, das ich beim ersten Mal getan und nicht aufgeschrieben habe oder so, aber ich bin völlig ratlos zu sagen, was es war. Ich würde mich über jede Hilfe freuen.

michauwilliam
quelle
Welche Portnummern verwenden Sie für diese Schlüssel in der postgresql.conf, um Ihre Konfiguration auf dem Slave zu verdeutlichen? 'port' und 'primary_conninfo'? Ersteres sollte 5433 und letzteres 5432 sein.
Mark Stosberg
1
Das habe ich gerade, aber die Replikation funktioniert nicht. Sollten die Ports in Master und Slave nicht gleich sein, damit der Slave im Falle eines Failovers den Master ersetzen kann?
Michauwilliam
2
Was funktioniert also nicht? Laut der psAusgabe scheint die Replikation zu funktionieren.
Daniel Vérité
3
Die Ports können nicht identisch sein, wenn sie auf demselben Computer ausgeführt werden. Ein Failover wird normalerweise mit mehr als einer physischen Maschine durchgeführt, da es mit einer einzelnen Maschine sinnlos ist.
Eelke

Antworten:

7

PostgreSQL-Replikate werden nie vollständig wiederhergestellt. Dies ist beabsichtigt. Grundsätzlich befindet sich ein Replikat immer im Modus "Wiederherstellung nach einer Katastrophe", außer dass es den Empfang der WAL-Segmente vom Master und nicht von der Festplatte verwendet.

Was Sie also sehen, gibt keinen Anlass zur Sorge. Wenn es noch nicht funktioniert, müssen Sie eine detailliertere Beschreibung dessen geben, was Sie versuchen und was nicht. Aber soweit Sie posten, scheint es normal zu sein.

Chris Travers
quelle
0

Die obigen Schritte gelten nicht für eine Streaming-Replikation, sondern für ein WAL-Archivierungsreplikations-Setup. Wenn Sie die Streaming-Replikation einrichten möchten, lesen Sie diese Anleitung zum Einrichten der Streaming-Replikation .

Grayhemp
quelle
0

Starten Sie PostgreSQL im Standby-Modus mit dem Befehl postgresql? Wenn ja, sollten Sie den Befehl pg_ctl verwenden, da er den DB-Serverprozess vom Terminal trennt. Mit dem Befehl postgresql wird nur die Protokollausgabe wie beschrieben auf dem Bildschirm angezeigt und bleibt dort, da es sich um einen Standby-Server handelt.

Clyde D'Cruz
quelle