Questa mattina sono stato coinvolto nell'aggiornamento di un database PostgreSQL su AWS RDS. Volevamo passare dalla versione 9.3.3 alla versione 9.4.4. Avevamo "testato" l'aggiornamento su un database di gestione temporanea, ma il database di gestione temporanea è molto più piccolo e non utilizza Multi-AZ. Si è scoperto che questo test era abbastanza inadeguato.
Il nostro database di produzione utilizza Multi-AZ. Abbiamo effettuato aggiornamenti di versione minori in passato e in questi casi RDS aggiornerà prima lo standby e poi lo promuoverà al master. Pertanto, l'unico tempo di inattività sostenuto è ~ 60s durante il failover.
Presumemmo che lo stesso sarebbe accaduto per l'aggiornamento della versione principale, ma oh quanto ci sbagliavamo.
Alcuni dettagli sulla nostra configurazione:
- db.m3.large
- Provisioning IOPS (SSD)
- 300 GB di memoria, di cui 139 GB utilizzati
- Avevamo aggiornamenti del sistema operativo RDS in sospeso, volevamo eseguire il batch con questo aggiornamento per ridurre al minimo i tempi di fermo
Ecco gli eventi RDS registrati durante l'esecuzione dell'aggiornamento:
La CPU del database è stata al massimo tra le 08:44 e le 10:27. Molto di questo tempo sembrava essere occupato da RDS che realizzava uno snapshot pre-aggiornamento e post-aggiornamento.
I documenti AWS non avvertono di tali ripercussioni, anche se dalla loro lettura è chiaro che un difetto evidente nel nostro approccio è che non abbiamo creato una copia del database di produzione nell'impostazione Multi-AZ e abbiamo cercato di aggiornarlo come una corsa di prova
In generale è stato molto frustrante perché RDS ci ha fornito pochissime informazioni su ciò che stava facendo e quanto tempo ci sarebbe voluto. (Ancora una volta, fare una corsa di prova avrebbe aiutato ...)
A parte questo, vogliamo imparare da questo incidente, quindi ecco le nostre domande:
- Questo genere di cose è normale quando si esegue un aggiornamento della versione principale su RDS?
- Se in futuro volessimo effettuare un aggiornamento della versione principale con tempi di inattività minimi, come potremmo procedere? Esiste un modo intelligente di usare la replica per renderla più fluida?
ANALYZE
per aggiornare le statistiche lo ha risolto. Se qualcuno avesse qualche idea su questo sarebbe fantastico.