La production de réplication PostgreSQL est-elle prête?

16

Comment la réplication native PostgreSQL se compare-t-elle à MySQL?

Je sais que la réplication asynchrone est prise en charge depuis plus longtemps que la synchronisation, qui est récente. Le synchrone est-il fiable pour être utilisé dans des projets réels?

SrgHartman
la source

Réponses:

31

Prêt pour la production?

Oui, il est prêt pour la production et largement utilisé. Les adeptes de Heroku sont basés sur la réplication asynchrone intégrée de PostgreSQL par exemple, tout comme les standbys AWS RDS et les réplicas en lecture. La réplication en streaming est utilisée presque universellement avec PostgreSQL.

La configuration de la réplication n'est pas vraiment charmante, mais des outils comme repmgr aident quelque peu à cela, et s'améliorent lentement avec chaque version majeure. La possibilité pour pg_basebackup de prendre une copie du système en utilisant la réplication en streaming (et de le faire à partir d'un autre standby) est d'une grande aide.

En général, une fonctionnalité ne sera tout simplement pas publiée dans PostgreSQL tant qu'elle n'est pas prête pour la production. Les bugs se produisent, comme dans tout logiciel, mais ils sont généralement corrigés peu de temps après leur identification. Les nouvelles fonctionnalités vraiment majeures ont parfois des bogues et des problèmes découverts après la version .0, mais dans ce cas, les corriger est une priorité élevée; les bugs ne sont pas seulement laissés pour compte.

Je ne suis au courant d'aucun problème sérieux avec la réplication en streaming - synchronisation ou async - et je n'en ai vu aucun signalé depuis un bon moment. Ils étaient moins stables que la norme habituelle de Pg dans les versions .0 des principales versions dans lesquelles ils ont été introduits, mais les deux ont mûri rapidement et sont parfaitement prêts pour la production.

(Mise à jour: il y avait un bogue spécifique dans la nouvelle version 9.3 avant 9.3.4 qui a causé des problèmes de réplication dans certains cas; les utilisateurs de 9.3 devraient mettre à jour vers 9.3.4 immédiatement. Les versions plus anciennes ne sont pas affectées.)

La seule mise en garde que je veux mentionner est un détail mineur avec la réplication synchrone: si vous vous engagez sur le maître, puis annulez la requête après qu'elle se soit validée en attendant que la réplique soit confirmée, elle est traitée comme validée sur le maître avant même sa réplication. Vous obtenez le même effet en redémarrant le maître en attendant que la réplique réponde. Dans la pratique, cela n'est pas pertinent, mais c'est à peu près le seul problème auquel je peux penser.

Comparer avec MySQL?

La réplication native de Pg est assez différente de celle de MySQL.

MySQL utilise la réplication logique où il envoie les modifications logiques apportées aux données de la table, à la structure de la table, etc., et la réplique applique ces modifications.

La réplication de PostgreSQL est de niveau inférieur (en 9.5 et en dessous; les futures versions pourraient également ajouter une réplication logique). Il envoie les blocs qui ont changé dans les tableaux. C'est plus simple, plus facile à obtenir et impose une charge moindre sur le serveur de réplique, mais consomme plus de bande passante réseau et nécessite plus de stockage sur le maître pour contenir les modifications non encore répliquées. Il est préférable de le configurer pour utiliser la réplication en streaming avec repli d'archivage WAL, ce qui le rend plus complexe à configurer que celui de MySQL. Il réplique les changements de bas niveau comme l'activité VACUUM, pas seulement les changements de tuple, en gardant l'état sur disque de la réplique identique à celui du maître. Il est incapable de répliquer une seule base de données; l'ensemble du système doit être répliqué, ce qui peut être frustrant si vous avez une grande base de données à taux de désabonnement élevé et sans importance et une petite base de données à faible taux de désabonnement et vitale.

Dans l'ensemble, cela dépend de ce que vous voulez en faire.

Je considère la réplication de PostgreSQL comme considérablement meilleure pour les répliques utilisées pour la sauvegarde, la haute disponibilité et la reprise après sinistre. Cela est particulièrement vrai lorsqu'il est combiné avec une récupération ponctuelle (PITR) .

D'un autre côté, ce n'est pas aussi bon pour les réplicas de rapports en lecture seule, car la nécessité de retarder l'application des données répliquées lors de l'exécution de transactions longues signifie que vous devez soit le laisser annuler de très longues requêtes en cours d'exécution, soit prendre beaucoup de retard sur le maître, consommant plus d'espace disque sur le maître et le forçant à travailler plus fort pour suivre.

Des travaux sont en cours pour activer la réplication logique dans PostgreSQL , où les modifications logiques de la structure de la table, du contenu de la table, etc. sont répliquées, plutôt que leur état sur disque. La conception du catalogue de Pg et la prise en charge de tout ce qui est défini par l'utilisateur rend cette tâche assez complexe. Une partie du travail préparatoire a été mise en place pour la version 9.4, mais il est peu probable que la réplication logique complète soit utilisable avant la version 9.6 ou ultérieure.

Craig Ringer
la source
Excellente réponse à une question que j'avais également. Merci Craig.
swasheck
6
Il y a une chose à propos de la synchronisation qui représente certains utilisateurs, mais qui a vraiment du sens si vous y réfléchissez: la validation d'une transaction qui est sujette à la réplication synchrone ne reviendra pas tant que la transaction n'aura pas été persistée sur au moins un cluster en plus du maître . Les personnes provenant d'autres systèmes estiment que cela devrait se produire à moins que la tentative de réplication ne prenne trop de temps , ce qui signifierait «c'est synchrone à moins que ce ne soit pas le cas», ce qui n'est pas une garantie acceptable pour la communauté PostgreSQL. Utilisez plusieurs cibles de synchronisation pour éviter un blocage si la réplique échoue, ou utilisez async.
kgrittn
1
@kgrittn Bon point concernant plusieurs cibles. Je suis légèrement horrifié que quiconque souhaite / s'attende à ce que l'engagement revienne avant que la transaction ne soit répliquée dans la réplication synchrone ; sonne comme s'ils voulaient vraiment la réplication asynchrone avec une limite d'écart de suiveur maximale qui suspend les écritures sur le maître jusqu'à ce que les suiveurs rattrapent suffisamment? Une chose parfaitement raisonnable à vouloir, mais pas de synchronisation.
Craig Ringer
1
@CraigRinger: Ce que j'ai vu des gens demander n'est pas tout à fait ce que vous avez dit, ils demandent parfois "Utiliser la synchronisation synchro mais retombe automatiquement sur la synchronisation asynchrone si la synchronisation prend trop de temps." Donc, ils ne veulent pas suspendre le maître s'il se situe trop loin derrière la réplique - c'est exactement le cas où ils veulent qu'il confirme les validations rapidement , sans aucune écriture sur un autre site. Pour moi, cela ressemble à un cas de promesse de plus que ce qui est livré. Ils veulent à l'avance "Ouais, vous avez un représentant de synchronisation; vous êtes en sécurité." et après un crash "Ces données validées ont disparu; elles n'étaient pas vraiment écrites ailleurs."
kgrittn
@CraigRinger peut-être le mettre à jour avec pg10 / logique?
Evan Carroll