Réplication de certaines tables d'une base de données PostgreSQL vers une autre

9

J'ai la situation suivante: j'ai trois machines exécutant des bases de données postgresql. Une machine contient des informations de compte client (appelez cette machine C), les deux autres machines contiennent des informations de journalisation client (appelez ces L1 et L2). La raison du fractionnement est de séparer le chargement sur plusieurs machines (donc certains clients envoient des informations de journalisation à L1, d'autres à L2 ... et peut-être un certain temps L3, L4, ...).

Lors de la récupération des informations de journalisation, en principe, j'aimerais pouvoir JOINDRE entre les tables de journalisation sur Ln et les tables de compte client sur C. En réalité, je ne peux pas faire de JOIN comme ceci (et même si je le pouvais, je voudrais pour éviter de charger C).

Ma pensée est de répliquer les tableaux sur C sur chacun de L1, L2, ... afin que je puisse faire les jointures. En ce qui concerne les tables de C, C est maître et L1, L2, ... sont esclaves. Mais pour les autres tableaux de L1, L2, ... ces machines sont des maîtres. Ce n'est pas exactement la réplication maître-maître, et n'est-ce pas exactement maître-esclave.

La réplication postgres (j'utilise la version 9.1) peut-elle être persuadée de le faire, ou s'il n'y a pas d'autres packages qui feraient le travail. En dernier recours, je peux écrire du code pour synchroniser périodiquement les tables (je peux tolérer un certain retard), mais ce serait bien de ne pas le faire!

Merci d'avance.


la source
1
Peut-être utiliser FDW sur les machines de journalisation pour accéder à C? Bien que cela entraînerait un impact sur les performances de C. Les vues matérialisées pourraient réduire l'impact sur les performances, mais je ne sais pas exactement comment PostgreSQL détecte les mises à jour de la table étrangère. S'il le fait automatiquement (ce que semble suggérer la fin de la documentation de la vue matérialisée), cela peut résoudre entièrement votre problème. Ce sont cependant des fonctionnalités de 9.3. La liste de diffusion très active pourrait également être utile.
jpmc26

Réponses:

4

Sur PostgreSQL 9.3, vous pouvez utiliser postgres_fdwpour interroger de manière transparente la table étrangère sur l'autre machine.

Sur les anciennes versions, dblinkpeut être une option comme mentionné par Andrew.

Une autre option consiste à utiliser un outil comme Londiste ou Slony-I pour reproduire les tables que vous souhaitez. Je recommande d'utiliser Londiste pour cela, ça va être beaucoup plus simple. Il crée des déclencheurs sur la table pour détecter l'insertion / la mise à jour / la suppression, et les réplique en utilisant son propre client / serveur et un système de mise en file d'attente vers l'autre base de données, où il effectue l'insertion / la mise à jour / la suppression correspondante. Je l'utilise en production sur plusieurs sites clients et ça marche très bien.

Une future option (si tout va bien dans PostgreSQL 9.5) sera la réplication logique de streaming de journaux, l'extraction de modifications logiques et la réplication bidirectionnelle, qui permettront de répliquer des bases de données ou des tables individuelles au niveau SQL. Une partie du travail a été consacrée à PostgreSQL 9.4, mais pas assez pour le rendre utile pour ce que vous voulez faire.

Craig Ringer
la source
3

Vous devez utiliser des dblinks et des vues matérialisées pour y parvenir. Les deux fonctionnalités sont intégrées aux dernières versions de Postgres:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

Essentiellement, vous créez un Mview sur chaque base de données L1, L2 ... avec des données extraites des tables sur C, puis utilisez l'actualisation Mview pour mettre à jour périodiquement les Mviews aussi souvent que nécessaire. Les données sont stockées localement, leur accès est donc très rapide. Cela ne convient que si les données sont relativement statiques et que cela ne vous dérange pas que les bases de données locales aient parfois des informations légèrement obsolètes. Vous devez définir les fréquences de rafraîchissement pour gérer cela de manière appropriée, et si cela n'est pas acceptable, vous devez simplement utiliser un lien de base de données et gérer la lenteur qui en résulte.

Si vous avez besoin de fonctionnalités supplémentaires, le projet d'instantanés fournit des fonctionnalités avancées telles que des actualisations rapides et des journaux d'instantanés:

http://pgfoundry.org/projects/snapshot/

Avec cela, vous pouvez uniquement actualiser les lignes qui nécessitent une mise à jour, ce qui peut les rendre extrêmement rapides pour les grands ensembles de données inélastiques, minimisant ainsi les perturbations de votre application. Par défaut, Mviews sont complètement supprimés et recréés dans Postgres, ce qui peut être très mauvais pour les performances pour des raisons évidentes.

Andrew Brennan
la source