Esta mañana estuve involucrado en la actualización de una base de datos PostgreSQL en AWS RDS. Queríamos pasar de la versión 9.3.3 a la versión 9.4.4. Habíamos "probado" la actualización en una base de datos provisional, pero la base de datos provisional es mucho más pequeña y no utiliza Multi-AZ. Resultó que esta prueba era bastante inadecuada.
Nuestra base de datos de producción utiliza Multi-AZ. Hemos realizado actualizaciones menores de versiones en el pasado, y en esos casos RDS actualizará primero el modo de espera y luego lo promocionará a maestro. Por lo tanto, el único tiempo de inactividad incurrido es de ~ 60 s durante la conmutación por error.
Asumimos que sucedería lo mismo para la actualización de la versión principal, pero qué equivocados estábamos.
Algunos detalles sobre nuestra configuración:
- db.m3.large
- IOPS aprovisionados (SSD)
- 300 GB de almacenamiento, de los cuales se usan 139 GB
- Tuvimos excelentes actualizaciones del sistema operativo RDS, queríamos combinar con esta actualización para minimizar el tiempo de inactividad
Estos son los eventos RDS registrados mientras realizamos la actualización:
La CPU de la base de datos se maximizó entre las 08:44 y las 10:27. Gran parte de este tiempo parecía estar ocupado por RDS tomando una instantánea previa y posterior a la actualización.
Los documentos de AWS no advierten sobre tales repercusiones, aunque al leerlos queda claro que una falla obvia en nuestro enfoque es que no creamos una copia de la base de datos de producción en la configuración Multi-AZ e intentamos actualizarla como una prueba
En general, fue muy frustrante porque RDS nos dio muy poca información sobre lo que estaba haciendo y cuánto tiempo podría tomar. (Nuevamente, hacer una ejecución de prueba hubiera ayudado ...)
Aparte de eso, queremos aprender de este incidente, así que aquí están nuestras preguntas:
- ¿Es normal este tipo de cosas cuando se realiza una actualización de versión principal en RDS?
- Si quisiéramos hacer una actualización importante de la versión en el futuro con un tiempo de inactividad mínimo, ¿cómo lo haríamos? ¿Hay algún tipo de forma inteligente de usar la replicación para que sea más fluida?
ANALYZE
para actualizar las estadísticas lo resolvió. Si alguien tiene alguna idea sobre esto, también sería genial.