Restauration
Procédure pour restaurer une base de données CNPG Kubernetes
Les différentes méthodes pour restaurer une base CNPG sont décrites ici ici.
La procédure classique que nous devrions tester en priorité est celle-ci :
-
Lister les backups
kubectl get backups.postgresql.cnpg.io -n namespace
-
Restaurer la base depuis le dernier backup listé ci-dessus
https://cloudnative-pg.io/documentation/1.20/recovery/#recovery-from-a-backup-object
Procédure d’urgence pour restaurer une base de données CNPG Kubernetes avec une seul réplicat en état Pending
Une fois que vous avez essayé toutes les méthodes standard indiquées ici pour restaurer votre base, mais que rien ne fonctionne, voici une méthode qui consiste à récupérer les données depuis le PVC
du dernier réplicat encore vivant pour en extraire localement ensuite un dump propre a restaurer ensuite sur une instance CNPG vierge.
Étapes
-
Copier les données du volume PVC
Récupérez les données du répertoire PostgreSQL à l’aide de
kubectl cp
:kubectl cp mydb-1:/var/lib/postgresql/data . sudo chown -R 26:26 ./data
-
Supprimer le fichier
custom.conf
Localisez et supprimez le fichier suivant dans les données copiées :
rm data/pgdata/custom.conf
-
Lancer un conteneur PostgreSQL pour récupération
Montez les données et démarrez un conteneur de récupération, prendre garde à utiliser la même version de postgresql :
docker run -n recovery -i -t --rm \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -e POSTGRES_HOST_AUTH_METHOD=trust \ -v $(pwd)/data:/var/lib/postgresql/data \ docker.tedomum.net/tedomum/cloudnative-pg/postgresql:16.1
-
Créer un dump PostgreSQL
Une fois le conteneur lancé, exportez les données avec
pg_dump
:docker exec recovery pg_dump -Fc -d app > app.dump
-
Supprimer le cluster PostgreSQL défectueux Supprimez le cluster défaillant :
kubectl delete clusters.postgresql.cnpg.io mydb
-
S’assurer que l’application utilisant la base est scale à zero
kubectl scale --replicas 0 deployment -n namespace myapp
-
Recréer un cluster vide avec ArgoCD
Synchronisez ArgoCD pour recréer le cluster vide :
En Clic-clic dans l’interface argocd, ou via la CLI que nous ne supportons pas pour le moment.
argocd app sync <nom-de-l'application>
-
Restaurer les données à partir du dump
Importez le dump dans le nouveau cluster :
kubectl exec -n <namespace> -i mydb-1 -c postgres -- \ pg_restore --no-owner --role=app -d app --verbose < app.dump
-
Autoriser l’écrasement des sauvegardes précédentes
Ajoutez une annotation pour permettre au cluster de remplacer les sauvegardes précédentes :
kubectl annotate clusters.postgresql.cnpg.io -n <namespace> mydb cnpg.io/skipEmptyWalArchiveCheck=enabled
-
S’assurer que l’application utilisant la base est scale à son nombre de replica attentu
kubectl scale --replicas 1 deployment -n namespace myapp
-
Faire le ménage en local, si tous va bien
docker rm -f recovery # rm -rf ./data, seulement si on est certain d'avoir sauver la base !
Notes
- Remplacez
<namespace>
par le namespace de votre cluster. - Attention a la version de postgresql.
- Assurez-vous que les permissions d’accès aux PVC et les configurations de votre environnement sont correctes, sans ça postgres ne démarre pas.