Upgrade des PostgreSQL-Dogus
Bei der Weiterentwicklung des PostgreSQL-Dogus muss sichergestellt werden, dass bestehende Instanzen auf neue Versionen aktualisiert werden können.
Der Upgrade-Pfad besteht aus dem Skript pre-upgrade.sh vor dem Image-Wechsel und post-upgrade.sh nach dem Image-Wechsel.
Allgemeiner Ablauf
Beim Dogu-Upgrade wird zuerst im alten Container pre-upgrade.sh ausgeführt.
Danach wird das neue Image gestartet und post-upgrade.sh ausgeführt.
Gleichzeitig startet startup.sh den offiziellen PostgreSQL-Entrypoint.
Pre-Upgrade (resources/pre-upgrade.sh)
pre-upgrade.sh entscheidet, ob ein Full-Backup erforderlich ist.
Ein Backup wird unter anderem bei Major-Upgrades oder bei Layout-Migrationen erzeugt.
Wichtige Punkte:
- Full-Backup mit
pg_dumpallwird unter/var/lib/postgresql/backupabgelegt. - Der Backup-Pfad wird in der Config unter
migration_backup_pathgespeichert. local_state=upgradingwird gesetzt, damitstartup.shauf ein laufendes Upgrade warten kann.
Post-Upgrade (resources/post-upgrade.sh)
post-upgrade.sh unterscheidet zwischen Restore-Fall und regulären Migrationen.
Restore-Fall:
- Wenn
migration_backup_pathgesetzt ist, wird das Zielverzeichnis für einen Restore vorbereitet. - Danach beendet sich
post-upgrade.sh. - Der eigentliche Restore läuft beim nächsten regulären Start über
01-restore.sh.
Regulärer Migrationsfall:
- Wenn kein Restore nötig ist und eine DB bereits initialisiert ist, startet
post-upgrade.shPostgreSQL temporär. - Danach werden Migrationsskripte aus
/docker-entrypoint-initdb.d(ausresources/migrations) manuell ausgeführt. - PostgreSQL wird wieder gestoppt und
local_stateentfernt.
Startup (resources/startup.sh)
startup.sh wartet, solange local_state=upgrading gesetzt ist.
Danach startet es /usr/local/bin/docker-entrypoint.sh mit den Dogu-spezifischen Parametern.
Wichtig:
Der offizielle Entrypoint führt Skripte in /docker-entrypoint-initdb.d automatisch nur bei einer frischen Initialisierung aus.
Deshalb gibt es im bestehenden Datenbestand den manuellen Aufruf der Skripte in post-upgrade.sh.
Wo kommen neue Migrationsskripte hin?
Neue Migrationsskripte kommen nach resources/migrations/ und werden im Dockerfile nach /docker-entrypoint-initdb.d/ kopiert.
Aktuell:
resources/migrations/01-restore.shresources/migrations/02-restrictStatVisibility.shresources/migrations/03-migrateConstraintsOnPartitionedTables.sh
Reihenfolge und Konventionen
- Skripte als
NN-beschreibung.shbenennen (01-...,02-..., ...). - Skripte idempotent bauen (mehrfaches Ausführen darf nicht schaden).
- Abschlussmarker in der Dogu-Config setzen (z. B.
restricted_stat_visibility=true), damit Schritte nur einmal laufen. - Immer mit
set -o errexit -o nounset -o pipefailarbeiten.