pg rewind¶
Warning
Cette documentation est un travail en cours
Introduction¶
Pg_rewind(https://docs.postgresql.fr/current/app-pgrewind.html) est un outil introduit dans PostgreSQL 9.5.
Il permet de synchroniser le répertoire de données de PostgreSQL dans un autre répertoire de données copié à partir de celui-ci.
Cette fonctionnalité est particulièrement utile lorsque vous souhaitez resynchroniser une ancienne instance primaire à partir de la nouvelle instance primaire fraîchement promue. C’est une action nécessaire après une bascule sur incident (failover), afin de pouvoir réintroduire l’ancienne instance primaire dans la réplication en tant qu’instance secondaire.
L’avantage de pg_rewind par rapport à une copie de fichiers classique (par exemple avec rsync
) est qu’il ne relit pas les blocs non modifiés de l’instance. Il est donc particulièrement efficace quand les deux instances n’ont pas beaucoup divergé, car le volume de blocs à synchroniser sera faible..
Fonctionnement¶
L’idée de base est de copier toutes les modifications de fichiers au niveau système de fichiers de l’instance source (celle qui sert de référence) vers l’instance cible (celle que l’on veut resynchroniser, par exemple l’ancienne instance primaire) :
- Parcourir les journaux de transactions de l’instance cible, en commençant du dernier checkpoint avant le moment où l’historique de timeline de l’instance source a dévié de celle de l’instance cible. Pour chaque enregistrement dans les journaux de transactions, enregistrer chaque bloc de données modifié. Ceci a pour résultat une liste de tous les blocs de données modifiés dans l’instance cible, après la séparation avec l’instance source.
- Copier tous les blocs modifiés de l’instance source vers l’instance cible, soit en utilisant un accès direct au système de fichiers (
--source-pgdata
) soit en SQL (--source-server
). - Copier tous les autres fichiers, tels que pg_xact et les fichiers de configuration de l’instance source vers l’instance cible (sauf les fichiers des relations).
- Appliquer les enregistrements des journaux de transactions provenant de l’instance source, en commençant à partir du checkpoint créé au moment du failover. (En fait, pg_rewind n’applique pas les journaux de transactions. Il crée simplement un fichier
backup_label
qui fera en sorte que PostgreSQL démarre en rejoutant les enregistrements des journaux de transactions à partir de ce checkpoint.)
Important
Lorsque pg_rewind est lancé, les fichiers de configuration tels que postgresql.conf
et recovery.conf
seront écrasées dans le répertoire PGDATA
de la source cible.<!–
Note
Il est possible d’utiliser l’option --dry-run
ou -n
de pg_rewind
afin d’exécuter la commande sans effectuer aucune modification et vérifier que la procédure se déroule correctement.
Prérequis¶
Avant d’utiliser l’outil pg_rewind
, il est nécessaire de vérifier certains prérequis :
- L’instance primaire doit soit être initialisée avec l’option
--data-checksums
deinitdb
(https://docs.postgresql.fr/current/app-initdb.html#app-initdb-data-checksums), soit avoir le paramètrewal_log_hints
(https://docs.postgresql.fr/current/runtime-config-wal.html#guc-wal-log-hints) dans le fichierpostgresql.conf
avant que les instances aient divergé. - Activer le paramètre full_page_writes(https://docs.postgresql.fr/current/runtime-config-wal.html#guc-full-page-writes) dans le fichier
postgresql.conf
avant que les instances aient divergé. - “cible”: L’instance doit être arrêtée proprement.
- “cible”: tous les fichiers WAL compris entre le point de divergence et l’arrêt de l’instance doivent être accessibles.
- “source”: si l’option
--source-pgdata
est utilisée, l’instance doit être arrêtée proprement. - “source”: si l’option
--source-server
est utilisée, l’instance doit être démarrée en tant que primaire (pas en mode recovery), et la connexion doit être faite par un super-utilisateur.