Streaming PostgreSQL rispetto alla replica basata su file (in termini di comportamento e configurazione del server)


8

Sto cercando di comprendere i migliori usi della replica PostgreSQL e come funziona in modo da poter risolvere i problemi in un ambiente di produzione.

Sto facendo fatica a capire le differenze tra questi 2 tipi di replica in termini di (1) Configurazione (2) Come si comportano i 2 server Master / Slave in ogni scenario

La replica su PostgreSQL (9.2+) consiste essenzialmente in file XLOG di dimensioni 16 MB (a seconda delle impostazioni di frequenza per la creazione di ciascun file) che vengono creati su Master e inviati con un metodo allo Slave.

La mia configurazione (ai fini di questa domanda)

Configurazione di Postgresql.conf sul master
archive_command = 'rsync -av% p postgres @ [SlaveIP]: [wal_archive_folder] /% f'

Configurazione di Recovery.conf su slave per leggere i file di registro
restore_command = 'cp [wal_archive_folder] /% f \ "% p \"'
primary_conninfo = 'host = [MasterIP] port = 5432 user = postgres'

La mia domanda è quale parte di questa configurazione rende questa replica "streaming" rispetto a "log shipping"? Il mio master è configurato per utilizzare rsync per inviare i log allo slave (questo log viene spedito?) Il mio slave è configurato per essere in grado di connettersi al master in recovery.conf (è questo streaming?)

Seconda parte della domanda: cosa sta succedendo? Capisco che esiste un altro protocollo su PostgreSQL tramite WAL_sender e WAL_receiver. Ma non sono chiaro se questo viene utilizzato solo per lo streaming e, in tal caso, come viene utilizzato rsync nel Master?

:) Grazie!! E scusa se questa è una domanda ovvia. Ho fatto un sacco di leggere blog / libri ma ho avuto difficoltà a capire. La wiki di Postgres è così approfondita che ci vuole molto tempo per superare tutto (e ho delle scadenze)


Il wiki tende ad essere piuttosto obsoleto, oltre che approfondito. Spesso è pieno di documenti orientati allo sviluppo e alla progettazione delle funzionalità. Il manuale utente principale è di solito una risorsa migliore per cose come questa.
Craig Ringer,

Risposte:


17

"Replica in streaming" si riferisce all'invio continuo di record WAL su una connessione TCP / IP tra il master e la replica, utilizzando il protocollo walsender su replicationconnessioni. Il master legge il proprio WAL pg_xloge lo invia alla replica su richiesta. È configurato con una primary_conninfodirettiva in recovery.confe pg_hba.confvoci sul master per consentire le replicationconnessioni. È inoltre necessario wal_keep_segmentse alcune altre opzioni coperte nei documenti.

"Log shipping" si riferisce all'invio periodico di record WAL come interi archivi WAL tramite un protocollo di trasferimento file in una posizione di archivio da cui la replica può quindi recuperarli. È configurato con una restore_commanddirettiva in recovery.confe un archive_commandnel master. A PostgreSQL non importa dove sono i file o come vengono trasferiti, solo che archive_commandli mette lì e restore_commandrecupera l'archivio richiesto; ciò consente la costruzione di sistemi come PgBarman e WAL-E.

La replica in streaming non ha lo stesso ritardo, poiché i record vengono inviati e generati. Tuttavia, richiede che sia il master sia la replica siano online e siano in grado di comunicare direttamente. Richiede inoltre che la replica mantenga abbastanza bene che il master abbia ancora copie su disco del WAL di cui ha bisogno la replica e generalmente richiede di dedicare pg_xlogspazio extra per conservare il WAL aggiuntivo per la replica.

La replica della distribuzione dei log presenta un ritardo maggiore poiché la replica vede WAL solo quando viene inviato un intero archivio. Tuttavia, può funzionare anche quando il master e la replica non possono comunicare direttamente su TCP / IP utilizzando un percorso di archiviazione condiviso. Continua a funzionare anche se la replica è inattiva da un po ', perché il master avrà scartato il WAL pg_xlogsolo dopo averlo archiviato, quindi il WAL è ancora nell'archivio e utilizzabile dalla replica anche se il master non può inviarlo in streaming più. Si noti che archive_commandnon si arrende mai, quindi pg_xlogpuò riempire se l'archiviazione non riesce; per questo motivo è meglio archiviare in una posizione affidabile e quindi recuperare il server di replica da quella posizione.

In generale, in realtà si combinano i due, cioè si usano entrambi. In tal caso, la replica in streaming viene utilizzata quando tutto va bene. Se la replica è troppo indietro e il master ha scartato gli xlog richiesti, si presenta un problema di connettività, ecc., La replica passa alla lettura dell'archivio WAL fino a quando non viene raggiunta. Riprova periodicamente a tornare allo streaming fino a quando non riesce.

Se hai intenzione di usarne solo uno, usa la distribuzione dei log, perché la replica in streaming senza fallback della spedizione dei log è (fino a PostgreSQL 9.4) potenzialmente soggetta a ritardo di replica causando errori che impongono la ricostruzione di una replica.


PostgreSQL 9.4 cambia un po 'questo, perché la replica in streaming ora può usare "slot di replica". Ciò consente al master di tenere traccia di quanto WAL ha bisogno di una replica ed evitare di buttarlo via fino a quando la replica non l'ha riprodotta. Quindi non è più necessario wal_keep_segmentsse si utilizza uno slot di replica (non quello predefinito).

Vedi il mio articolo slot di replica streaming in PostgreSQL 9.4 .

9.4 introduce anche le basi per lo streaming della replica logica , che è ancora un altro meccanismo, progettato per l'uso da parte di sistemi di replica logica come Londiste, Slony-I e la nuova funzionalità di replica multi-master asincrona bidirezionale .


Molto utile, mi chiedo se pensi che questo articolo: blogs.amd.co.at/robe/2009/05/… sia in tema con la mia domanda. Mi è stato detto "il log shipping è più stabile" e questo articolo sembra condividere questa opinione.
Dina,

1
@Dina Almeno è obsoleto, ad es. La spedizione dei log presenta l'inconveniente che i server slave non possono essere utilizzati per le query, purché si stiano replicando i dati ora non sono corretti . Possono eseguire query di sola lettura se in hot_standbymodalità. Inoltre, lo streaming e il log shipping utilizzano entrambi WAL, sono solo modi diversi per trasferirlo. È possibile e utilizzare la distribuzione dei log per integrare la replica di streaming. Nel complesso, l'articolo è OK ma non particolarmente illuminante e un po 'obsoleto; i documenti ufficiali sono una risorsa migliore.
Craig Ringer,

la risposta è molto utile Chris, quindi il tuo articolo ( blog.2ndquadrant.com/postgresql-9-4-slots )
Max L.

@Dina se una volta si è imposta con il flusso continuo di replica (che è asincrono per impostazione predefinita) che si desidera configurare l'impostazione di replica sincrona, è possibile farlo impostando il synchronous_standby_namesparametro su un valore non vuoto, ad esempio: standby_1. Lo fai sul primaryserver. Poi, sul standbyserver, modificare l' primary_conninfoimpostazione aggiungendo application_name=standby_1ad esempio: primary_conninfo = 'host=x port=y user=z application_name=standby_1'. Questo è tratto da postgresql.org/docs/9.6/static/warm-standby.html , sezione 26.2.8.
dw8547,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.