PostgreSQL: posso fare pg_start_backup () su un live, eseguendo db sotto carico?


19

La replica stabilita si è interrotta ("il segmento WAL richiesto è già stato rimosso" durante i tempi di inattività) Non è possibile arrestare facilmente nuovamente il master.

Possiamo fare

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ da padrone a schiavo,
  3. pg_stop_backup()

... mentre il master postgresql è ancora a pieno carico? (O pg_start_backup()porterà a

  • serrature da tavolo,
  • Blocchi I / O,
  • incongruenze,
  • allarme antincendio,
  • risposta db lenta

In altre parole, pg_start_backup()influenzerà la nostra applicazione?


Hai controllato i documenti ? Dice "Per impostazione predefinita, pg_start_backup può impiegare molto tempo per terminare. Questo perché esegue un checkpoint e l'I / O richiesto per il checkpoint verrà distribuito su un periodo di tempo significativo, per impostazione predefinita metà del tuo punto di controllo inter-checkpoint intervallo (vedere il parametro di configurazione checkpoint_completion_target). Di solito è ciò che si desidera, poiché riduce al minimo l'impatto sull'elaborazione della query. " Cosa significhi in pratica (e nel tuo caso) non è del tutto chiaro, tuttavia.
dezso,

Risposte:


11

pg_start_backupeseguirà un checkpoint, come nota dezso. Ciò ha un impatto, ma il database esegue comunque controlli abbastanza regolarmente e deve farlo per funzionare, quindi chiaramente non sono un problema per te. Un checkpoint precoce significa che sono stati accumulati meno dati, il che significa che se un checkpoint pg_start_backupavrà un impatto minore del normale.

Dove devi preoccuparti è il pg_basebackuppasso rsync o equivalente . L'I / O di lettura da questo non sarà troppo male poiché è sequenziale, ma probabilmente danneggerà ancora significativamente le prestazioni di I / O del database e tenderà anche a spingere i dati caldi dalla cache RAM a favore di meno dati utilizzati, causando il blocco della cache quando i dati più necessari vengono quindi riletti.

È possibile utilizzare nicee ioniceper aiutare a limitare l'impatto dell'I / O (ma non l'impatto della cache); tuttavia, c'è un costo per quello. Il backup richiederà più tempo e fino a quando non completi il ​​backup ed esegui il pg_stop_backuptuo sistema non è in grado, a quanto ho capito, di accumulare WAL, accumulare debito del checkpoint per un GRANDE checkpoint alla fine dell'esecuzione del backup e sta accumulando tabella e indice gonfiare perché non può ripulire le file morte. Quindi davvero non puoi permetterti di avere il backup che durerà per sempre, specialmente se hai tabelle churn molto alte.

Alla fine, è difficile dire se è possibile utilizzare in modo sicuro pg_start_backupe pg_stop_backupper backup a caldo nel proprio ambiente. La maggior parte delle persone può, ma se sei vicino al limite di ciò che il tuo hardware può fare, ha requisiti di temporizzazione rigidi, non può permettersi il rischio di uno stallo e avere tavoli di abbandono molto alti e tavoli molto grandi, potrebbe essere problematico .

Sfortunatamente, devi praticamente provarlo e vedere.

Se è possibile, potrebbe valere la pena rilasciare CHECKPOINTun'istantanea atomica del volume su cui si trova il database invece di utilizzare LVM, gli strumenti della SAN, EBS o qualsiasi altra cosa ci si trovi. Se puoi farlo, puoi copiare l'istantanea a tuo piacimento. Questo approccio non è adatto per l'esecuzione di un backup di base per PITR / warm standby / hot standby, ma è perfettamente buono per una copia di backup statica e ha un impatto molto inferiore sul sistema. Puoi farlo solo se le tue istantanee sono atomiche e il tuo intero database, incluso WAL, è su un solo volume.

Una possibilità che non ho ancora studiato è quella di combinare i due approcci. Mi viene in mente che uno potrebbe ( non testato e forse sbagliato e non sicuro , non lo so ancora):

  • pg_start_backup
  • Attiva le istantanee di tutti i tablespace, il datadir principale e il volume xlog
  • pg_stop_backup
  • Copia WAL fino all'archivio finale da pg_stop_backup
  • Copia i dati dai volumi snapshot

In sostanza, l'idea è di ridurre il tempo necessario al DB per ritardare i suoi punti di controllo prendendo un punto nel tempo di ciascun volume che è possibile copiare a piacere.


Dopo aver capito che pg_start_backup () è principalmente "una cosa di checkpoint controllato", ci siamo guadagnati la sicurezza di provare semplicemente a vedere. Sembra che l'impatto sull'applicazione in esecuzione sia stato trascurabile. (master datadir principale su SSD) :-) L'idea "non testata e forse non sicura" che hai proposto è un po 'al di sopra del nostro livello di competenza e brama di avventura.
Daniel,

Oh, e non abbiamo ionizzato la rsync al primo tentativo. Perché in realtà volevamo vedere il carico aggiuntivo sul master. Dato che non abbiamo mai avuto bisogno di una seconda corsa rsync, va tutto bene. Abbiamo imparato qualcosa da quello.
Daniel,

7

Questo è un grave scavo ma devo correggere qualcosa qui.

La risposta precedente afferma:

Puoi usare nice e ionice per aiutare a limitare l'impatto dell'I / O (ma non l'impatto della cache); tuttavia, c'è un costo per quello. Il backup richiederà più tempo e fino a quando non completi il ​​backup ed esegui pg_stop_backup il tuo sistema sta accumulando - a quanto ho capito - WAL non può eliminare, accumulando debito del checkpoint per un GRANDE checkpoint alla fine dell'esecuzione del backup, e sta accumulando tabella e indice gonfio perché non è in grado di ripulire le righe morte. Quindi davvero non puoi permetterti di avere il backup che durerà per sempre, specialmente se hai tabelle di churn molto alte.

Non è vero. Il sistema manterrà il numero di WAL indicato nella configurazione ( consultare la documentazione online ). Quindi, sostanzialmente, il valore più alto tra:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Immaginiamo questo caso:

  • il backup sta impiegando molto tempo, poiché ci sono centinaia di concerti da copiare
  • hai una piccola conservazione WAL (checkpoint_segments a 3, ad esempio)
  • non hai configurato l'archiviazione WAL

quindi dopo aver avviato "pg_start_backup ()", i file WAL ruoteranno durante il backup. Al termine del backup, proverai a ripristinarlo su un altro motore di database. Il motore all'avvio richiederà almeno il file WAL generato quando è stato emesso "pg_start_backup ()".

pg_start_backup 
-----------------
B/D0020F18
(1 row)

Il database non accetterà l'avvio fino a quando non viene fornito il file WAL "0000000x0000000B000000D0" (dove x è il TimelineID ). Questo file WAL è il minimo indispensabile per l'avvio del sistema. Naturalmente, con solo questo file, perderai i dati, poiché il resto dei dati si trova nei file WAL che non hai, ma almeno avrai un motore di database funzionante.

Quindi o devi fare l'archiviazione WAL, oppure devi salvare i file WAL necessari da solo, ma Postgresql non lo farà per te.


3
Ottima osservazione. Questo può essere evitato pg_basebackup --xlog-method=streamanche se non sbaglio.
tomorrow__

2
Sì, da PG 9.2, è possibile eseguire lo streaming di WAL con il backup di base. Si aprirà un secondo flusso, quindi è necessario avere un max_wal_sendersminimo impostato su 2. Questo è un buon modo per evitare il problema "WAL mancante" alla fine del backup.
sterfield,

4

Per quanto riguarda la mia esperienza con PostgreSQL, l'operazione è relativamente sicura a meno che non si abbia un impatto molto significativo sulle prestazioni in quel momento. Se ce l'hai, allora è meglio mettere temporaneamente in pausa la scrittura di tutti i tuoi clienti.

Ho avuto solo un caso critico durante la sincronizzazione del mio master con lo slave sotto carico ed è stato causato dal killer OOM (sì, dovresti davvero disabilitare COMPLETAMENTE OOM Killer sui nodi del database, non lo sapevo quel giorno).

Quindi ho ripristinato il database dal backup notturno e ho dato a Postgres tutti i segmenti WAL dalla directory pg_archive per la riproduzione (li ho copiati nella cartella pg_xlog). Tutto è andato bene, ma i tempi di inattività erano inevitabili, ovviamente.

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.