Une alternative au mode de standby intégré décrit dans les sections précédentes
est d'utiliser une restore_command
qui scrute le dépôt d'archives.
C'était la seule méthode disponible dans les versions 8.4 et inférieures. Dans cette configuration,
positionnez standby_mode
à off, parce que vous implémentez la scrutation nécessaire
au fonctionnement standby vous-mêmes. Voir le module pg_standby pour
une implémentation de référence de ceci.
Veuillez noter que dans ce mode, le serveur appliquera les WAL fichier par fichier,
ce qui entraîne que si vous requêtez sur le serveur de standby (voir Hot Standby),
il y a un délai entre une action sur le primaire et le moment où cette action
devient visible sur le standby, correspondant au temps nécessaire à
remplir le fichier de WAL. archive_timeout
peut être utilisé pour rendre ce délai
plus court. Notez aussi que vous ne pouvez combiner la streaming replication avec cette méthode.
Les opérations qui se produisent sur le primaire et les serveurs de standby sont des opérations normales d'archivage et de recovery. Le seul point de contact entre les deux serveurs de bases de données est l'archive de fichiers WAL qu'ils partagent : le primaire écrivant dans l'archive, le standby lisant de l'archive. Des précautions doivent être prises pour s'assurer que les archives WAL de serveurs primaires différents ne soient pas mélangées ou confondues. L'archive n'a pas besoin d'être de grande taille si elle n'est utilisée que pour le fonctionnement de standby.
La magie qui permet aux deux serveurs faiblement couplés de fonctionner ensemble est
une simple restore_command
utilisée sur le standby qui
quand on lui demande le prochain fichier de WAL, attend que le primaire le mette
à disposition. La restore_command
est spécifiée dans le
fichier recovery.conf
sur le serveur de standby. La récupération normale
demanderait un fichier de l'archive WAL, en retournant un échec si le
fichier n'était pas disponible. Pour un fonctionnement en standby, il est normal que
le prochain fichier WAL ne soit pas disponible, ce qui entraîne que le standby doive attendre
qu'il apparaisse. Pour les fichiers se terminant en
.history
il n'y a pas besoin d'attendre, et un code retour
différent de zéro doit être retourné. Une restore_command
d'attente
peut être écrite comme un script qui boucle après avoir scruté l'existence du prochain fichier de WAL.
Il doit aussi y avoir un moyen de déclencher la bascule, qui devrait interrompre la
restore_command
, sortir le la boucle et retourner une erreur file-not-found
au serveur de standby. Cela met fin à la récupération et le standby démarrera alors comme un serveur normal.
Le pseudocode pour une restore_command
appropriée est:
triggered = false; while (!NextWALFileReady() && !triggered) { sleep(100000L); /* wait for ~0.1 sec */ if (CheckForExternalTrigger()) triggered = true; } if (!triggered) CopyWALFileForRecovery();
Un exemple fonctionnel de restore_command
d'attente est fournie
par le module pg_standby. Il
devrait être utilisé en tant que référence, comme la bonne façon d'implémenter correctement la logique
décrite ci-dessus. Il peut aussi être étendu pour supporter des configurations et des
environnements spécifiques.
La méthode pour déclencher une bascule est une composante importante de la
planification et de la conception. Une possibilité est d'utiliser la
commande restore_command
. Elle est exécutée une fois
pour chaque fichier WAL, mais le processus exécutant la restore_command
est créé et meurt pour chaque fichier, il n'y a donc ni démon ni processus serveur, et
on ne peut utiliser ni signaux ni gestionnaire de signaux. Par conséquent, la
restore_command
n'est pas appropriée pour déclencher la bascule.
Il est possible d'utiliser une simple fonctionnalité de timeout, particulièrement
si utilisée en conjonction avec un paramètre archive_timeout
sur le primaire. Toutefois, ceci est sujet à erreur, un problème réseau
ou un serveur primaire chargé pouvant suffire à déclencher une bascule. Un système
de notification comme la création explicite d'un fichier trigger est idéale, dans la
mesure du possible.
La procédure simplifié pour configurer un serveur de test en utilisant cette méthode alternative est la suivante. Pour tous les détails sur chaque étape, référez vous aux sections précédentes suivant les indications.
Paramétrez les systèmes primaire et standby de façon aussi identique que possible, y compris deux copies identiques de PostgreSQL au même niveau de version.
Activez l'archivage en continu du primaire vers un répertoire d'archives WAL sur le serveur de standby. Assurez vous que archive_mode, archive_command et archive_timeout sont positionnés correctement sur le primaire (voir Section 25.3.1).
Effectuez une sauvegarde de base du serveur primaire( voir Section 25.3.2), , et chargez ces données sur le standby.
Commencez la récupération sur le serveur de standby à partir de l'archive WAL locale,
en utilisant un recovery.conf
qui spécifie une
restore_command
qui attend comme décrit
précédemment (voir Section 25.3.4).
Le récupération considère l'archive WAL comme étant en lecture seule, donc une fois qu'un fichier WAL a été copié sur le système de standby il peut être copié sur bande en même temps qu'il est lu par le serveur de bases de données de standby. Ainsi, on peut faire fonctionner un serveur de standby pour de la haute disponibilité en même temps que les fichiers sont stockés pour de la reprise après sinistre.
À des fins de test, il est possible de faire fonctionner le serveur primaire et de standby sur le même système. Cela n'apporte rien en termes de robustesse du serveur, pas plus que cela ne pourrait être décrit comme de la haute disponibilité.
Il est aussi possible d'implémenter du log shipping par enregistrements en utilisant cette méthode alternative, bien qu'elle nécessite des développements spécifiques, et que les modifications ne seront toujours visibles aux requêtes de hot standby qu'après que le fichier complet de WAL ait été recopié.
Un programme externe peut appeler la fonction pg_walfile_name_offset()
(voir Section 9.26) pour obtenir le nom de fichier et la position exacte
en octets dans ce fichier de la fin actuelle du WAL. Il peut alors accéder au fichier WAL directement
et copier les données de la fin précédente connue à la fin courante vers les serveurs de standby.
Avec cette approche, la fenêtre de perte de données est la période de scrutation du programme de copie,
qui peut être très petite, et il n'y a pas de bande passante gaspillée en forçant l'archivage
de fichiers WAL partiellement remplis. Notez que les scripts restore_command
des serveurs de standby ne peuvent traiter que des fichiers WAL complets, les données copiées
de façon incrémentale ne sont donc d'ordinaire pas mises à disposition des serveurs de standby.
Elles ne sont utiles que si le serveur primaire tombe -- alors le dernier fichier WAL partiel
est fourni au standby avant de l'autoriser à s'activer. L'implémentation correcte de ce
mécanisme requiert la coopération entre le script restore_command
et
le programme de recopie des données.
À partir de PostgreSQL version 9.0, vous pouvez utiliser la streaming replication (voir Section 26.2.5) pour bénéficier des mêmes fonctionnalités avec moins d'efforts.