Re: vacuum full et hot standby WAL stream: FATAL

From: CRUMEYROLLE Pierre <pierre(dot)crumeyrolle(at)c-s(dot)fr>
To: Dimitri Fontaine <dim(at)tapoueh(dot)org>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: vacuum full et hot standby WAL stream: FATAL
Date: 2016-05-29 21:51:21
Message-ID: 20160529235121.Horde.iVRAuWl2hkaq9gsKe52Sfg9@messagerie.si.c-s.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Ok merci pour ce précisions

c'est quoi une version moderne de PostgreSQL ?

c'est quoi une configuration correcte de l'autovacuum ?

Dimitri Fontaine <dim(at)tapoueh(dot)org> a écrit :

> Bonjour à tous,
>
> Avant de commencer ma réponse, point vocabulaire : dans l'écosystème
> PostgreSQL nous avons choisi d'arrêter les références directes à des
> périodes historiques sombres et nous parlons de serveurs primaires et
> secondaires (primary et standby en anglais), ou bien de réplica.
>
> De plus, je n'ai jamais entendu d'histoire dans laquelle la défaillance
> d'un maître aurait pour conséquence l'élection d'un esclave afin de le
> remplacer.
>
> À la rigueur, nous pourrions parler de Reine et de Princesse : nous
> savons tous que le rôle de la Princesse est de prendre le relais de la
> Reine le jour venu.
>
>
> CRUMEYROLLE Pierre <pierre(dot)crumeyrolle(at)c-s(dot)fr> writes:
>>> par contre je n'ai pas trouvé comment m'affranchir du vacuum full , si ya
>>> une solution je suis preneur.
>
> Avec une version moderne de PostgreSQL et une configuration correcte de
> l'autovacuum, les cas où le VACUUM FULL sont nécessaires sont supposés
> être extrêmement rare. En effet, il s'agit d'une réécriture complète des
> données et des indexes sur disque. Lire avec soin la documentation :
>
> https://www.postgresql.org/docs/9.1/static/routine-vacuuming.html
>
>> si j'en crois l'extract ci dessous
>> réplication synchrone => il n'y a pas de risque de perte de données au
>> moment d'une bascule du maître ;
>
> Ceci est un mythe : il y a *toujours* un risque de perte de données au
> moment d'une bascule du primaire. Pour éviter ce risque il est possible
> (très rarement souhaitable, cependant) d'implémenter le Two-Phase
> Commit, beaucoup plus lourd mais qui offre de meilleures garanties.
> Revenons à nos moutons.
>
>
> Prenons pour comprendre le cas simple d'un serveur PostgreSQL unique. Le
> standard SQL requière l'implémentation des transactions via les
> commandes START TRANSACTION, COMMIT et ROLLBACK.
>
> Lorsque l'application envoie une demande de COMMIT de la transaction en
> cours, il s'agit d'une demande. Deux réponses sont alors possibles de la
> part du serveur : COMMIT si tout c'est bien passé, ROLLBACK sinon.
>
> Voyons cela avec un exemple très facile à reproduire, puisqu'il suffit
> de provoquer n'importe quelle erreur au sein de la transaction afin de
> constater un échange COMMIT/ROLLBACK :
>
> pgloader# \set ON_ERROR_ROLLBACK off
> pgloader# begin;
> BEGIN
> pgloader*# select 1/0;
> ERROR: 22012: division by zero
> pgloader*# commit;
> ROLLBACK
>
> Dans un environnement de production on peut s'attendre à observer ce
> genre de scénario le plus souvent lors du fameux « no space left on
> device ».
>
> Maintenant que nous comprenons mieux le protocole de validation d'une
> transaction, reprenons le sujet du risque de pertes de données au moment
> d'une bascule.
>
> Le fonctionnement de la réplication PostgreSQL permet de choisir un
> comportement soit synchrone soit asynchrone dans chaque transaction de
> manière indépendante.
>
> - en mode asynchrone le serveur primaire réalise le COMMIT et répond
> dès que possible le message de succès au client ;
>
> - en cas d'échec de COMMIT de la transaction, le message ROLLBACK est
> systématiquement renvoyé directement au client ;
>
> - en mode synchrone le serveur primaire réalise le COMMIT en local
> puis attend un retour positif de la part d'au moins un serveur
> secondaire avant de répondre au client.
>
> Dans la version PostgreSQL 9.6 il est possible de mettre en place un
> Quorum et de faire attendre le retour de plusieurs serveurs secondaires
> avant de répondre au client.
>
>
> Ce qui doit être très clair est le point suivant : avec un seul serveur
> PostgreSQL déjà, l'application doit être consciente qu'il ne suffit pas
> d'envoyer un message COMMIT pour sécuriser son activité, il faut valider
> que le retour de ce message est également un COMMIT.
>
> Si jamais le serveur PostgreSQL unique venait à planter sournoisement
> après l'envoi du message COMMIT mais *avant* d'avoir pu y répondre,
> alors il est *imposible* pour l'application de savoir si sa transaction
> est sécurisée sur le serveur ou bien perdue à tout jamais.
>
> Ce scénario d'incertitude existe déjà avec un simple serveur SQL,
> et quelque soit le moteur utilisé car cela vient de l'architecture
> client / serveur et du protocole utilisé et défini par le standard.
>
> Maintenant, dans le cas d'une réplication synchrone et dans le scénario
> où l'on choisit de basculer vers le serveur secondaire, la même
> incertitude existe : il reste possible que l'application ait envoyé un
> ou plusieurs messages COMMIT pour lesquels elle n'a pas reçu de retour.
> Peut être que le travail de sécurisation des données de la transaction
> n'est pas terminé sur le primaire, ou bien peut être que le primaire a
> pu faire son travail et attend maintenant un retour du secondaire.
> Lequel a peut être terminé d'enregistrer les données mais n'a pas eu le
> temps d'en faire un retour au primaire au moment de la bascule. Ou bien
> peut être même que le message de retour est parti mais pas encore reçu,
> soit par le primaire, soit relayé par le primaire mais pas encore reçu
> par l'application.
>
> Ou bien plus simplement, peut être que le COMMIT a eu lieu sur le
> primaire mais que les données ne sont pas encore arrivées sur le
> secondaire, ou bien que le secondaire n'a pas encore eu le temps de les
> sécuriser au moment de la bascule.
>
>
> Il n'y a pas de magie, des électrons sont attendus qui se déplacent au
> mieux à la vitesse de la lumière. La capacité de traitement de ces
> électrons est relativement limitée.
>
>
> Il y a *toujours* un risque de perte de données au moment d'une bascule
> du primaire vers un secondaire, que la réplication soit synchrone ou
> asynchrone.
>
>
> Bien à vous,
> --
> dim

--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Dimitri Fontaine 2016-05-30 09:40:39 Re: vacuum full et hot standby WAL stream: FATAL
Previous Message Dimitri Fontaine 2016-05-29 12:10:05 Re: vacuum full et hot standby WAL stream: FATAL