Ho intenzione di aggiungere alcune informazioni aggiornate e riferimenti all'eccellente risposta di @ max-malysh sopra.
In breve, se si fa qualcosa sul master, è necessario replicarlo sullo slave. Per questo Postgres utilizza i record WAL, che vengono inviati allo slave dopo ogni azione registrata sul master. Lo slave esegue quindi l'azione e i due sono di nuovo sincronizzati. In uno dei numerosi scenari, puoi essere in conflitto sullo schiavo con ciò che arriva dal master in un'azione WAL. Nella maggior parte di essi, c'è una transazione in corso sullo slave che è in conflitto con ciò che l'azione WAL vuole cambiare. In tal caso, hai due opzioni:
- Ritarda l'applicazione dell'azione WAL per un po ', consentendo allo slave di completare la transazione in conflitto, quindi applica l'azione.
- Annulla la query in conflitto sullo slave.
Ci occupiamo del n. 1 e di due valori:
max_standby_archive_delay
- questo è il ritardo utilizzato dopo una lunga disconnessione tra master e slave, quando i dati vengono letti da un archivio WAL, che non sono dati correnti.
max_standby_streaming_delay
- ritardo utilizzato per annullare le query alla ricezione di voci WAL tramite la replica in streaming.
In genere, se il server è destinato alla replica ad alta disponibilità, si desidera mantenere questi numeri brevi. L'impostazione predefinita di 30000
(millisecondi se nessuna unità fornita) è sufficiente per questo. Se, tuttavia, desideri impostare qualcosa come un archivio, una replica di report o una replica di lettura che potrebbe avere query di lunga durata, ti consigliamo di impostarlo su un valore superiore per evitare query annullate. L' 900s
impostazione consigliata sopra sembra un buon punto di partenza. Non sono d'accordo con i documenti ufficiali sull'impostazione di un valore infinito -1
come una buona idea, che potrebbe mascherare un codice errato e causare molti problemi.
L'unico avvertimento sulle query a esecuzione prolungata e l'impostazione di questi valori su un valore più alto è che le altre query in esecuzione sullo slave in parallelo a quella a esecuzione prolungata che causa il ritardo dell'azione WAL vedranno i vecchi dati fino al completamento della query lunga. Gli sviluppatori dovranno comprendere questo e serializzare le query che non devono essere eseguite contemporaneamente.
Per la piena spiegazione di come max_standby_archive_delay
e di max_standby_streaming_delay
lavoro e per questo, andare qui .