Upgrade de Postgresql
Upgrade de Postgresql
original:
Índice
Intro
Caso de ejemplo: del 10 al 11
Base de datos a upgradear: postgresql-elliptical-29911
El upgrade de postgres, en este caso debe hacerse con el comando pg:upgrade
, el cual se usa solamente para hacer un upgrade de una “follower database”. Debido a que la que vamos a actualizar es una base de datos tipo leader
y primary
, se debe considerar hacer varios pasos antes de hacer el upgrade.
💡 OJO esto es solo para bds que no son del tipo hobbie-tier y que pesan más de 10gb!
Pasos a seguir
Según https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrading-with-pg-upgrade
1. Proveer una follower database
Para empezar, hay que crear un nuevo follower para la base de datos, y esperar a que se “ponga al día” con al leader.
La follower es considerada “caught up” cuando está dentro de los 200 commits o condirmaciones de la bbdd principal. Se puede veridicar cuántos commits tiene la follower usando el comando pg:info
2. Entrar en un modo mantención para prevenir las escrituras en la base de datos.
💡 El modo de mantenimiento no "scale down" automáticamente los dynos. Los dynos web y no web deben "scale down" (por ejemplo, heroku ps:scale worker=0) para garantizar que ninguna conexión esté escribiendo datos en la base de datos.
Es importante que ninguna data nueva sea escrita en la primary database (postgresql-elliptical-29911) durante el proceso de upgrade, porque sino, esta no va a ser transferida a la nueva base de datos. Para lograr esto, hay que poner la bbdd en modo mantención. Si hay scheduler jobs ejecudandose, también se deben deshabilitar.
Si tienes dynos asociados corriendo (web y no web)
3. Actualizar las base de datos tipo follower
Ahora se puede actualizar la base de datos secundaria. Hay que esperar a que la follower database se ponga al día por completo con la principal, en la que debería decir que esta “behind by: 0 commits”.
Si no se espera a que quede “caughted up” el upgrade te va a tirar el siguiente error (probablemente)
▸ database must not be too far behind leader, please wait until your follower catches up with its leader.
Una vez que esté en el estado “caught up” se puede hacer el upgrade. Lo ideal es que, como estamos en la versión 10, la actualicemos a la 11.
Entonces, el comando sería más o menos así:
heroku pg:upgrade ``HEROKU_POSTGRESQL_XX`` ``--version 11`` --app pl-rutt-production
Este paso aproximadamente durará como 20 min en completarse. De hecho, sale que es aprox 3 min por gb, así que podrían ser en verdad 19,4 GB * 3 min/GB ≈ 60 minutos 🙀
De todas maneras, se puede ver el progreso del upgrade con el comando
heroku pg:wait --app pl-rutt-production
4. Promote to Primary 🎉
Ahora se debe “promote” la bbdd recién actualizada para configurarla como la bbdd principal (DATABASE_URL
). Para ello, se debe hacer un pg:promote
, que también crea un archivo adjunto alternativo para la antigua base de datos princial, asignado con una nueva variable de configuración HEROKU_POSTGRESQL_<color>_URL
. El proceso de promotion activa un lanzamiento y reinicia la app.
heroku pg:promote HEROKU_POSTGRESQL_XX --app pl-rutt-production
ahora la base de datos follower es la principal, aunque aún no recibe nuevas solicitudes.
Si la bbdd principal original se adjuntó a varias apps, se debe adjuntar la nueva bbdd de esas aplicaciones con la extensión heroku addons:attach ...
.
💡 **IMPORTANTE!!! **Después del promotion los followers de la bbdd principal original NO comienzan a seguir de manera automática la nueva bbdd principal. Por lo que se debe crear nuevos followers para la nueva bbdd principal, según sea necesario:
5. Salir del modo mantención
Para reanudar el funcionamiento normal de la app, se debe volver a escalar los non-web dynos a sus niveles originales. (e.g., heroku ps:scale worker=1
).
Si tienes dynos asociados que deben correr (web y no web)
Si la primaria que estás actualizando tenía followers
Finalmente, se apaga el maintenance mode, con el siguiente comando:
Ahora la app puede recibir requests a la bbdd actualizada. Se puede confirmar esto ejecutando el comando heroku pg:info --app pl-rutt-production
. La bbdd denotada por DATABASE_URL
es la considerada como primaria.
Finalmente, debes sacar las bases de datos deprecadas:
Resumen
Pasos a seguir:
heroku maintenance:on --app pl-rutt-production
con este comando vas a hacer que la app pase a estado de mantención, por lo que no se podrá escribir en la BD primaria
heroku pg:info --app pl-rutt-production
este comando te ayuda a ver si la base de datos que creaste está a la par con la primaria. ¿Cómo saberlo? debería decir esto debajo del nombre de la bd creada:
heroku pg:upgrade HEROKU_POSTGRESQL_COPPER_URL --version 11 --app pl-rutt-production
Este comando se debe ejecutar una vez que la bd creada está a la par con la primaria. Con este haces el upgrade. En mi caso se demoró unos 20 mins
heroku pg:wait --app pl-rutt-production
este comando te ayudará a ver el progreso del update
heroku pg:promote HEROKU_POSTGRESQL_COPPER_URL --app pl-rutt-production
este comando hace que ahora la bd primaria es la creada y actualizada.
[ANTES DE APAGAR EL MODO MANTENCIÓN] si tienes dynos:
heroku ps:scale web=2 worker=1 --app pl-rutt-production
Con este comando volví a la escala que tenía antes.
**Si tienes en un principio la primaria tenía una bd follower **
heroku addons:create heroku-postgresql:standard-0 --follow DATABASE_URL -a pl-rutt-production
tienes que crear una follower nueva. CREO que no es necesario esperar a que se copie entera para apagar la mantención, pero quizá mejor esperar (por si las 🪰🪰)
heroku maintenance:off --app pl-rutt-production
Y ahí vuelve todo a la normalidad
heroku addons:destroy HEROKU_POSTGRESQL_WHITE --app pl-rutt-production
OJO: hay que sacar dps las bases de datos que sobren, es decir, las antiguas. En mi caso, la primaria ERA HEROKU_POSTGRESQL_WHITE así que tengo que eliminar esta.
LISTOOOO!! 🎉🎉
Última actualización