Re: vacuum full et hot standby WAL stream: FATAL

CRUMEYROLLE Pierre <[email protected]>
Newsgroups gmane.comp.db.postgresql.french
Message-ID <20160529235121.Horde.iVRAuWl2hkaq9gsKe52Sfg9@messagerie.si.c-s.fr>
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 <[email protected]> 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 <[email protected]> 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 ([email protected])
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.