PostgreSQLLa base de données la plus sophistiquée au monde.

46.4. Protocole de réplication en continu

Pour initier la réplication en flux continu, le client envoi le paramètre replication dans son message d'ouverture. Il indique au serveur de se placer en mode walsender dans lequel en petit ensemble de commandes de réplication peuvent être utilisées à la place d'ordres SQL. Dans le mode walsender, seul le protocole de requête simple est disponible. Les commandes acceptées en mode walsender sont:

IDENTIFY_SYSTEM

Demande au serveur de s'identifier. Le serveur répond avec un set de résultat d'une seule ligne contenant deux champs:

systemid

L'identifiant système unique du cluster. Il peut être utilisé pour vérifier que la base de sauvegarde utilisée pour initialiser le serveur en attente provient du même cluster.

timeline

TimelineID courant. Tout aussi utile pour vérifier que le serveur en attente est consistant avec le maître.

START_REPLICATION XXX/XXX

Demande au serveur de débuter l'envoi de WAL en continu, en commençant à la position XXX/XXX dans le WAL. Le serveur peu répondre avec une erreur, par exemple si la section de WAL demandée a déjà été recyclée. En cas de succès, le serveur répond avec un message CopyOutResponse et débute l'envoi en continu de WAL au client. Les WAL seront envoyé en continu jusqu'à ce que la connexion soit interrompue ; aucune autre commande ne sera acceptée.

Les données des WAL sont envoyées en une série de messages CopyData (ce qui permet d'envoyer d'autre informations dans les intervalles ; en particulier un serveur peut envoyer un message ErrorResponse s'il rencontre une erreur après la début de l'envoi en continu des données). Le contenu de chaque message CopyData suit le format suivant:

XLogData (B)
Byte1('w')

Identifie le message comme une donnée de WAL.

Byte8

Le point de départ de la donnée du WAL dans ce message, donné au format XLogRecPtr.

Byte8

Le fin courante du WAL sur le serveur, donné au format XLogRecPtr

Byte8

L'horloge système du serveur à l'heure de la transmission, donné au format TimestampTz.

Byten

Une section de donnée du flux de WAL.

Une entrée de WAL n'est jamais découpée dans deux messages CopyData. Cependant, lorsqu'une entrée bute sur la fin d'une page de WAL, et est par conséquent divisée en utilisant des enregistrements de suite, elle peut être divisée sur la fin de la page. En d'autre terme, le premier enregistrement principal et les autres de suite peuvent êtres envoyés dans différents messages CopyData.

À noter que tous les champs à l'intérieur d'une donnée de WAL et les entêtes décrites précédemment seront envoyés au format natif du serveur. L'endianisme et le format de timestamp ne sont pas prévsible à moins que le receveur ait vérifié que l'identifiant système de l'émeteur corresponde au contenu de son propre pg_control.

Si le processus d'émission de WAL se termine correctement (pendant l'arrêt du postmaster), il enverra un message CommandComplete avant de s'arrêter. Ce message pourrait évidement ne pas être envoyé en cas d'arrêt brutal.